Skip to content

Commit 9e78341

Browse files
authored
Merge pull request github#3928 from rvermeulen/java-importable-cwe-113
Java: Move `HeaderSplittingSink` and `WhitelistedSource` into importable library
2 parents 32d9d27 + c2733ad commit 9e78341

File tree

4 files changed

+53
-41
lines changed

4 files changed

+53
-41
lines changed

java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,16 @@
1111
*/
1212

1313
import java
14-
import ResponseSplitting
14+
import semmle.code.java.dataflow.FlowSources
15+
import semmle.code.java.security.ResponseSplitting
1516
import DataFlow::PathGraph
1617

1718
class ResponseSplittingConfig extends TaintTracking::Configuration {
1819
ResponseSplittingConfig() { this = "ResponseSplittingConfig" }
1920

2021
override predicate isSource(DataFlow::Node source) {
2122
source instanceof RemoteFlowSource and
22-
not source instanceof WhitelistedSource
23+
not source instanceof SafeHeaderSplittingSource
2324
}
2425

2526
override predicate isSink(DataFlow::Node sink) { sink instanceof HeaderSplittingSink }

java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qll

Lines changed: 0 additions & 38 deletions
This file was deleted.

java/ql/src/Security/CWE/CWE-113/ResponseSplittingLocal.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import java
1414
import semmle.code.java.dataflow.FlowSources
15-
import ResponseSplitting
15+
import semmle.code.java.security.ResponseSplitting
1616
import DataFlow::PathGraph
1717

1818
class ResponseSplittingLocalConfig extends TaintTracking::Configuration {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/** Provides classes to reason about header splitting attacks. */
2+
3+
import java
4+
import semmle.code.java.dataflow.DataFlow
5+
import semmle.code.java.dataflow.FlowSources
6+
import semmle.code.java.frameworks.Servlets
7+
import semmle.code.java.frameworks.JaxWS
8+
9+
/** A sink that is vulnerable to an HTTP header splitting attack. */
10+
abstract class HeaderSplittingSink extends DataFlow::Node { }
11+
12+
/** A source that introduces data considered safe to use by a header splitting source. */
13+
abstract class SafeHeaderSplittingSource extends DataFlow::Node {
14+
SafeHeaderSplittingSource() { this instanceof RemoteFlowSource }
15+
}
16+
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+
43+
/** A default source that introduces data considered safe to use by a header splitting source. */
44+
private class DefaultSafeHeaderSplittingSource extends SafeHeaderSplittingSource {
45+
DefaultSafeHeaderSplittingSource() {
46+
this.asExpr().(MethodAccess).getMethod() instanceof HttpServletRequestGetHeaderMethod or
47+
this.asExpr().(MethodAccess).getMethod() instanceof CookieGetNameMethod
48+
}
49+
}

0 commit comments

Comments
 (0)