3
3
import java
4
4
import semmle.code.java.dataflow.DataFlow
5
5
import semmle.code.java.dataflow.ExternalFlow
6
+ import semmle.code.java.dataflow.FlowSources
7
+ import semmle.code.java.dataflow.TaintTracking
6
8
import semmle.code.java.frameworks.Networking
7
9
8
10
/** A data flow sink for Groovy expression injection vulnerabilities. */
@@ -25,47 +27,6 @@ private class DefaultGroovyInjectionSink extends GroovyInjectionSink {
25
27
DefaultGroovyInjectionSink ( ) { sinkNode ( this , "groovy" ) }
26
28
}
27
29
28
- private class DefaultLdapInjectionSinkModel extends SinkModelCsv {
29
- override predicate row ( string row ) {
30
- row =
31
- [
32
- // Signatures are specified to exclude sinks of the type `File`
33
- "groovy.lang;GroovyShell;false;evaluate;(GroovyCodeSource);;Argument[0];groovy" ,
34
- "groovy.lang;GroovyShell;false;evaluate;(Reader);;Argument[0];groovy" ,
35
- "groovy.lang;GroovyShell;false;evaluate;(Reader,String);;Argument[0];groovy" ,
36
- "groovy.lang;GroovyShell;false;evaluate;(String);;Argument[0];groovy" ,
37
- "groovy.lang;GroovyShell;false;evaluate;(String,String);;Argument[0];groovy" ,
38
- "groovy.lang;GroovyShell;false;evaluate;(String,String,String);;Argument[0];groovy" ,
39
- "groovy.lang;GroovyShell;false;evaluate;(URI);;Argument[0];groovy" ,
40
- "groovy.lang;GroovyShell;false;parse;(Reader);;Argument[0];groovy" ,
41
- "groovy.lang;GroovyShell;false;parse;(Reader,String);;Argument[0];groovy" ,
42
- "groovy.lang;GroovyShell;false;parse;(String);;Argument[0];groovy" ,
43
- "groovy.lang;GroovyShell;false;parse;(String,String);;Argument[0];groovy" ,
44
- "groovy.lang;GroovyShell;false;parse;(URI);;Argument[0];groovy" ,
45
- "groovy.lang;GroovyShell;false;run;(GroovyCodeSource,String[]);;Argument[0];groovy" ,
46
- "groovy.lang;GroovyShell;false;run;(GroovyCodeSource,List);;Argument[0];groovy" ,
47
- "groovy.lang;GroovyShell;false;run;(Reader,String,String[]);;Argument[0];groovy" ,
48
- "groovy.lang;GroovyShell;false;run;(Reader,String,List);;Argument[0];groovy" ,
49
- "groovy.lang;GroovyShell;false;run;(String,String,String[]);;Argument[0];groovy" ,
50
- "groovy.lang;GroovyShell;false;run;(String,String,List);;Argument[0];groovy" ,
51
- "groovy.lang;GroovyShell;false;run;(URI,String[]);;Argument[0];groovy" ,
52
- "groovy.lang;GroovyShell;false;run;(URI,List);;Argument[0];groovy" ,
53
- "groovy.util;Eval;false;me;(String);;Argument[0];groovy" ,
54
- "groovy.util;Eval;false;me;(String,Object,String);;Argument[2];groovy" ,
55
- "groovy.util;Eval;false;x;(Object,String);;Argument[1];groovy" ,
56
- "groovy.util;Eval;false;xy;(Object,Object,String);;Argument[2];groovy" ,
57
- "groovy.util;Eval;false;xyz;(Object,Object,Object,String);;Argument[3];groovy" ,
58
- "groovy.lang;GroovyClassLoader;false;parseClass;(GroovyCodeSource);;Argument[0];groovy" ,
59
- "groovy.lang;GroovyClassLoader;false;parseClass;(GroovyCodeSource,boolean);;Argument[0];groovy" ,
60
- "groovy.lang;GroovyClassLoader;false;parseClass;(InputStream,String);;Argument[0];groovy" ,
61
- "groovy.lang;GroovyClassLoader;false;parseClass;(Reader,String);;Argument[0];groovy" ,
62
- "groovy.lang;GroovyClassLoader;false;parseClass;(String);;Argument[0];groovy" ,
63
- "groovy.lang;GroovyClassLoader;false;parseClass;(String,String);;Argument[0];groovy" ,
64
- "org.codehaus.groovy.control;CompilationUnit;false;compile;;;Argument[-1];groovy"
65
- ]
66
- }
67
- }
68
-
69
30
/** A set of additional taint steps to consider when taint tracking Groovy related data flows. */
70
31
private class DefaultGroovyInjectionAdditionalTaintStep extends GroovyInjectionAdditionalTaintStep {
71
32
override predicate step ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
@@ -76,6 +37,22 @@ private class DefaultGroovyInjectionAdditionalTaintStep extends GroovyInjectionA
76
37
}
77
38
}
78
39
40
+ /**
41
+ * A taint-tracking configuration for unsafe user input
42
+ * that is used to evaluate a Groovy expression.
43
+ */
44
+ class GroovyInjectionConfig extends TaintTracking:: Configuration {
45
+ GroovyInjectionConfig ( ) { this = "GroovyInjectionConfig" }
46
+
47
+ override predicate isSource ( DataFlow:: Node source ) { source instanceof RemoteFlowSource }
48
+
49
+ override predicate isSink ( DataFlow:: Node sink ) { sink instanceof GroovyInjectionSink }
50
+
51
+ override predicate isAdditionalTaintStep ( DataFlow:: Node fromNode , DataFlow:: Node toNode ) {
52
+ any ( GroovyInjectionAdditionalTaintStep c ) .step ( fromNode , toNode )
53
+ }
54
+ }
55
+
79
56
/**
80
57
* Holds if `fromNode` to `toNode` is a dataflow step from a tainted string to
81
58
* a `GroovyCodeSource` instance by calling `new GroovyCodeSource(tainted, ...)`.
0 commit comments