@@ -22,7 +22,7 @@ import WeakEncryptionFlow::PathGraph
2222 * Holds if `name` (lowercase) is the short name of a .NET symmetric algorithm type
2323 * that has a `Mode` property.
2424 */
25- private predicate isSymmetricAlgorithmTypeName ( string name ) {
25+ predicate isSymmetricAlgorithmTypeName ( string name ) {
2626 name =
2727 [
2828 "aes" , "aesmanaged" , "aescryptoserviceprovider" , "aescng" ,
@@ -35,40 +35,51 @@ private predicate isSymmetricAlgorithmTypeName(string name) {
3535}
3636
3737/**
38- * Holds if `creation` is a data flow node that creates a symmetric algorithm object.
38+ * A data flow node that creates a symmetric algorithm object.
3939 */
40- private predicate isSymmetricAlgorithmCreation ( DataFlow:: Node creation ) {
41- // New-Object "System.Security.Cryptography.Xxx" or [Xxx]::new()
42- exists ( DataFlow:: ObjectCreationNode objCreation , string typeName , string shortName |
43- creation = objCreation and
44- typeName = objCreation .getLowerCaseConstructedTypeName ( ) and
45- isSymmetricAlgorithmTypeName ( shortName ) and
46- (
47- typeName = shortName or
48- typeName .matches ( "%." + shortName )
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
51+ (
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 ( )
4973 )
50- )
51- or
52- // [System.Security.Cryptography.Xxx]::Create()
53- exists ( string typeName |
54- isSymmetricAlgorithmTypeName ( typeName ) and
55- creation =
56- API:: getTopLevelMember ( "system" )
57- .getMember ( "security" )
58- .getMember ( "cryptography" )
59- .getMember ( typeName )
60- .getMember ( "create" )
61- .asCall ( )
62- )
74+ }
6375}
6476
6577/**
6678 * A member expression that writes to the `Mode` property of a symmetric algorithm object.
6779 */
6880class SymmetricAlgorithmModeProperty extends MemberExpr {
6981 SymmetricAlgorithmModeProperty ( ) {
70- exists ( DataFlow:: Node symAlgCreation , DataFlow:: Node qualAccess |
71- isSymmetricAlgorithmCreation ( symAlgCreation ) and
82+ exists ( SymmetricAlgorithmCreation symAlgCreation , DataFlow:: Node qualAccess |
7283 qualAccess .getALocalSource ( ) = symAlgCreation and
7384 qualAccess .asExpr ( ) .getExpr ( ) = this .getQualifier ( ) and
7485 this .getLowerCaseMemberName ( ) = "mode"
0 commit comments