Skip to content

Commit d4e6e77

Browse files
committed
Java: Refactor StackTraceExposure, XSS.qll
1 parent c4cf2fe commit d4e6e77

File tree

2 files changed

+26
-35
lines changed

2 files changed

+26
-35
lines changed

java/ql/lib/semmle/code/java/security/XSS.qll

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import semmle.code.java.frameworks.spring.SpringController
77
import semmle.code.java.frameworks.spring.SpringHttp
88
import semmle.code.java.frameworks.javaee.jsf.JSFRenderer
99
import semmle.code.java.dataflow.DataFlow
10-
import semmle.code.java.dataflow.TaintTracking2
10+
import semmle.code.java.dataflow.TaintTracking
1111
private import semmle.code.java.dataflow.ExternalFlow
1212

1313
/** A sink that represent a method that outputs data without applying contextual output encoding. */
@@ -41,9 +41,9 @@ private class DefaultXssSink extends XssSink {
4141
DefaultXssSink() {
4242
sinkNode(this, "xss")
4343
or
44-
exists(XssVulnerableWriterSourceToWritingMethodFlowConfig writer, MethodAccess ma |
44+
exists(MethodAccess ma |
4545
ma.getMethod() instanceof WritingMethod and
46-
writer.hasFlowToExpr(ma.getQualifier()) and
46+
XssVulnerableWriterSourceToWritingMethodFlow::hasFlowToExpr(ma.getQualifier()) and
4747
this.asExpr() = ma.getArgument(_)
4848
)
4949
}
@@ -60,22 +60,19 @@ private class DefaultXssSanitizer extends XssSanitizer {
6060
}
6161

6262
/** A configuration that tracks data from a servlet writer to an output method. */
63-
private class XssVulnerableWriterSourceToWritingMethodFlowConfig extends TaintTracking2::Configuration {
64-
XssVulnerableWriterSourceToWritingMethodFlowConfig() {
65-
this = "XSS::XssVulnerableWriterSourceToWritingMethodFlowConfig"
66-
}
63+
private module XssVulnerableWriterSourceToWritingMethodFlowConfig implements DataFlow::ConfigSig {
64+
predicate isSource(DataFlow::Node src) { src.asExpr() instanceof XssVulnerableWriterSource }
6765

68-
override predicate isSource(DataFlow::Node src) {
69-
src.asExpr() instanceof XssVulnerableWriterSource
70-
}
71-
72-
override predicate isSink(DataFlow::Node sink) {
66+
predicate isSink(DataFlow::Node sink) {
7367
exists(MethodAccess ma |
7468
sink.asExpr() = ma.getQualifier() and ma.getMethod() instanceof WritingMethod
7569
)
7670
}
7771
}
7872

73+
private module XssVulnerableWriterSourceToWritingMethodFlow =
74+
TaintTracking::Make<XssVulnerableWriterSourceToWritingMethodFlowConfig>;
75+
7976
/** A method that can be used to output data to an output stream or writer. */
8077
private class WritingMethod extends Method {
8178
WritingMethod() {

java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,33 +31,27 @@ class PrintStackTraceMethod extends Method {
3131
}
3232
}
3333

34-
class ServletWriterSourceToPrintStackTraceMethodFlowConfig extends TaintTracking::Configuration {
35-
ServletWriterSourceToPrintStackTraceMethodFlowConfig() {
36-
this = "StackTraceExposure::ServletWriterSourceToPrintStackTraceMethodFlowConfig"
37-
}
38-
39-
override predicate isSource(DataFlow::Node src) {
40-
src.asExpr() instanceof XssVulnerableWriterSource
41-
}
34+
module ServletWriterSourceToPrintStackTraceMethodFlowConfig implements DataFlow::ConfigSig {
35+
predicate isSource(DataFlow::Node src) { src.asExpr() instanceof XssVulnerableWriterSource }
4236

43-
override predicate isSink(DataFlow::Node sink) {
37+
predicate isSink(DataFlow::Node sink) {
4438
exists(MethodAccess ma |
4539
sink.asExpr() = ma.getAnArgument() and ma.getMethod() instanceof PrintStackTraceMethod
4640
)
4741
}
4842
}
4943

44+
module ServletWriterSourceToPrintStackTraceMethodFlow =
45+
TaintTracking::Make<ServletWriterSourceToPrintStackTraceMethodFlowConfig>;
46+
5047
/**
5148
* A call that uses `Throwable.printStackTrace()` on a stream that is connected
5249
* to external output.
5350
*/
5451
predicate printsStackToWriter(MethodAccess call) {
55-
exists(
56-
ServletWriterSourceToPrintStackTraceMethodFlowConfig writerSource,
57-
PrintStackTraceMethod printStackTrace
58-
|
52+
exists(PrintStackTraceMethod printStackTrace |
5953
call.getMethod() = printStackTrace and
60-
writerSource.hasFlowToExpr(call.getAnArgument())
54+
ServletWriterSourceToPrintStackTraceMethodFlow::hasFlowToExpr(call.getAnArgument())
6155
)
6256
}
6357

@@ -86,16 +80,15 @@ predicate stackTraceExpr(Expr exception, MethodAccess stackTraceString) {
8680
)
8781
}
8882

89-
class StackTraceStringToHttpResponseSinkFlowConfig extends TaintTracking::Configuration {
90-
StackTraceStringToHttpResponseSinkFlowConfig() {
91-
this = "StackTraceExposure::StackTraceStringToHttpResponseSinkFlowConfig"
92-
}
93-
94-
override predicate isSource(DataFlow::Node src) { stackTraceExpr(_, src.asExpr()) }
83+
module StackTraceStringToHttpResponseSinkFlowConfig implements DataFlow::ConfigSig {
84+
predicate isSource(DataFlow::Node src) { stackTraceExpr(_, src.asExpr()) }
9585

96-
override predicate isSink(DataFlow::Node sink) { sink instanceof InformationLeakSink }
86+
predicate isSink(DataFlow::Node sink) { sink instanceof InformationLeakSink }
9787
}
9888

89+
module StackTraceStringToHttpResponseSinkFlow =
90+
TaintTracking::Make<StackTraceStringToHttpResponseSinkFlowConfig>;
91+
9992
/**
10093
* A write of stack trace data to an external stream.
10194
*/
@@ -109,9 +102,10 @@ predicate printsStackExternally(MethodAccess call, Expr stackTrace) {
109102
* A stringified stack trace flows to an external sink.
110103
*/
111104
predicate stringifiedStackFlowsExternally(DataFlow::Node externalExpr, Expr stackTrace) {
112-
exists(MethodAccess stackTraceString, StackTraceStringToHttpResponseSinkFlowConfig conf |
105+
exists(MethodAccess stackTraceString |
113106
stackTraceExpr(stackTrace, stackTraceString) and
114-
conf.hasFlow(DataFlow::exprNode(stackTraceString), externalExpr)
107+
StackTraceStringToHttpResponseSinkFlow::hasFlow(DataFlow::exprNode(stackTraceString),
108+
externalExpr)
115109
)
116110
}
117111

0 commit comments

Comments
 (0)