Skip to content

Commit 5142670

Browse files
committed
don't import AdditionalSinks, refactor sink out in new HeuristicSinks instead
1 parent 373a437 commit 5142670

3 files changed

Lines changed: 41 additions & 26 deletions

File tree

javascript/ql/src/Security/CWE-094/ImproperCodeSanitization.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
// TODO: Proper customizations module, Source class Sink class etc.
1515
import javascript
1616
import DataFlow::PathGraph
17-
private import semmle.javascript.heuristics.AdditionalSinks
17+
private import semmle.javascript.heuristics.HeuristicSinks
1818
private import semmle.javascript.security.dataflow.CodeInjectionCustomizations
1919

2020
/**
@@ -58,7 +58,7 @@ private StringOps::ConcatenationLeaf sink() {
5858

5959
private DataFlow::Node endsInCodeInjectionSink(DataFlow::TypeBackTracker t) {
6060
t.start() and
61-
result instanceof CodeInjection::Sink and
61+
(result instanceof CodeInjection::Sink or result instanceof HeuristicCodeInjectionSink) and
6262
not result instanceof StringOps::ConcatenationRoot // the heuristic CodeInjection sink looks for string-concats, we are not interrested in those here.
6363
or
6464
exists(DataFlow::TypeBackTracker t2 | t = t2.smallstep(result, endsInCodeInjectionSink(t2)))

javascript/ql/src/semmle/javascript/heuristics/AdditionalSinks.qll

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,12 @@ private import semmle.javascript.security.dataflow.RegExpInjectionCustomizations
1717
private import semmle.javascript.security.dataflow.ClientSideUrlRedirectCustomizations
1818
private import semmle.javascript.security.dataflow.ServerSideUrlRedirectCustomizations
1919
private import semmle.javascript.security.dataflow.InsecureRandomnessCustomizations
20+
private import HeuristicSinks as Sinks
2021

21-
/**
22-
* A heuristic sink for data flow in a security query.
23-
*/
24-
abstract class HeuristicSink extends DataFlow::Node { }
22+
private class HeuristicSink = Sinks::HeuristicSink;
2523

26-
private class HeuristicCodeInjectionSink extends HeuristicSink, CodeInjection::Sink {
27-
HeuristicCodeInjectionSink() {
28-
isAssignedTo(this, "$where")
29-
or
30-
isAssignedToOrConcatenatedWith(this, "(?i)(command|cmd|exec|code|script|program)")
31-
or
32-
isArgTo(this, "(?i)(eval|run)") // "exec" clashes too often with `RegExp.prototype.exec`
33-
or
34-
exists(string srcPattern |
35-
// function/lambda syntax anywhere
36-
srcPattern = "(?s).*function\\s*\\(.*\\).*" or
37-
srcPattern = "(?s).*(\\(.*\\)|[A-Za-z_]+)\\s?=>.*"
38-
|
39-
isConcatenatedWithString(this, srcPattern)
40-
)
41-
or
42-
// dynamic property name
43-
isConcatenatedWithStrings("(?is)[a-z]+\\[", this, "(?s)\\].*")
44-
}
45-
}
24+
private class HeuristicCodeInjectionSink extends Sinks::HeuristicCodeInjectionSink,
25+
CodeInjection::Sink { }
4626

4727
private class HeuristicCommandInjectionSink extends HeuristicSink, CommandInjection::Sink {
4828
HeuristicCommandInjectionSink() {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* Provides heuristically recognized sinks for security queries.
3+
*/
4+
5+
import javascript
6+
private import SyntacticHeuristics
7+
8+
/**
9+
* A heuristic sink for data flow in a security query.
10+
*/
11+
abstract class HeuristicSink extends DataFlow::Node { }
12+
13+
/**
14+
* A heuristically recognized sink for `js/code-injection` vulnerabilities.
15+
*/
16+
class HeuristicCodeInjectionSink extends HeuristicSink {
17+
HeuristicCodeInjectionSink() {
18+
isAssignedTo(this, "$where")
19+
or
20+
isAssignedToOrConcatenatedWith(this, "(?i)(command|cmd|exec|code|script|program)")
21+
or
22+
isArgTo(this, "(?i)(eval|run)") // "exec" clashes too often with `RegExp.prototype.exec`
23+
or
24+
exists(string srcPattern |
25+
// function/lambda syntax anywhere
26+
srcPattern = "(?s).*function\\s*\\(.*\\).*" or
27+
srcPattern = "(?s).*(\\(.*\\)|[A-Za-z_]+)\\s?=>.*"
28+
|
29+
isConcatenatedWithString(this, srcPattern)
30+
)
31+
or
32+
// dynamic property name
33+
isConcatenatedWithStrings("(?is)[a-z]+\\[", this, "(?s)\\].*")
34+
}
35+
}

0 commit comments

Comments
 (0)