Skip to content

Commit 34d4e9a

Browse files
authored
Merge pull request #21898 from geoffw0/swiftflow
Swift: Extend swift/weak-sensitive-data-hashing, swift/weak-password-hashing sinks
2 parents ed8b9c2 + 5c2488e commit 34d4e9a

6 files changed

Lines changed: 286 additions & 121 deletions

File tree

swift/ql/lib/codeql/swift/security/WeakPasswordHashingExtensions.qll

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,15 @@ private class WeakSensitiveDataHashingSinks extends SinkModelCsv {
5454
// CryptoKit
5555
// (SHA-256, SHA-384 and SHA-512 are all variants of the SHA-2 algorithm)
5656
";SHA256;true;hash(data:);;;Argument[0];weak-password-hash-input-SHA256",
57+
";SHA256;true;hash(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA256",
5758
";SHA256;true;update(data:);;;Argument[0];weak-password-hash-input-SHA256",
5859
";SHA256;true;update(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA256",
5960
";SHA384;true;hash(data:);;;Argument[0];weak-password-hash-input-SHA384",
61+
";SHA384;true;hash(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA384",
6062
";SHA384;true;update(data:);;;Argument[0];weak-password-hash-input-SHA384",
6163
";SHA384;true;update(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA384",
6264
";SHA512;true;hash(data:);;;Argument[0];weak-password-hash-input-SHA512",
65+
";SHA512;true;hash(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA512",
6366
";SHA512;true;update(data:);;;Argument[0];weak-password-hash-input-SHA512",
6467
";SHA512;true;update(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA512",
6568
// CryptoSwift
@@ -111,6 +114,25 @@ private class DefaultWeakPasswordHashingSink extends WeakPasswordHashingSink {
111114
override string getAlgorithm() { result = algorithm }
112115
}
113116

117+
/**
118+
* A sink for weak password hashing through a call with a metatype qualifier.
119+
*/
120+
private class WeakPasswordHashingMetatypeSink extends WeakPasswordHashingSink {
121+
string algorithm;
122+
123+
WeakPasswordHashingMetatypeSink() {
124+
exists(CallExpr c |
125+
c.getAnArgument().getExpr() = this.asExpr() and
126+
algorithm = ["SHA256", "SHA384", "SHA512"] and
127+
c.getQualifier().getType().getFullName() = algorithm + ["", ".Type"] and
128+
c.getStaticTarget().getName() =
129+
["hash(data:)", "hash(bufferPointer:)", "update(data:)", "update(bufferPointer:)"]
130+
)
131+
}
132+
133+
override string getAlgorithm() { result = algorithm }
134+
}
135+
114136
/**
115137
* A barrier for weak password hashing, when it occurs inside of
116138
* certain cryptographic algorithms as part of their design.

swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingExtensions.qll

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ private class WeakSensitiveDataHashingSinks extends SinkModelCsv {
4040
[
4141
// CryptoKit
4242
";Insecure.MD5;true;hash(data:);;;Argument[0];weak-hash-input-MD5",
43+
";Insecure.MD5;true;hash(bufferPointer:);;;Argument[0];weak-hash-input-MD5",
4344
";Insecure.MD5;true;update(data:);;;Argument[0];weak-hash-input-MD5",
4445
";Insecure.MD5;true;update(bufferPointer:);;;Argument[0];weak-hash-input-MD5",
4546
";Insecure.SHA1;true;hash(data:);;;Argument[0];weak-hash-input-SHA1",
47+
";Insecure.SHA1;true;hash(bufferPointer:);;;Argument[0];weak-hash-input-SHA1",
4648
";Insecure.SHA1;true;update(data:);;;Argument[0];weak-hash-input-SHA1",
4749
";Insecure.SHA1;true;update(bufferPointer:);;;Argument[0];weak-hash-input-SHA1",
4850
// CryptoSwift
@@ -69,10 +71,29 @@ private class WeakSensitiveDataHashingSinks extends SinkModelCsv {
6971
/**
7072
* A sink defined in a CSV model.
7173
*/
72-
private class DefaultWeakSenitiveDataHashingSink extends WeakSensitiveDataHashingSink {
74+
private class DefaultWeakSensitiveDataHashingSink extends WeakSensitiveDataHashingSink {
7375
string algorithm;
7476

75-
DefaultWeakSenitiveDataHashingSink() { sinkNode(this, "weak-hash-input-" + algorithm) }
77+
DefaultWeakSensitiveDataHashingSink() { sinkNode(this, "weak-hash-input-" + algorithm) }
78+
79+
override string getAlgorithm() { result = algorithm }
80+
}
81+
82+
/**
83+
* A sink for weak sensitive data hashing through a call with a metatype qualifier.
84+
*/
85+
private class WeakSensitiveDataHashingMetatypeSink extends WeakSensitiveDataHashingSink {
86+
string algorithm;
87+
88+
WeakSensitiveDataHashingMetatypeSink() {
89+
exists(CallExpr c |
90+
c.getAnArgument().getExpr() = this.asExpr() and
91+
algorithm = ["MD5", "SHA1"] and
92+
c.getQualifier().getType().getFullName() = "Insecure." + algorithm + ["", ".Type"] and
93+
c.getStaticTarget().getName() =
94+
["hash(data:)", "hash(bufferPointer:)", "update(data:)", "update(bufferPointer:)"]
95+
)
96+
}
7697

7798
override string getAlgorithm() { result = algorithm }
7899
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Fixed an issue where common usage patterns for `CryptoKit` weren't being recognized as hashing sinks for the `swift/weak-sensitive-data-hashing` and `swift/weak-password-hashing` queries. These queries may find additional results after this change.

0 commit comments

Comments
 (0)