mirror of
https://github.com/github/codeql.git
synced 2026-04-26 17:25:19 +02:00
JS: Handle a few other stringification contexts
This commit is contained in:
@@ -1432,6 +1432,23 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
|
||||
c = ContentSet::arrayElementLowerBound(pos.asPositionalLowerBound())
|
||||
)
|
||||
)
|
||||
or
|
||||
// Implicitly read array elements before stringification
|
||||
stringifiedNode(node1) and
|
||||
node2 = node1 and
|
||||
c = ContentSet::arrayElement()
|
||||
}
|
||||
|
||||
private predicate stringifiedNode(Node node) {
|
||||
exists(Expr e | node = TValueNode(e) |
|
||||
e = any(AddExpr add).getAnOperand() and
|
||||
not e instanceof StringLiteral
|
||||
or
|
||||
e = any(TemplateLiteral t).getAnElement() and
|
||||
not e instanceof TemplateElement
|
||||
)
|
||||
or
|
||||
node = DataFlow::globalVarRef("String").getAnInvocation().getArgument(0)
|
||||
}
|
||||
|
||||
/** Gets the post-update node for which `node` is the corresponding pre-update node. */
|
||||
|
||||
@@ -25,18 +25,18 @@ function implicitToString() {
|
||||
const array = [source('implicitToString.1')];
|
||||
array.push(source('implicitToString.2'))
|
||||
|
||||
sink(array + "foo"); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink("foo" + array); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink("" + array); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(array + 1); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(1 + array); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(unknown() + array); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(array + unknown()); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(array + "foo"); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink("foo" + array); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink("" + array); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(array + 1); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(1 + array); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(unknown() + array); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(array + unknown()); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
|
||||
sink(`${array}`); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(`${array} foo`); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(`${array}`); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(`${array} foo`); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
|
||||
sink(String(array)); // $ MISSING: hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(String(array)); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
|
||||
sink(array.toString()); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
sink(array.toString("utf8")); // $ hasTaintFlow=implicitToString.1 hasTaintFlow=implicitToString.2
|
||||
|
||||
Reference in New Issue
Block a user