@@ -18,27 +18,70 @@ import semmle.code.powershell.ApiGraphs
1818import semmle.code.powershell.security.cryptography.Concepts
1919import WeakEncryptionFlow:: PathGraph
2020
21- class AesModeProperty extends MemberExpr {
22- AesModeProperty ( ) {
23- exists ( DataFlow:: ObjectCreationNode aesObjectCreation , DataFlow:: Node aesObjectAccess |
21+ /**
22+ * Holds if `name` (lowercase) is the short name of a .NET symmetric algorithm type
23+ * that has a `Mode` property.
24+ */
25+ predicate isSymmetricAlgorithmTypeName ( string name ) {
26+ name =
27+ [
28+ "aes" , "aesmanaged" , "aescryptoserviceprovider" , "aescng" ,
29+ "rijndael" , "rijndaelmanaged" ,
30+ "des" , "descryptoserviceprovider" ,
31+ "tripledes" , "tripledescryptoserviceprovider" ,
32+ "rc2" , "rc2cryptoserviceprovider" ,
33+ "symmetricalgorithm"
34+ ]
35+ }
36+
37+ /**
38+ * A data flow node that creates a symmetric algorithm object.
39+ */
40+ abstract class SymmetricAlgorithmCreation extends DataFlow:: Node { }
41+
42+ /**
43+ * A symmetric algorithm creation via `New-Object "System.Security.Cryptography.Xxx"` or `[Xxx]::new()`.
44+ */
45+ class SymmetricAlgorithmNewObject extends SymmetricAlgorithmCreation {
46+ SymmetricAlgorithmNewObject ( ) {
47+ exists ( DataFlow:: ObjectCreationNode objCreation , string typeName , string shortName |
48+ this = objCreation and
49+ typeName = objCreation .getLowerCaseConstructedTypeName ( ) and
50+ isSymmetricAlgorithmTypeName ( shortName ) and
2451 (
25- aesObjectCreation
26- .asExpr ( )
27- .getExpr ( )
28- .( ObjectCreation )
29- .getAnArgument ( )
30- .getValue ( )
31- .stringMatches ( "System.Security.Cryptography.AesManaged" ) or
32- aesObjectCreation =
33- API:: getTopLevelMember ( "system" )
34- .getMember ( "security" )
35- .getMember ( "cryptography" )
36- .getMember ( "aes" )
37- .getMember ( "create" )
38- .asCall ( )
39- ) and
40- aesObjectAccess .getALocalSource ( ) = aesObjectCreation and
41- aesObjectAccess .asExpr ( ) .getExpr ( ) = this .getQualifier ( ) and
52+ typeName = shortName or
53+ typeName .matches ( "%." + shortName )
54+ )
55+ )
56+ }
57+ }
58+
59+ /**
60+ * A symmetric algorithm creation via `[System.Security.Cryptography.Xxx]::Create()`.
61+ */
62+ class SymmetricAlgorithmFactoryCreate extends SymmetricAlgorithmCreation {
63+ SymmetricAlgorithmFactoryCreate ( ) {
64+ exists ( string typeName |
65+ isSymmetricAlgorithmTypeName ( typeName ) and
66+ this =
67+ API:: getTopLevelMember ( "system" )
68+ .getMember ( "security" )
69+ .getMember ( "cryptography" )
70+ .getMember ( typeName )
71+ .getMember ( "create" )
72+ .asCall ( )
73+ )
74+ }
75+ }
76+
77+ /**
78+ * A member expression that writes to the `Mode` property of a symmetric algorithm object.
79+ */
80+ class SymmetricAlgorithmModeProperty extends MemberExpr {
81+ SymmetricAlgorithmModeProperty ( ) {
82+ exists ( SymmetricAlgorithmCreation symAlgCreation , DataFlow:: Node qualAccess |
83+ qualAccess .getALocalSource ( ) = symAlgCreation and
84+ qualAccess .asExpr ( ) .getExpr ( ) = this .getQualifier ( ) and
4285 this .getLowerCaseMemberName ( ) = "mode"
4386 )
4487 }
@@ -54,7 +97,7 @@ module Config implements DataFlow::ConfigSig {
5497
5598 predicate isSink ( DataFlow:: Node sink ) {
5699 sink .( DataFlow:: PostUpdateNode ) .getPreUpdateNode ( ) .asExpr ( ) .getExpr ( ) =
57- any ( AesModeProperty mode ) .getQualifier ( )
100+ any ( SymmetricAlgorithmModeProperty mode ) .getQualifier ( )
58101 }
59102
60103 predicate allowImplicitRead ( DataFlow:: Node n , DataFlow:: ContentSet cs ) {
0 commit comments