Skip to content

Commit 3259ead

Browse files
committed
Decouple OgnlInjection.qll to reuse the taint tracking configuration
1 parent b6904a7 commit 3259ead

File tree

5 files changed

+32
-40
lines changed

5 files changed

+32
-40
lines changed

java/ql/src/Security/CWE/CWE-917/OgnlInjection.ql

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,9 @@
1111
*/
1212

1313
import java
14-
import semmle.code.java.dataflow.FlowSources
15-
import semmle.code.java.security.OgnlInjection
14+
import semmle.code.java.security.OgnlInjectionQuery
1615
import DataFlow::PathGraph
1716

18-
/**
19-
* A taint-tracking configuration for unvalidated user input that is used in OGNL EL evaluation.
20-
*/
21-
class OgnlInjectionFlowConfig extends TaintTracking::Configuration {
22-
OgnlInjectionFlowConfig() { this = "OgnlInjectionFlowConfig" }
23-
24-
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
25-
26-
override predicate isSink(DataFlow::Node sink) { sink instanceof OgnlInjectionSink }
27-
28-
override predicate isSanitizer(DataFlow::Node node) {
29-
node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType
30-
}
31-
32-
override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
33-
any(OgnlInjectionAdditionalTaintStep c).step(node1, node2)
34-
}
35-
}
36-
3717
from DataFlow::PathNode source, DataFlow::PathNode sink, OgnlInjectionFlowConfig conf
3818
where conf.hasFlowPath(source, sink)
3919
select sink.getNode(), source, sink, "OGNL expression might include input from $@.",

java/ql/src/semmle/code/java/security/OgnlInjection.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
/** Provides classes to reason about OGNL injection vulnerabilities. */
22

33
import java
4-
import semmle.code.java.dataflow.FlowSources
5-
import semmle.code.java.dataflow.ExternalFlow
4+
private import semmle.code.java.dataflow.DataFlow
5+
private import semmle.code.java.dataflow.ExternalFlow
66

77
/**
88
* A data flow sink for unvalidated user input that is used in OGNL EL evaluation.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/** Provides taint tracking configurations to be used in OGNL injection queries. */
2+
3+
import java
4+
import semmle.code.java.dataflow.FlowSources
5+
import semmle.code.java.security.OgnlInjection
6+
7+
/**
8+
* A taint-tracking configuration for unvalidated user input that is used in OGNL EL evaluation.
9+
*/
10+
class OgnlInjectionFlowConfig extends TaintTracking::Configuration {
11+
OgnlInjectionFlowConfig() { this = "OgnlInjectionFlowConfig" }
12+
13+
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
14+
15+
override predicate isSink(DataFlow::Node sink) { sink instanceof OgnlInjectionSink }
16+
17+
override predicate isSanitizer(DataFlow::Node node) {
18+
node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType
19+
}
20+
21+
override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
22+
any(OgnlInjectionAdditionalTaintStep c).step(node1, node2)
23+
}
24+
}

java/ql/test/query-tests/security/CWE-917/OgnlInjectionTest.ql

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,17 @@
11
import java
2-
import semmle.code.java.dataflow.DataFlow
3-
import semmle.code.java.dataflow.FlowSources
4-
import semmle.code.java.security.OgnlInjection
2+
import semmle.code.java.security.OgnlInjectionQuery
53
import TestUtilities.InlineExpectationsTest
64

7-
class Conf extends TaintTracking::Configuration {
8-
Conf() { this = "qltest:cwe:ognl-injection" }
9-
10-
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
11-
12-
override predicate isSink(DataFlow::Node sink) { sink instanceof OgnlInjectionSink }
13-
14-
override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
15-
any(OgnlInjectionAdditionalTaintStep c).step(node1, node2)
16-
}
17-
}
18-
195
class OgnlInjectionTest extends InlineExpectationsTest {
206
OgnlInjectionTest() { this = "HasOgnlInjection" }
217

228
override string getARelevantTag() { result = "hasOgnlInjection" }
239

2410
override predicate hasActualResult(Location location, string element, string tag, string value) {
2511
tag = "hasOgnlInjection" and
26-
exists(DataFlow::Node src, DataFlow::Node sink, Conf conf | conf.hasFlow(src, sink) |
12+
exists(DataFlow::Node src, DataFlow::Node sink, OgnlInjectionFlowConfig conf |
13+
conf.hasFlow(src, sink)
14+
|
2715
sink.getLocation() = location and
2816
element = sink.toString() and
2917
value = ""
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/springframework-5.2.3:${testdir}/../../../stubs/ognl-3.2.14:${testdir}/../../../stubs/struts2-core-2.5.22
1+
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/ognl-3.2.14:${testdir}/../../../stubs/struts2-core-2.5.22

0 commit comments

Comments
 (0)