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
68
79/** A data flow sink for unvalidated user input that is used to construct MVEL expressions. */
810abstract class MvelEvaluationSink extends DataFlow:: Node { }
@@ -23,31 +25,6 @@ class MvelInjectionAdditionalTaintStep extends Unit {
2325 abstract predicate step ( DataFlow:: Node n1 , DataFlow:: Node n2 ) ;
2426}
2527
26- private class DefaulMvelEvaluationSinkModel extends SinkModelCsv {
27- override predicate row ( string row ) {
28- row =
29- [
30- "javax.script;CompiledScript;false;eval;;;Argument[-1];mvel" ,
31- "org.mvel2;MVEL;false;eval;;;Argument[0];mvel" ,
32- "org.mvel2;MVEL;false;executeExpression;;;Argument[0];mvel" ,
33- "org.mvel2;MVEL;false;evalToBoolean;;;Argument[0];mvel" ,
34- "org.mvel2;MVEL;false;evalToString;;;Argument[0];mvel" ,
35- "org.mvel2;MVEL;false;executeAllExpression;;;Argument[0];mvel" ,
36- "org.mvel2;MVEL;false;executeSetExpression;;;Argument[0];mvel" ,
37- "org.mvel2;MVELRuntime;false;execute;;;Argument[1];mvel" ,
38- "org.mvel2.templates;TemplateRuntime;false;eval;;;Argument[0];mvel" ,
39- "org.mvel2.templates;TemplateRuntime;false;execute;;;Argument[0];mvel" ,
40- "org.mvel2.jsr223;MvelScriptEngine;false;eval;;;Argument[0];mvel" ,
41- "org.mvel2.jsr223;MvelScriptEngine;false;evaluate;;;Argument[0];mvel" ,
42- "org.mvel2.jsr223;MvelCompiledScript;false;eval;;;Argument[-1];mvel" ,
43- "org.mvel2.compiler;ExecutableStatement;false;getValue;;;Argument[-1];mvel" ,
44- "org.mvel2.compiler;CompiledExpression;false;getDirectValue;;;Argument[-1];mvel" ,
45- "org.mvel2.compiler;CompiledAccExpression;false;getValue;;;Argument[-1];mvel" ,
46- "org.mvel2.compiler;Accessor;false;getValue;;;Argument[-1];mvel"
47- ]
48- }
49- }
50-
5128/** Default sink for MVEL injection vulnerabilities. */
5229private class DefaultMvelEvaluationSink extends MvelEvaluationSink {
5330 DefaultMvelEvaluationSink ( ) { sinkNode ( this , "mvel" ) }
@@ -74,6 +51,26 @@ private class DefaultMvelInjectionAdditionalTaintStep extends MvelInjectionAddit
7451 }
7552}
7653
54+ /**
55+ * A taint-tracking configuration for unsafe user input
56+ * that is used to construct and evaluate a MVEL expression.
57+ */
58+ class MvelInjectionFlowConfig extends TaintTracking:: Configuration {
59+ MvelInjectionFlowConfig ( ) { this = "MvelInjectionFlowConfig" }
60+
61+ override predicate isSource ( DataFlow:: Node source ) { source instanceof RemoteFlowSource }
62+
63+ override predicate isSink ( DataFlow:: Node sink ) { sink instanceof MvelEvaluationSink }
64+
65+ override predicate isSanitizer ( DataFlow:: Node sanitizer ) {
66+ sanitizer instanceof MvelInjectionSanitizer
67+ }
68+
69+ override predicate isAdditionalTaintStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
70+ any ( MvelInjectionAdditionalTaintStep c ) .step ( node1 , node2 )
71+ }
72+ }
73+
7774/**
7875 * Holds if `node1` to `node2` is a dataflow step that compiles a MVEL expression
7976 * by callilng `MVEL.compileExpression(tainted)`.
0 commit comments