@@ -14,6 +14,7 @@ import java
14
14
import semmle.code.java.dataflow.TaintTracking
15
15
import semmle.code.java.dataflow.DataFlow
16
16
import semmle.code.java.dataflow.FlowSources
17
+ import semmle.code.java.dataflow.ExternalFlow
17
18
18
19
class ExecMethod extends Method {
19
20
ExecMethod ( ) {
@@ -22,21 +23,31 @@ class ExecMethod extends Method {
22
23
}
23
24
}
24
25
25
- module ExecTaintedEnvironmentConfig implements DataFlow:: ConfigSig {
26
- predicate isSource ( DataFlow:: Node source ) { source instanceof RemoteFlowSource }
26
+ module ProcessBuilderEnvironmentFlow implements DataFlow:: ConfigSig {
27
+ predicate isSource ( DataFlow:: Node source ) {
28
+ source .getType ( ) .( RefType ) .hasQualifiedName ( "java.lang" , "ProcessBuilder" )
29
+ }
27
30
28
31
predicate isSink ( DataFlow:: Node sink ) {
29
- exists ( MethodAccess ma |
30
- ma .getMethod ( ) instanceof ExecMethod and sink . asExpr ( ) = ma . getArgument ( 1 )
32
+ exists ( MethodAccess ma | ma . getQualifier ( ) = sink . asExpr ( ) |
33
+ ma .getMethod ( ) . hasName ( "environment" )
31
34
)
32
35
}
33
36
}
34
37
35
- module ExecTaintedEnvironmentFlow = TaintTracking:: Global< ExecTaintedEnvironmentConfig > ;
38
+ module ExecTaintedEnvironmentConfig implements DataFlow:: ConfigSig {
39
+ predicate isSource ( DataFlow:: Node source ) { source instanceof ThreatModelFlowSource }
36
40
37
- import ExecTaintedEnvironmentFlow:: PathGraph
41
+ predicate isSink ( DataFlow:: Node sink ) { sinkNode ( sink , "environment-injection" ) }
42
+ }
43
+
44
+ module ExecTaintedEnvironmentFlow = TaintTracking:: Global< ExecTaintedEnvironmentConfig > ;
38
45
39
- from ExecTaintedEnvironmentFlow:: PathNode source , ExecTaintedEnvironmentFlow:: PathNode sink
40
- where ExecTaintedEnvironmentFlow:: flowPath ( source , sink )
41
- select sink .getNode ( ) , sink , source , "This command will be executed in a $@." , sink .getNode ( ) ,
42
- "tainted environment"
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
0 commit comments