Skip to content

Commit 8ed3f3c

Browse files
committed
Move to library
1 parent 65d05bf commit 8ed3f3c

File tree

2 files changed

+42
-39
lines changed

2 files changed

+42
-39
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/** Modules to reason about the tainting of environment variables */
2+
3+
private import semmle.code.java.dataflow.ExternalFlow
4+
private import semmle.code.java.dataflow.FlowSources
5+
private import semmle.code.java.dataflow.TaintTracking
6+
private import semmle.code.java.Maps
7+
private import semmle.code.java.JDK
8+
9+
private module ProcessBuilderEnvironmentConfig implements DataFlow::ConfigSig {
10+
predicate isSource(DataFlow::Node source) { source.getType() instanceof TypeProcessBuilder }
11+
12+
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
13+
exists(MethodCall mc | mc.getQualifier() = node1.asExpr() and mc = node2.asExpr() |
14+
mc.getMethod().hasQualifiedName("java.lang", "ProcessBuilder", "environment")
15+
)
16+
}
17+
18+
predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(MapPutCall mpc).getQualifier() }
19+
}
20+
21+
private module ProcessBuilderEnvironmentFlow =
22+
TaintTracking::Global<ProcessBuilderEnvironmentConfig>;
23+
24+
module ExecTaintedEnvironmentConfig implements DataFlow::ConfigSig {
25+
predicate isSource(DataFlow::Node source) { source instanceof ThreatModelFlowSource }
26+
27+
predicate isSink(DataFlow::Node sink) {
28+
sinkNode(sink, "environment-injection")
29+
or
30+
exists(MapPutCall mpc | mpc.getAnArgument() = sink.asExpr() |
31+
ProcessBuilderEnvironmentFlow::flow(_, DataFlow::exprNode(mpc.getQualifier()))
32+
)
33+
}
34+
}
35+
36+
module ExecTaintedEnvironmentFlow = TaintTracking::Global<ExecTaintedEnvironmentConfig>;

java/ql/src/Security/CWE/CWE-078/ExecTaintedEnvironment.ql

Lines changed: 6 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,43 +11,10 @@
1111
*/
1212

1313
import java
14-
import semmle.code.java.dataflow.TaintTracking
15-
import semmle.code.java.dataflow.DataFlow
16-
import semmle.code.java.dataflow.FlowSources
17-
import semmle.code.java.dataflow.ExternalFlow
14+
import semmle.code.java.security.TaintedEnvironmentVariableQuery
15+
import ExecTaintedEnvironmentFlow::PathGraph
1816

19-
class ExecMethod extends Method {
20-
ExecMethod() {
21-
this.hasName("exec") and
22-
this.getDeclaringType().hasQualifiedName("java.lang", "Runtime")
23-
}
24-
}
25-
26-
module ProcessBuilderEnvironmentFlow implements DataFlow::ConfigSig {
27-
predicate isSource(DataFlow::Node source) {
28-
source.getType().(RefType).hasQualifiedName("java.lang", "ProcessBuilder")
29-
}
30-
31-
predicate isSink(DataFlow::Node sink) {
32-
exists(MethodAccess ma | ma.getQualifier() = sink.asExpr() |
33-
ma.getMethod().hasName("environment")
34-
)
35-
}
36-
}
37-
38-
module ExecTaintedEnvironmentConfig implements DataFlow::ConfigSig {
39-
predicate isSource(DataFlow::Node source) { source instanceof ThreatModelFlowSource }
40-
41-
predicate isSink(DataFlow::Node sink) { sinkNode(sink, "environment-injection") }
42-
}
43-
44-
module ExecTaintedEnvironmentFlow = TaintTracking::Global<ExecTaintedEnvironmentConfig>;
45-
46-
from Flow::PathNode source, Flow::PathNode sink, string label
47-
where
48-
ExecTaintedCommandFlow::flowPath(source.asPathNode1(), sink.asPathNode1()) and label = "argument"
49-
or
50-
ExecTaintedEnvironmentFlow::flowPath(source.asPathNode2(), sink.asPathNode2()) and
51-
label = "environment"
52-
select sink.getNode(), sink, source, "This command will be execute with a tainted $@.",
53-
sink.getNode(), label
17+
from ExecTaintedEnvironmentFlow::PathNode source, ExecTaintedEnvironmentFlow::PathNode sink
18+
where ExecTaintedEnvironmentFlow::flowPath(source, sink)
19+
select sink.getNode(), source, sink, "This command will be execute with a tainted $@.",
20+
sink.getNode(), "environment variable"

0 commit comments

Comments
 (0)