Skip to content

Commit 47a2018

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

File tree

1 file changed

+28
-21
lines changed

1 file changed

+28
-21
lines changed

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

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,26 @@ import java
1414
import semmle.code.java.dataflow.FlowSources
1515
import semmle.code.java.dataflow.TaintTracking2
1616
import semmle.code.java.security.XSS
17-
import DataFlow::PathGraph
1817
import JSPLocations
1918

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

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

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

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

29-
override predicate isSanitizerOut(DataFlow::Node node) { node instanceof XssSinkBarrier }
30-
31-
override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
32-
any(XssAdditionalTaintStep s).step(node1, node2)
29+
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
30+
exists(XssAdditionalTaintStep s | s.step(node1, node2))
31+
}
3332
}
33+
34+
module XssFlow = TaintTracking::Global<XssConfig>;
35+
36+
import XssFlow::PathGraph
3437
}
3538

3639
class JSPTaintStep extends XssAdditionalTaintStep {
@@ -57,31 +60,35 @@ class JSPTaintStep extends XssAdditionalTaintStep {
5760
}
5861
}
5962

60-
class LiteralConfig extends TaintTracking2::Configuration {
61-
LiteralConfig() { this = "LiteralConfig" }
63+
module LiteralConfig {
64+
module LiteralConfig implements DataFlow::ConfigSig {
65+
predicate isSource(DataFlow::Node source) { source.asExpr() instanceof StringLiteral }
6266

63-
override predicate isSource(DataFlow2::Node source) { source.asExpr() instanceof StringLiteral }
64-
65-
override predicate isSink(DataFlow2::Node sink) {
66-
exists(ReturnStmt rs | rs.getResult() = sink.asExpr())
67+
predicate isSink(DataFlow::Node sink) { exists(ReturnStmt rs | rs.getResult() = sink.asExpr()) }
6768
}
69+
70+
module LiteralFlow = TaintTracking::Global<LiteralConfig>;
71+
72+
import LiteralFlow::PathGraph
6873
}
6974

7075
class RedirectToJsp extends ReturnStmt {
7176
File jsp;
7277

7378
RedirectToJsp() {
74-
exists(DataFlow2::Node strLit, DataFlow2::Node retVal, LiteralConfig lc |
79+
exists(DataFlow2::Node strLit, DataFlow2::Node retVal |
7580
strLit.asExpr().(StringLiteral).getValue().splitAt("/") + "_jsp.java" = jsp.getBaseName()
7681
|
77-
retVal.asExpr() = this.getResult() and lc.hasFlow(strLit, retVal)
82+
retVal.asExpr() = this.getResult() and LiteralConfig::LiteralFlow::flow(strLit, retVal)
7883
)
7984
}
8085

8186
File getJspFile() { result = jsp }
8287
}
8388

84-
from DataFlow::PathNode source, DataFlow::PathNode sink, XSSConfig conf, JSPExpr jspe
85-
where conf.hasFlowPath(source, sink) and jspe.isClosest(sink.getNode().asExpr())
86-
select jspe, source, sink, "Cross-site scripting vulnerability due to $@.", source.getNode(),
89+
from Xss::XssFlow::PathNode source, Xss::XssFlow::PathNode sink, JSPTaintStep jspts
90+
where
91+
Xss::XssFlow::flowPath(source, sink) and
92+
jspts.step(source.getNode(), sink.getNode())
93+
select source, source, sink, "Cross-site scripting vulnerability due to $@.", source.getNode(),
8794
"user-provided value"

0 commit comments

Comments
 (0)