Skip to content

Commit 03e295e

Browse files
committed
Merge branch 'master' of git.semmle.com:Semmle/ql into CVE74
2 parents 63036aa + f6af5da commit 03e295e

File tree

9 files changed

+810
-754
lines changed

9 files changed

+810
-754
lines changed

javascript/ql/src/Security/CWE-400/PrototypePollutionUtility.ql

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,7 @@ class PropNameTracking extends DataFlow::Configuration {
188188
override predicate isBarrier(DataFlow::Node node) {
189189
super.isBarrier(node)
190190
or
191-
exists(ConditionGuardNode guard, SsaRefinementNode refinement |
192-
node = DataFlow::ssaDefinitionNode(refinement) and
193-
refinement.getGuard() = guard and
194-
guard.getTest() instanceof VarAccess and
195-
guard.getOutcome() = false
196-
)
191+
node instanceof DataFlow::VarAccessBarrier
197192
}
198193

199194
override predicate isBarrierGuard(DataFlow::BarrierGuardNode node) {

javascript/ql/src/semmle/javascript/dataflow/Configuration.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,3 +1480,18 @@ private class AdditionalBarrierGuardCall extends AdditionalBarrierGuardNode, Dat
14801480

14811481
override predicate appliesTo(Configuration cfg) { f.appliesTo(cfg) }
14821482
}
1483+
1484+
/**
1485+
* A guard node for a variable in a negative condition, such as `x` in `if(!x)`.
1486+
* Can be added to a `isBarrier` in a data-flow configuration to block flow through such checks.
1487+
*/
1488+
class VarAccessBarrier extends DataFlow::Node {
1489+
VarAccessBarrier() {
1490+
exists(ConditionGuardNode guard, SsaRefinementNode refinement |
1491+
this = DataFlow::ssaDefinitionNode(refinement) and
1492+
refinement.getGuard() = guard and
1493+
guard.getTest() instanceof VarAccess and
1494+
guard.getOutcome() = false
1495+
)
1496+
}
1497+
}

javascript/ql/src/semmle/javascript/dataflow/TaintTracking.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ module TaintTracking {
8989

9090
final override predicate isBarrier(DataFlow::Node node) {
9191
super.isBarrier(node) or
92-
isSanitizer(node)
92+
isSanitizer(node) or
93+
node instanceof DataFlow::VarAccessBarrier
9394
}
9495

9596
final override predicate isBarrierEdge(DataFlow::Node source, DataFlow::Node sink) {

javascript/ql/src/semmle/javascript/security/dataflow/TaintedPathCustomizations.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,11 @@ module TaintedPath {
364364
}
365365
}
366366

367+
/**
368+
* A guard node for a variable in a negative condition, such as `x` in `if(!x)`.
369+
*/
370+
private class VarAccessBarrier extends Sanitizer, DataFlow::VarAccessBarrier { }
371+
367372
/**
368373
* A source of remote user input, considered as a flow source for
369374
* tainted-path vulnerabilities.

javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ typeInferenceMismatch
7979
| sanitizer-guards.js:43:11:43:18 | source() | sanitizer-guards.js:45:8:45:8 | x |
8080
| sanitizer-guards.js:43:11:43:18 | source() | sanitizer-guards.js:48:10:48:10 | x |
8181
| sanitizer-guards.js:68:11:68:18 | source() | sanitizer-guards.js:75:8:75:8 | x |
82+
| sanitizer-guards.js:79:11:79:18 | source() | sanitizer-guards.js:81:8:81:8 | x |
83+
| sanitizer-guards.js:79:11:79:18 | source() | sanitizer-guards.js:84:10:84:10 | x |
8284
| spread.js:2:15:2:22 | source() | spread.js:4:8:4:19 | { ...taint } |
8385
| spread.js:2:15:2:22 | source() | spread.js:5:8:5:43 | { f: 'h ... orld' } |
8486
| spread.js:2:15:2:22 | source() | spread.js:7:8:7:19 | [ ...taint ] |

javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
| sanitizer-guards.js:43:11:43:18 | source() | sanitizer-guards.js:48:10:48:10 | x |
5555
| sanitizer-guards.js:43:11:43:18 | source() | sanitizer-guards.js:52:10:52:10 | x |
5656
| sanitizer-guards.js:68:11:68:18 | source() | sanitizer-guards.js:75:8:75:8 | x |
57+
| sanitizer-guards.js:79:11:79:18 | source() | sanitizer-guards.js:81:8:81:8 | x |
58+
| sanitizer-guards.js:79:11:79:18 | source() | sanitizer-guards.js:84:10:84:10 | x |
59+
| sanitizer-guards.js:79:11:79:18 | source() | sanitizer-guards.js:86:7:86:7 | x |
5760
| thisAssignments.js:4:17:4:24 | source() | thisAssignments.js:5:10:5:18 | obj.field |
5861
| thisAssignments.js:7:19:7:26 | source() | thisAssignments.js:8:10:8:20 | this.field2 |
5962
| tst.js:2:13:2:20 | source() | tst.js:4:10:4:10 | x |

javascript/ql/test/library-tests/TaintTracking/sanitizer-guards.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,15 @@ function phi2() {
7474
}
7575
sink(x); // NOT OK
7676
}
77+
78+
function falsy() {
79+
let x = source();
80+
81+
sink(x); // NOT OK
82+
83+
if (x) {
84+
sink(x); // OK (for taint-tracking)
85+
} else {
86+
sink(x); // NOT OK
87+
}
88+
}

0 commit comments

Comments
 (0)