@@ -5,41 +5,30 @@ import semmle.code.java.dataflow.DataFlow
55import semmle.code.java.dataflow.FlowSources
66import semmle.code.java.frameworks.Servlets
77import 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. */
1328abstract 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. */
4433private class DefaultSafeHeaderSplittingSource extends SafeHeaderSplittingSource {
4534 DefaultSafeHeaderSplittingSource ( ) {
0 commit comments