Skip to content

Commit 96da854

Browse files
authored
Merge pull request github#5823 from atorralba/promote-jexl-injection
Java: Promote JEXL Injection query from experimental
2 parents 1a1b74c + 56a429a commit 96da854

File tree

24 files changed

+377
-538
lines changed

24 files changed

+377
-538
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
lgtm,codescanning
2+
* The query "Expression language injection (JEXL)" (`java/jexl-expression-injection`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @artem-smotrakov](https://github.com/github/codeql/pull/4965)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* @name Expression language injection (JEXL)
3+
* @description Evaluation of a user-controlled JEXL expression
4+
* may lead to arbitrary code execution.
5+
* @kind path-problem
6+
* @problem.severity error
7+
* @precision high
8+
* @id java/jexl-expression-injection
9+
* @tags security
10+
* external/cwe/cwe-094
11+
*/
12+
13+
import java
14+
import semmle.code.java.dataflow.FlowSources
15+
import semmle.code.java.security.JexlInjection
16+
import DataFlow::PathGraph
17+
18+
/**
19+
* A taint-tracking configuration for unsafe user input
20+
* that is used to construct and evaluate a JEXL expression.
21+
* It supports both JEXL 2 and 3.
22+
*/
23+
class JexlInjectionConfig extends TaintTracking::Configuration {
24+
JexlInjectionConfig() { this = "JexlInjectionConfig" }
25+
26+
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
27+
28+
override predicate isSink(DataFlow::Node sink) { sink instanceof JexlEvaluationSink }
29+
30+
override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
31+
any(JexlInjectionAdditionalTaintStep c).step(node1, node2)
32+
}
33+
}
34+
35+
from DataFlow::PathNode source, DataFlow::PathNode sink, JexlInjectionConfig conf
36+
where conf.hasFlowPath(source, sink)
37+
select sink.getNode(), source, sink, "JEXL injection from $@.", source.getNode(), "this user input"

java/ql/src/experimental/Security/CWE/CWE-094/JexlInjection.ql

Lines changed: 0 additions & 19 deletions
This file was deleted.

java/ql/src/experimental/Security/CWE/CWE-094/JexlInjectionLib.qll

Lines changed: 0 additions & 277 deletions
This file was deleted.

java/ql/src/semmle/code/java/dataflow/ExternalFlow.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ private module Frameworks {
8686
private import semmle.code.java.security.XSS
8787
private import semmle.code.java.security.LdapInjection
8888
private import semmle.code.java.security.XPath
89+
private import semmle.code.java.security.JexlInjection
8990
}
9091

9192
private predicate sourceModelCsv(string row) {

java/ql/src/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ private import semmle.code.java.dataflow.ExternalFlow
1414
private import semmle.code.java.dataflow.internal.DataFlowPrivate
1515
import semmle.code.java.dataflow.FlowSteps
1616
private import FlowSummaryImpl as FlowSummaryImpl
17+
private import semmle.code.java.frameworks.JaxWS
1718

1819
/**
1920
* Holds if taint can flow from `src` to `sink` in zero or more
@@ -348,6 +349,10 @@ private predicate taintPreservingQualifierToMethod(Method m) {
348349
)
349350
or
350351
m.(TaintPreservingCallable).returnsTaintFrom(-1)
352+
or
353+
exists(JaxRsResourceMethod resourceMethod |
354+
m.(GetterMethod).getDeclaringType() = resourceMethod.getAParameter().getType()
355+
)
351356
}
352357

353358
private class StringReplaceMethod extends TaintPreservingCallable {

0 commit comments

Comments
 (0)