@@ -5,41 +5,30 @@ import semmle.code.java.dataflow.DataFlow
5
5
import semmle.code.java.dataflow.FlowSources
6
6
import semmle.code.java.frameworks.Servlets
7
7
import semmle.code.java.frameworks.JaxWS
8
+ private import semmle.code.java.dataflow.ExternalFlow
8
9
9
10
/** 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
+ }
11
26
12
27
/** A source that introduces data considered safe to use by a header splitting source. */
13
28
abstract class SafeHeaderSplittingSource extends DataFlow:: Node {
14
29
SafeHeaderSplittingSource ( ) { this instanceof RemoteFlowSource }
15
30
}
16
31
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
32
/** A default source that introduces data considered safe to use by a header splitting source. */
44
33
private class DefaultSafeHeaderSplittingSource extends SafeHeaderSplittingSource {
45
34
DefaultSafeHeaderSplittingSource ( ) {
0 commit comments