Skip to content

Commit a03b45d

Browse files
committed
feat(java): Update JSP audit queries
1 parent 47a2018 commit a03b45d

File tree

2 files changed

+48
-34
lines changed

2 files changed

+48
-34
lines changed

java/src/audit/CWE-079/XSSJSPLenient.ql

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,27 @@ import java
1515
import semmle.code.java.dataflow.FlowSources
1616
import semmle.code.java.dataflow.TaintTracking2
1717
import semmle.code.java.security.XSS
18-
import DataFlow::PathGraph
1918
import semmle.code.java.frameworks.Servlets
2019
import JSPLocations
2120

22-
class XSSConfig extends TaintTracking::Configuration {
23-
XSSConfig() { this = "XSSConfig" }
21+
module Xss {
22+
module XssConfig implements DataFlow::ConfigSig {
23+
predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
2424

25-
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
25+
predicate isSink(DataFlow::Node sink) { sink instanceof XssSink }
2626

27-
override predicate isSink(DataFlow::Node sink) { sink instanceof XssSink }
27+
predicate isBarrier(DataFlow::Node node) { node instanceof XssSanitizer }
2828

29-
override predicate isSanitizer(DataFlow::Node node) { node instanceof XssSanitizer }
29+
predicate isBarrierOut(DataFlow::Node node) { node instanceof XssSinkBarrier }
3030

31-
override predicate isSanitizerOut(DataFlow::Node node) { node instanceof XssSinkBarrier }
32-
33-
override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
34-
any(XssAdditionalTaintStep s).step(node1, node2)
31+
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
32+
any(XssAdditionalTaintStep s).step(node1, node2)
33+
}
3534
}
35+
36+
module XssFlow = TaintTracking::Global<XssConfig>;
37+
38+
import XssFlow::PathGraph
3639
}
3740

3841
// additional sources: Consider return values of ServletRequest methods to be tainted (potentially noisy)
@@ -124,10 +127,13 @@ class ForEachStep extends XssAdditionalTaintStep {
124127
override predicate step(DataFlow::Node node1, DataFlow::Node node2) {
125128
exists(Variable v, string varName, EvalCall eval |
126129
v.getType().getName() = "ForEachTag" and
127-
exists(ContextFlowConfig config, DataFlow::Node ctxSrc |
128-
config
129-
.hasFlow(ctxSrc, DataFlow2::exprNode(methodCallOn("setPageContext", v).getArgument(0))) and
130-
config.hasFlow(ctxSrc, DataFlow2::exprNode(eval.getCtxExpr()))
130+
exists(DataFlow::Node ctxSrc |
131+
ContextFlow::ContextFlow::flow(ctxSrc,
132+
DataFlow2::exprNode(methodCallOn("setPageContext", v).getArgument(0))) and
133+
ContextFlow::ContextFlow::flow(ctxSrc, DataFlow2::exprNode(eval.getCtxExpr()))
134+
// config
135+
// .hasFlow(ctxSrc, DataFlow2::exprNode(methodCallOn("setPageContext", v).getArgument(0))) and
136+
// config.hasFlow(ctxSrc, DataFlow2::exprNode(eval.getCtxExpr()))
131137
) and
132138
node1.asExpr() = methodCallOn("setItems", v).getArgument(0) and
133139
node2.asExpr() = eval and
@@ -137,41 +143,49 @@ class ForEachStep extends XssAdditionalTaintStep {
137143
}
138144
}
139145

140-
class LiteralConfig extends TaintTracking2::Configuration {
141-
LiteralConfig() { this = "LiteralConfig" }
142-
143-
override predicate isSource(DataFlow2::Node source) { source.asExpr() instanceof StringLiteral }
146+
module LiteralConfig {
147+
module LiteralConfig implements DataFlow::ConfigSig {
148+
predicate isSource(DataFlow::Node source) { source.asExpr() instanceof StringLiteral }
144149

145-
override predicate isSink(DataFlow2::Node sink) {
146-
exists(ReturnStmt rs | rs.getResult() = sink.asExpr())
150+
predicate isSink(DataFlow::Node sink) { exists(ReturnStmt rs | rs.getResult() = sink.asExpr()) }
147151
}
152+
153+
module LiteralFlow = TaintTracking::Global<LiteralConfig>;
154+
155+
import LiteralFlow::PathGraph
148156
}
149157

150-
class ContextFlowConfig extends TaintTracking2::Configuration {
151-
ContextFlowConfig() { this = "ContextFlowConfig" }
158+
module ContextFlow {
159+
module ContextFlowConfig implements DataFlow::ConfigSig {
160+
predicate isSource(DataFlow::Node source) {
161+
source.asExpr().getType().getName() = "PageContext"
162+
}
152163

153-
override predicate isSource(DataFlow2::Node source) {
154-
source.asExpr().getType().getName() = "PageContext"
164+
predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof Argument }
155165
}
156166

157-
override predicate isSink(DataFlow2::Node sink) { sink.asExpr() instanceof Argument }
167+
module ContextFlow = TaintTracking::Global<ContextFlowConfig>;
168+
169+
import ContextFlow::PathGraph
158170
}
159171

160172
class RedirectToJsp extends ReturnStmt {
161173
File jsp;
162174

163175
RedirectToJsp() {
164-
exists(DataFlow2::Node strLit, DataFlow2::Node retVal, LiteralConfig lc |
165-
asLiteral(strLit.asExpr()).splitAt("/") + "_jsp.java" = jsp.getBaseName()
176+
exists(DataFlow2::Node strLit, DataFlow2::Node retVal |
177+
strLit.asExpr().(StringLiteral).getValue().splitAt("/") + "_jsp.java" = jsp.getBaseName()
166178
|
167-
retVal.asExpr() = this.getResult() and lc.hasFlow(strLit, retVal)
179+
retVal.asExpr() = this.getResult() and LiteralConfig::LiteralFlow::flow(strLit, retVal)
168180
)
169181
}
170182

171183
File getJspFile() { result = jsp }
172184
}
173185

174-
from DataFlow::PathNode source, DataFlow::PathNode sink, XSSConfig conf, JSPExpr jspe
175-
where conf.hasFlowPath(source, sink) and jspe.isClosest(sink.getNode().asExpr())
176-
select jspe, source, sink, "Cross-site scripting vulnerability due to $@.", source.getNode(),
177-
"user-provided value"
186+
from Xss::XssFlow::PathNode source, Xss::XssFlow::PathNode sink, JSPTaintStep jspts
187+
where
188+
Xss::XssFlow::flowPath(source, sink) and
189+
jspts.step(source.getNode(), sink.getNode())
190+
select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to $@.",
191+
source.getNode(), "user-provided value"

java/src/security/CWE-079/XSSJSP.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,5 @@ from Xss::XssFlow::PathNode source, Xss::XssFlow::PathNode sink, JSPTaintStep js
9090
where
9191
Xss::XssFlow::flowPath(source, sink) and
9292
jspts.step(source.getNode(), sink.getNode())
93-
select source, source, sink, "Cross-site scripting vulnerability due to $@.", source.getNode(),
94-
"user-provided value"
93+
select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to $@.",
94+
source.getNode(), "user-provided value"

0 commit comments

Comments
 (0)