33import java
44import semmle.code.java.dataflow.DataFlow
55import semmle.code.java.dataflow.ExternalFlow
6+ import semmle.code.java.dataflow.FlowSources
7+ import semmle.code.java.dataflow.TaintTracking
68import semmle.code.java.frameworks.Networking
79
810/** A data flow sink for Groovy expression injection vulnerabilities. */
@@ -25,47 +27,6 @@ private class DefaultGroovyInjectionSink extends GroovyInjectionSink {
2527 DefaultGroovyInjectionSink ( ) { sinkNode ( this , "groovy" ) }
2628}
2729
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-
6930/** A set of additional taint steps to consider when taint tracking Groovy related data flows. */
7031private class DefaultGroovyInjectionAdditionalTaintStep extends GroovyInjectionAdditionalTaintStep {
7132 override predicate step ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
@@ -76,6 +37,22 @@ private class DefaultGroovyInjectionAdditionalTaintStep extends GroovyInjectionA
7637 }
7738}
7839
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+
7956/**
8057 * Holds if `fromNode` to `toNode` is a dataflow step from a tainted string to
8158 * a `GroovyCodeSource` instance by calling `new GroovyCodeSource(tainted, ...)`.
0 commit comments