mirror of
https://github.com/github/codeql.git
synced 2025-12-21 19:26:31 +01:00
JS: Guard against more FPs
This commit is contained in:
@@ -144,6 +144,26 @@ class DynamicPropRead extends DataFlow::SourceNode, DataFlow::ValueNode {
|
||||
|
||||
/** Gets the base of the dynamic read. */
|
||||
DataFlow::Node getBase() { result = astNode.getBase().flow() }
|
||||
|
||||
/**
|
||||
* Holds if the value of this read was assigned to earlier in the same basic block.
|
||||
*
|
||||
* For example, this is true for `dst[x]` on line 2 below:
|
||||
* ```js
|
||||
* dst[x] = {};
|
||||
* dst[x][y] = src[y];
|
||||
* ```
|
||||
*/
|
||||
predicate hasDominatingAssignment() {
|
||||
exists(DataFlow::PropWrite write, BasicBlock bb, int i, int j, SsaVariable ssaVar |
|
||||
write = getBase().getALocalSource().getAPropertyWrite() and
|
||||
bb.getNode(i) = write.getWriteNode() and
|
||||
bb.getNode(j) = astNode and
|
||||
i < j and
|
||||
write.getPropertyNameExpr() = ssaVar.getAUse() and
|
||||
astNode.getIndex() = ssaVar.getAUse()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -238,11 +258,13 @@ class PropNameTracking extends DataFlow::Configuration {
|
||||
// Step through `p -> x[p]`
|
||||
exists(PropRead read |
|
||||
pred = read.getPropertyNameExpr().flow() and
|
||||
not read.(DynamicPropRead).hasDominatingAssignment() and
|
||||
succ = read
|
||||
)
|
||||
or
|
||||
// Step through `x -> x[p]`
|
||||
exists(DynamicPropRead read |
|
||||
not read.hasDominatingAssignment() and
|
||||
pred = read.getBase() and
|
||||
succ = read
|
||||
)
|
||||
|
||||
@@ -707,6 +707,42 @@ nodes
|
||||
| PrototypePollutionUtility/tests.js:280:24:280:31 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:280:28:280:30 | key |
|
||||
| PrototypePollutionUtility/tests.js:280:28:280:30 | key |
|
||||
| PrototypePollutionUtility/tests.js:285:28:285:30 | src |
|
||||
| PrototypePollutionUtility/tests.js:285:28:285:30 | src |
|
||||
| PrototypePollutionUtility/tests.js:285:33:285:36 | path |
|
||||
| PrototypePollutionUtility/tests.js:285:33:285:36 | path |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:42 | src |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:42 | src |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:289:44:289:46 | key |
|
||||
| PrototypePollutionUtility/tests.js:289:44:289:46 | key |
|
||||
| PrototypePollutionUtility/tests.js:289:50:289:78 | path ? ... y : key |
|
||||
| PrototypePollutionUtility/tests.js:289:50:289:78 | path ? ... y : key |
|
||||
| PrototypePollutionUtility/tests.js:289:76:289:78 | key |
|
||||
| PrototypePollutionUtility/tests.js:289:76:289:78 | key |
|
||||
| PrototypePollutionUtility/tests.js:292:24:292:27 | path |
|
||||
| PrototypePollutionUtility/tests.js:292:24:292:27 | path |
|
||||
| PrototypePollutionUtility/tests.js:292:24:292:27 | path |
|
||||
| PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:39 | src |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:39 | src |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:41:293:43 | key |
|
||||
| PrototypePollutionUtility/tests.js:293:41:293:43 | key |
|
||||
| examples/PrototypePollutionUtility.js:1:16:1:18 | dst |
|
||||
| examples/PrototypePollutionUtility.js:1:16:1:18 | dst |
|
||||
| examples/PrototypePollutionUtility.js:1:21:1:23 | src |
|
||||
@@ -1696,6 +1732,56 @@ edges
|
||||
| PrototypePollutionUtility/tests.js:280:28:280:30 | key | PrototypePollutionUtility/tests.js:280:24:280:31 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:280:28:280:30 | key | PrototypePollutionUtility/tests.js:280:24:280:31 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:280:28:280:30 | key | PrototypePollutionUtility/tests.js:280:24:280:31 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:285:28:285:30 | src | PrototypePollutionUtility/tests.js:289:40:289:42 | src |
|
||||
| PrototypePollutionUtility/tests.js:285:28:285:30 | src | PrototypePollutionUtility/tests.js:289:40:289:42 | src |
|
||||
| PrototypePollutionUtility/tests.js:285:28:285:30 | src | PrototypePollutionUtility/tests.js:293:37:293:39 | src |
|
||||
| PrototypePollutionUtility/tests.js:285:28:285:30 | src | PrototypePollutionUtility/tests.js:293:37:293:39 | src |
|
||||
| PrototypePollutionUtility/tests.js:285:33:285:36 | path | PrototypePollutionUtility/tests.js:292:24:292:27 | path |
|
||||
| PrototypePollutionUtility/tests.js:285:33:285:36 | path | PrototypePollutionUtility/tests.js:292:24:292:27 | path |
|
||||
| PrototypePollutionUtility/tests.js:285:33:285:36 | path | PrototypePollutionUtility/tests.js:292:24:292:27 | path |
|
||||
| PrototypePollutionUtility/tests.js:285:33:285:36 | path | PrototypePollutionUtility/tests.js:292:24:292:27 | path |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:289:44:289:46 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:289:44:289:46 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:289:44:289:46 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:289:44:289:46 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:289:76:289:78 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:289:76:289:78 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:289:76:289:78 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:289:76:289:78 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:30:293:32 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:41:293:43 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:41:293:43 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:41:293:43 | key |
|
||||
| PrototypePollutionUtility/tests.js:286:14:286:16 | key | PrototypePollutionUtility/tests.js:293:41:293:43 | key |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:42 | src | PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:42 | src | PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] | PrototypePollutionUtility/tests.js:285:28:285:30 | src |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] | PrototypePollutionUtility/tests.js:285:28:285:30 | src |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] | PrototypePollutionUtility/tests.js:285:28:285:30 | src |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] | PrototypePollutionUtility/tests.js:285:28:285:30 | src |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] | PrototypePollutionUtility/tests.js:285:28:285:30 | src |
|
||||
| PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] | PrototypePollutionUtility/tests.js:285:28:285:30 | src |
|
||||
| PrototypePollutionUtility/tests.js:289:44:289:46 | key | PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:289:44:289:46 | key | PrototypePollutionUtility/tests.js:289:40:289:47 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:289:50:289:78 | path ? ... y : key | PrototypePollutionUtility/tests.js:285:33:285:36 | path |
|
||||
| PrototypePollutionUtility/tests.js:289:50:289:78 | path ? ... y : key | PrototypePollutionUtility/tests.js:285:33:285:36 | path |
|
||||
| PrototypePollutionUtility/tests.js:289:76:289:78 | key | PrototypePollutionUtility/tests.js:289:50:289:78 | path ? ... y : key |
|
||||
| PrototypePollutionUtility/tests.js:289:76:289:78 | key | PrototypePollutionUtility/tests.js:289:50:289:78 | path ? ... y : key |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:39 | src | PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:39 | src | PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:39 | src | PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:39 | src | PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] | PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:41:293:43 | key | PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:41:293:43 | key | PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:41:293:43 | key | PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| PrototypePollutionUtility/tests.js:293:41:293:43 | key | PrototypePollutionUtility/tests.js:293:37:293:44 | src[key] |
|
||||
| examples/PrototypePollutionUtility.js:1:16:1:18 | dst | examples/PrototypePollutionUtility.js:5:19:5:21 | dst |
|
||||
| examples/PrototypePollutionUtility.js:1:16:1:18 | dst | examples/PrototypePollutionUtility.js:5:19:5:21 | dst |
|
||||
| examples/PrototypePollutionUtility.js:1:16:1:18 | dst | examples/PrototypePollutionUtility.js:7:13:7:15 | dst |
|
||||
|
||||
@@ -281,3 +281,19 @@ function copyUsingReflect(dst, src) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function copyWithPath(dst, src, path) {
|
||||
for (let key in src) {
|
||||
if (src.hasOwnProperty(key)) {
|
||||
if (dst[key]) {
|
||||
copyWithPath(dst[key], src[key], path ? path + '.' + key : key);
|
||||
} else {
|
||||
let target = {};
|
||||
target[path] = {};
|
||||
target[path][key] = src[key]; // OK
|
||||
doSomething(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user