Skip to content

Commit a5e5379

Browse files
committed
predicate -> abstract class, updated inline expectations
1 parent 6e238a7 commit a5e5379

2 files changed

Lines changed: 46 additions & 35 deletions

File tree

powershell/ql/src/queries/security/cwe-327/ApprovedCipherMode.ql

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
6880
class 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"

powershell/ql/test/query-tests/security/cwe-327/ApprovedCipherMode/Test.ps1

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,34 @@ $aesManaged = New-Object "System.Security.Cryptography.AesManaged"
55

66
#Setting weak modes via CipherMode enum
77
$badMode = [System.Security.Cryptography.CipherMode]::ECB # $ Source
8-
$aes.Mode = $badMode
8+
$aes.Mode = $badMode # $ Alert
99
$aesManaged.Mode = $badMode # $ Alert
1010

11-
$aes.Mode = [System.Security.Cryptography.CipherMode]::ECB
11+
$aes.Mode = [System.Security.Cryptography.CipherMode]::ECB # $ Alert
1212
$aesManaged.Mode = [System.Security.Cryptography.CipherMode]::ECB # $ Alert
1313

1414
# Setting weak modes directly
15-
$aes.Mode = "ecb"
16-
$aesManaged.Mode = "ecb"
15+
$aes.Mode = "ecb" # $ Alert
16+
$aesManaged.Mode = "ecb" # $ Alert
1717

1818
# Other symmetric algorithm types
1919
$rijndael = New-Object "System.Security.Cryptography.RijndaelManaged"
20-
$rijndael.Mode = [System.Security.Cryptography.CipherMode]::ECB
20+
$rijndael.Mode = [System.Security.Cryptography.CipherMode]::ECB # $ Alert
2121

2222
$tripleDes = New-Object "System.Security.Cryptography.TripleDESCryptoServiceProvider"
23-
$tripleDes.Mode = [System.Security.Cryptography.CipherMode]::ECB
23+
$tripleDes.Mode = [System.Security.Cryptography.CipherMode]::ECB # $ Alert
2424

2525
# [Type]::new() constructor pattern
2626
$aesCsp = [System.Security.Cryptography.AesCryptoServiceProvider]::new()
27-
$aesCsp.Mode = [System.Security.Cryptography.CipherMode]::ECB
27+
$aesCsp.Mode = [System.Security.Cryptography.CipherMode]::ECB # $ Alert
2828

2929
# Partial/short type names
3030
$aesShort = New-Object AesManaged
31-
$aesShort.Mode = "ecb"
31+
$aesShort.Mode = "ecb" # $ Alert
3232

3333
# Integer cipher mode values (ECB = 2)
3434
$aes2 = [System.Security.Cryptography.Aes]::Create()
35-
$aes2.Mode = 2
35+
$aes2.Mode = 2 # $ Alert
3636

3737
# Safe: CBC mode (should not be flagged)
3838
$aesSafe = [System.Security.Cryptography.Aes]::Create()

0 commit comments

Comments
 (0)