Skip to content

Commit 41d034d

Browse files
committed
Attempt to use information-leak sink category
1 parent ece84d1 commit 41d034d

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import java
1616
import semmle.code.java.dataflow.DataFlow
1717
import semmle.code.java.dataflow.TaintTracking
1818
import semmle.code.java.security.XSS
19+
import semmle.code.java.security.InformationLeak
1920

2021
/**
2122
* One of the `printStackTrace()` overloads on `Throwable`.
@@ -83,14 +84,17 @@ predicate stackTraceExpr(Expr exception, MethodAccess stackTraceString) {
8384
)
8485
}
8586

86-
class StackTraceStringToXssSinkFlowConfig extends TaintTracking::Configuration {
87-
StackTraceStringToXssSinkFlowConfig() {
88-
this = "StackTraceExposure::StackTraceStringToXssSinkFlowConfig"
87+
class StackTraceStringToHTTPResponseSinkFlowConfig extends TaintTracking::Configuration {
88+
StackTraceStringToHTTPResponseSinkFlowConfig() {
89+
this = "StackTraceExposure::StackTraceStringToHTTPResponseSinkFlowConfig"
8990
}
9091

9192
override predicate isSource(DataFlow::Node src) { stackTraceExpr(_, src.asExpr()) }
9293

93-
override predicate isSink(DataFlow::Node sink) { sink instanceof XssSink }
94+
override predicate isSink(DataFlow::Node sink) {
95+
sink instanceof XssSink or
96+
sink instanceof InformationLeakSink
97+
}
9498
}
9599

96100
/**
@@ -106,7 +110,7 @@ predicate printsStackExternally(MethodAccess call, Expr stackTrace) {
106110
* A stringified stack trace flows to an external sink.
107111
*/
108112
predicate stringifiedStackFlowsExternally(XssSink externalExpr, Expr stackTrace) {
109-
exists(MethodAccess stackTraceString, StackTraceStringToXssSinkFlowConfig conf |
113+
exists(MethodAccess stackTraceString, StackTraceStringToHTTPResponseSinkFlowConfig conf |
110114
stackTraceExpr(stackTrace, stackTraceString) and
111115
conf.hasFlow(DataFlow::exprNode(stackTraceString), externalExpr)
112116
)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ private module Frameworks {
7979
private import semmle.code.java.frameworks.guava.Guava
8080
private import semmle.code.java.frameworks.jackson.JacksonSerializability
8181
private import semmle.code.java.security.ResponseSplitting
82+
private import semmle.code.java.security.InformationLeak
8283
private import semmle.code.java.security.XSS
8384
private import semmle.code.java.security.LdapInjection
8485
private import semmle.code.java.security.XPath
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/** Provides classes to reason about System Information Leak vulnerabilities. */
2+
3+
import java
4+
import semmle.code.java.dataflow.DataFlow
5+
import semmle.code.java.dataflow.ExternalFlow
6+
7+
/** CSV sink models representing methods not susceptible to XSS but outputing to an HTTP response body. */
8+
private class DefaultInformationLeakSinkModel extends SinkModelCsv {
9+
override predicate row(string row) {
10+
row =
11+
[
12+
"javax.servlet.http;HttpServletResponse;false;sendError;(int,String);;Argument[1];information-leak"
13+
]
14+
}
15+
}
16+
17+
/** A sink that represent a method that outputs data to an HTTP response. */
18+
abstract class InformationLeakSink extends DataFlow::Node { }
19+
20+
/** A default sink representing methods outputing data to an HTTP response. */
21+
private class DefaultInformationLeakSink extends InformationLeakSink {
22+
DefaultInformationLeakSink() { sinkNode(this, "information-leak") }
23+
}

0 commit comments

Comments
 (0)