Skip to content

Commit 59e2fbd

Browse files
committed
Better handling of files with no signature.
If the file lacks an Authenticode signature each rule is guaranteed to fail.
1 parent cbfc52d commit 59e2fbd

8 files changed

+37
-22
lines changed

AuthenticodeLint/CheckEngine.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,24 @@ public RuleEngineResult RunAllRules(string file, Graph<SignerInfo> signatures, L
3838
{
3939
RuleResult result;
4040
var verboseWriter = verbose ? new VerboseSignatureLogger() : SignatureLoggerBase.Null;
41-
if (suppressedRuleIDs.Contains(rule.RuleId))
41+
if (signatures.Items.Count == 0)
4242
{
43-
result = RuleResult.Skip;
43+
result = RuleResult.Fail;
44+
verboseWriter.LogMessage("File is not Authenticode signed.");
4445
}
4546
else
4647
{
47-
result = rule.Validate(signatures, verboseWriter);
48-
if (result != RuleResult.Pass)
48+
if (suppressedRuleIDs.Contains(rule.RuleId))
4949
{
50-
engineResult = RuleEngineResult.NotAllPass;
50+
result = RuleResult.Skip;
51+
}
52+
else
53+
{
54+
result = rule.Validate(signatures, verboseWriter);
55+
if (result != RuleResult.Pass)
56+
{
57+
engineResult = RuleEngineResult.NotAllPass;
58+
}
5159
}
5260
}
5361
collectors.ForEach(c => c.CollectResult(rule, result, verboseWriter.Messages));

AuthenticodeLint/ConfigurationValidator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public static bool ValidateAndPrint(CheckConfiguration configuration, TextWriter
3838
{
3939
if (!File.Exists(path))
4040
{
41-
printer.WriteLine($"The input path ${path} does not exist.");
41+
printer.WriteLine($"The input path {path} does not exist.");
4242
success = false;
4343
}
4444
}

AuthenticodeLint/Rules/NoWeakFileDigestAlgorithmsRule.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ public RuleResult Validate(Graph<SignerInfo> graph, SignatureLoggerBase verboseW
1818
{
1919
if (signature.DigestAlgorithm.Value == KnownOids.MD2)
2020
{
21-
verboseWriter.LogMessage(signature, $"Uses the {nameof(KnownOids.MD2)} digest algorithm.");
21+
verboseWriter.LogSignatureMessage(signature, $"Uses the {nameof(KnownOids.MD2)} digest algorithm.");
2222
result = RuleResult.Fail;
2323
}
2424
else if (signature.DigestAlgorithm.Value == KnownOids.MD4)
2525
{
26-
verboseWriter.LogMessage(signature, $"Uses the {nameof(KnownOids.MD4)} digest algorithm.");
26+
verboseWriter.LogSignatureMessage(signature, $"Uses the {nameof(KnownOids.MD4)} digest algorithm.");
2727
result = RuleResult.Fail;
2828
}
2929
else if (signature.DigestAlgorithm.Value == KnownOids.MD5)
3030
{
31-
verboseWriter.LogMessage(signature, $"Uses the {nameof(KnownOids.MD5)} digest algorithm.");
31+
verboseWriter.LogSignatureMessage(signature, $"Uses the {nameof(KnownOids.MD5)} digest algorithm.");
3232
result = RuleResult.Fail;
3333
}
3434
}

AuthenticodeLint/Rules/PublisherInformationRule.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,24 @@ public RuleResult Validate(Graph<SignerInfo> graph, SignatureLoggerBase verboseW
2929
if (info == null)
3030
{
3131
result = RuleResult.Fail;
32-
verboseWriter.LogMessage(signature, "Signature does not have any publisher information.");
32+
verboseWriter.LogSignatureMessage(signature, "Signature does not have any publisher information.");
3333
}
3434
if (string.IsNullOrWhiteSpace(info.Description))
3535
{
3636
result = RuleResult.Fail;
37-
verboseWriter.LogMessage(signature, "Signature does not have an accompanying description.");
37+
verboseWriter.LogSignatureMessage(signature, "Signature does not have an accompanying description.");
3838
}
3939

4040
if (string.IsNullOrWhiteSpace(info.UrlLink))
4141
{
4242
result = RuleResult.Fail;
43-
verboseWriter.LogMessage(signature, "Signature does not have an accompanying URL.");
43+
verboseWriter.LogSignatureMessage(signature, "Signature does not have an accompanying URL.");
4444
}
4545
Uri uri;
4646
if (!Uri.TryCreate(info.UrlLink, UriKind.Absolute, out uri))
4747
{
4848
result = RuleResult.Fail;
49-
verboseWriter.LogMessage(signature, "Signature's accompanying URL is not a valid URI.");
49+
verboseWriter.LogSignatureMessage(signature, "Signature's accompanying URL is not a valid URI.");
5050
}
5151
}
5252
return result;

AuthenticodeLint/Rules/PublisherInformationUrlHttpsRule.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ public RuleResult Validate(Graph<SignerInfo> graph, SignatureLoggerBase verboseW
2929
if (info == null)
3030
{
3131
result = RuleResult.Fail;
32-
verboseWriter.LogMessage(signature, "Signature does not have any publisher information.");
32+
verboseWriter.LogSignatureMessage(signature, "Signature does not have any publisher information.");
3333
}
3434
if (string.IsNullOrWhiteSpace(info.UrlLink))
3535
{
3636
result = RuleResult.Fail;
37-
verboseWriter.LogMessage(signature, "Signature does not have an accompanying URL.");
37+
verboseWriter.LogSignatureMessage(signature, "Signature does not have an accompanying URL.");
3838
}
3939
if (!info.UrlLink.StartsWith(Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase))
4040
{
4141
result = RuleResult.Fail;
42-
verboseWriter.LogMessage(signature, $"Signature's publisher information URL \"{info.UrlLink}\" does not use the secure HTTPS scheme.");
42+
verboseWriter.LogSignatureMessage(signature, $"Signature's publisher information URL \"{info.UrlLink}\" does not use the secure HTTPS scheme.");
4343
}
4444
}
4545
return result;

AuthenticodeLint/Rules/Sha1PrimarySignatureRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public RuleResult Validate(Graph<SignerInfo> graph, SignatureLoggerBase verboseW
2323
}
2424
if (primary.DigestAlgorithm.Value != KnownOids.SHA1)
2525
{
26-
verboseWriter.LogMessage(primary, $"Expected {nameof(KnownOids.SHA1)} digest algorithm but is {primary.DigestAlgorithm.FriendlyName}.");
26+
verboseWriter.LogSignatureMessage(primary, $"Expected {nameof(KnownOids.SHA1)} digest algorithm but is {primary.DigestAlgorithm.FriendlyName}.");
2727
return RuleResult.Fail;
2828
}
2929
return RuleResult.Pass;

AuthenticodeLint/Rules/TimestampedRule.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ public unsafe RuleResult Validate(Graph<SignerInfo> graph, SignatureLoggerBase v
4747
}
4848
if (!isSigned)
4949
{
50-
verboseWriter.LogMessage(signature, $"Signature is not timestamped.");
50+
verboseWriter.LogSignatureMessage(signature, $"Signature is not timestamped.");
5151
pass = false;
5252
}
5353
else if (!strongSign)
5454
{
55-
verboseWriter.LogMessage(signature, $"Signature is not timestamped with the expected hash algorithm {signature.DigestAlgorithm.FriendlyName}.");
55+
verboseWriter.LogSignatureMessage(signature, $"Signature is not timestamped with the expected hash algorithm {signature.DigestAlgorithm.FriendlyName}.");
5656
pass = false;
5757
}
5858
}

AuthenticodeLint/VerboseSignatureTextWriter.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ namespace AuthenticodeLint
99
{
1010
public class VerboseSignatureLogger : SignatureLoggerBase
1111
{
12-
public override void LogMessage(SignerInfo signature, string message)
12+
public override void LogMessage(string message) => Messages.Add(message);
13+
14+
public override void LogSignatureMessage(SignerInfo signature, string message)
1315
{
1416
var digest = signature.SignatureDigest();
1517
var digestString = digest.Aggregate(new StringBuilder(), (acc, b) => acc.AppendFormat("{0:x2}", b)).ToString();
@@ -19,7 +21,11 @@ public override void LogMessage(SignerInfo signature, string message)
1921

2022
public class NullSignatureLogger : SignatureLoggerBase
2123
{
22-
public override void LogMessage(SignerInfo signature, string message)
24+
public override void LogMessage(string message)
25+
{
26+
}
27+
28+
public override void LogSignatureMessage(SignerInfo signature, string message)
2329
{
2430
}
2531
}
@@ -30,6 +36,7 @@ public abstract class SignatureLoggerBase
3036

3137
internal List<string> Messages { get; } = new List<string>();
3238

33-
public abstract void LogMessage(SignerInfo signature, string message);
39+
public abstract void LogSignatureMessage(SignerInfo signature, string message);
40+
public abstract void LogMessage(string message);
3441
}
3542
}

0 commit comments

Comments
 (0)