Skip to content

Commit 907746c

Browse files
authored
Change signature validation logic to call first without the file content (PowerShell#14849)
1 parent 1bad808 commit 907746c

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

src/System.Management.Automation/security/SecurityManager.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System.Management.Automation.Security;
1212
using System.Security;
1313
using System.Security.Cryptography.X509Certificates;
14+
using System.Text;
1415

1516
using Dbg = System.Management.Automation;
1617

@@ -516,15 +517,28 @@ private static void UntrustPublisher(Signature signature)
516517
}
517518
}
518519

520+
// Check the signature via the SIP which should never erroneously validate an invalid signature
521+
// or altered script.
519522
private static Signature GetSignatureWithEncodingRetry(string path, ExternalScriptInfo script)
520523
{
521-
string verificationContents = System.Text.Encoding.Unicode.GetString(script.OriginalEncoding.GetPreamble()) + script.ScriptContents;
522-
Signature signature = SignatureHelper.GetSignature(path, verificationContents);
524+
// Invoke the SIP directly with the most simple method
525+
Signature signature = SignatureHelper.GetSignature(path, fileContent: null);
526+
if (signature.Status == SignatureStatus.Valid)
527+
{
528+
return signature;
529+
}
530+
531+
// try harder to validate the signature by being explicit about encoding
532+
// and providing the script contents
533+
string verificationContents = Encoding.Unicode.GetString(script.OriginalEncoding.GetPreamble()) + script.ScriptContents;
534+
signature = SignatureHelper.GetSignature(path, verificationContents);
523535

536+
// A last ditch effort -
524537
// If the file was originally ASCII or UTF8, the SIP may have added the Unicode BOM
525-
if ((signature.Status != SignatureStatus.Valid) && (script.OriginalEncoding != System.Text.Encoding.Unicode))
538+
if (signature.Status != SignatureStatus.Valid
539+
&& script.OriginalEncoding != Encoding.Unicode)
526540
{
527-
verificationContents = System.Text.Encoding.Unicode.GetString(System.Text.Encoding.Unicode.GetPreamble()) + script.ScriptContents;
541+
verificationContents = Encoding.Unicode.GetString(Encoding.Unicode.GetPreamble()) + script.ScriptContents;
528542
Signature fallbackSignature = SignatureHelper.GetSignature(path, verificationContents);
529543

530544
if (fallbackSignature.Status == SignatureStatus.Valid)

0 commit comments

Comments
 (0)