Skip to content

Commit 0b7a667

Browse files
committed
Java: Convert header splitting sinks to CSV format
1 parent f329c3f commit 0b7a667

File tree

2 files changed

+17
-27
lines changed

2 files changed

+17
-27
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ private module Frameworks {
7676
private import semmle.code.java.frameworks.ApacheHttp
7777
private import semmle.code.java.frameworks.apache.Lang
7878
private import semmle.code.java.frameworks.guava.Guava
79+
private import semmle.code.java.security.ResponseSplitting
7980
}
8081

8182
private predicate sourceModelCsv(string row) {

java/ql/src/semmle/code/java/security/ResponseSplitting.qll

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,30 @@ import semmle.code.java.dataflow.DataFlow
55
import semmle.code.java.dataflow.FlowSources
66
import semmle.code.java.frameworks.Servlets
77
import semmle.code.java.frameworks.JaxWS
8+
private import semmle.code.java.dataflow.ExternalFlow
89

910
/** A sink that is vulnerable to an HTTP header splitting attack. */
10-
abstract class HeaderSplittingSink extends DataFlow::Node { }
11+
class HeaderSplittingSink extends DataFlow::Node {
12+
HeaderSplittingSink() { sinkNode(this, "header-splitting") }
13+
}
14+
15+
private class HeaderSplittingSinkModel extends SinkModelCsv {
16+
override predicate row(string row) {
17+
row =
18+
[
19+
"javax.servlet.http;HttpServletResponse;false;addCookie;;;Argument[0];header-splitting",
20+
"javax.servlet.http;HttpServletResponse;false;addHeader;;;Argument;header-splitting",
21+
"javax.servlet.http;HttpServletResponse;false;setHeader;;;Argument;header-splitting",
22+
"javax.ws.rs.core;ResponseBuilder;false;header;;;Argument[1];header-splitting"
23+
]
24+
}
25+
}
1126

1227
/** A source that introduces data considered safe to use by a header splitting source. */
1328
abstract class SafeHeaderSplittingSource extends DataFlow::Node {
1429
SafeHeaderSplittingSource() { this instanceof RemoteFlowSource }
1530
}
1631

17-
/** A sink that identifies a Java Servlet or JaxWs method that is vulnerable to an HTTP header splitting attack. */
18-
private class ServletHeaderSplittingSink extends HeaderSplittingSink {
19-
ServletHeaderSplittingSink() {
20-
exists(ResponseAddCookieMethod m, MethodAccess ma |
21-
ma.getMethod() = m and
22-
this.asExpr() = ma.getArgument(0)
23-
)
24-
or
25-
exists(ResponseAddHeaderMethod m, MethodAccess ma |
26-
ma.getMethod() = m and
27-
this.asExpr() = ma.getAnArgument()
28-
)
29-
or
30-
exists(ResponseSetHeaderMethod m, MethodAccess ma |
31-
ma.getMethod() = m and
32-
this.asExpr() = ma.getAnArgument()
33-
)
34-
or
35-
exists(JaxRsResponseBuilder builder, Method m |
36-
m = builder.getAMethod() and m.getName() = "header"
37-
|
38-
this.asExpr() = m.getAReference().getArgument(1)
39-
)
40-
}
41-
}
42-
4332
/** A default source that introduces data considered safe to use by a header splitting source. */
4433
private class DefaultSafeHeaderSplittingSource extends SafeHeaderSplittingSource {
4534
DefaultSafeHeaderSplittingSource() {

0 commit comments

Comments
 (0)