Skip to content

Commit 07762ed

Browse files
committed
Allow MaD sanitizers for queries with MaD sinks
1 parent 2b5887a commit 07762ed

File tree

7 files changed

+53
-0
lines changed

7 files changed

+53
-0
lines changed

python/ql/lib/semmle/python/security/dataflow/CodeInjectionCustomizations.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,11 @@ module CodeInjection {
6060

6161
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
6262
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
63+
64+
/**
65+
* A sanitizer defined via models-as-data with kind "code-injection".
66+
*/
67+
class SanitizerFromModel extends Sanitizer {
68+
SanitizerFromModel() { ModelOutput::barrierNode(this, "code-injection") }
69+
}
6370
}

python/ql/lib/semmle/python/security/dataflow/CommandInjectionCustomizations.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,11 @@ module CommandInjection {
9595

9696
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
9797
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
98+
99+
/**
100+
* A sanitizer defined via models-as-data with kind "command-injection".
101+
*/
102+
class SanitizerFromModel extends Sanitizer {
103+
SanitizerFromModel() { ModelOutput::barrierNode(this, "command-injection") }
104+
}
98105
}

python/ql/lib/semmle/python/security/dataflow/LogInjectionCustomizations.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,11 @@ module LogInjection {
106106
this.getArg(0).asExpr().(StringLiteral).getText() in ["\r\n", "\n"]
107107
}
108108
}
109+
110+
/**
111+
* A sanitizer defined via models-as-data with kind "log-injection".
112+
*/
113+
class SanitizerFromModel extends Sanitizer {
114+
SanitizerFromModel() { ModelOutput::barrierNode(this, "log-injection") }
115+
}
109116
}

python/ql/lib/semmle/python/security/dataflow/ReflectedXSSCustomizations.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,11 @@ module ReflectedXss {
8484

8585
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
8686
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
87+
88+
/**
89+
* A sanitizer defined via models-as-data with kind "html-injection" or "js-injection".
90+
*/
91+
class SanitizerFromModel extends Sanitizer {
92+
SanitizerFromModel() { ModelOutput::barrierNode(this, ["html-injection", "js-injection"]) }
93+
}
8794
}

python/ql/lib/semmle/python/security/dataflow/SqlInjectionCustomizations.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,11 @@ module SqlInjection {
6969
private class DataAsSqlSink extends Sink {
7070
DataAsSqlSink() { ModelOutput::sinkNode(this, "sql-injection") }
7171
}
72+
73+
/**
74+
* A sanitizer defined via models-as-data with kind "sql-injection".
75+
*/
76+
class SanitizerFromModel extends Sanitizer {
77+
SanitizerFromModel() { ModelOutput::barrierNode(this, "sql-injection") }
78+
}
7279
}

python/ql/lib/semmle/python/security/dataflow/UnsafeDeserializationCustomizations.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,11 @@ module UnsafeDeserialization {
6565

6666
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
6767
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
68+
69+
/**
70+
* A sanitizer defined via models-as-data with kind "unsafe-deserialization".
71+
*/
72+
class SanitizerFromModel extends Sanitizer {
73+
SanitizerFromModel() { ModelOutput::barrierNode(this, "unsafe-deserialization") }
74+
}
6875
}

python/ql/src/Security/CWE-798/HardcodedCredentials.ql

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,15 @@ class CredentialSink extends DataFlow::Node {
105105
}
106106
}
107107

108+
class CredentialSanitizer extends DataFlow::Node {
109+
CredentialSanitizer() {
110+
exists(string s | s.matches("credentials-%") |
111+
// Whatever the string, this will sanitize flow to all credential sinks.
112+
ModelOutput::barrierNode(this, s)
113+
)
114+
}
115+
}
116+
108117
/**
109118
* Gets a regular expression for matching names of locations (variables, parameters, keys) that
110119
* indicate the value being held is a credential.
@@ -120,6 +129,8 @@ private module HardcodedCredentialsConfig implements DataFlow::ConfigSig {
120129

121130
predicate isSink(DataFlow::Node sink) { sink instanceof CredentialSink }
122131

132+
predicate isBarrier(DataFlow::Node node) { node instanceof CredentialSanitizer }
133+
123134
predicate observeDiffInformedIncrementalMode() { any() }
124135
}
125136

0 commit comments

Comments
 (0)