@@ -14,23 +14,26 @@ import java
1414import semmle.code.java.dataflow.FlowSources
1515import semmle.code.java.dataflow.TaintTracking2
1616import semmle.code.java.security.XSS
17- import DataFlow:: PathGraph
1817import JSPLocations
1918
20- class XSSConfig extends TaintTracking:: Configuration {
21- XSSConfig ( ) { this = "XSSConfig" }
19+ module Xss {
20+ module XssConfig implements DataFlow:: ConfigSig {
21+ predicate isSource ( DataFlow:: Node source ) { source instanceof RemoteFlowSource }
2222
23- override predicate isSource ( DataFlow:: Node source ) { source instanceof RemoteFlowSource }
23+ predicate isSink ( DataFlow:: Node sink ) { sink instanceof XssSink }
2424
25- override predicate isSink ( DataFlow:: Node sink ) { sink instanceof XssSink }
25+ predicate isBarrier ( DataFlow:: Node node ) { node instanceof XssSanitizer }
2626
27- override predicate isSanitizer ( DataFlow:: Node node ) { node instanceof XssSanitizer }
27+ predicate isBarrierOut ( DataFlow:: Node node ) { node instanceof XssSinkBarrier }
2828
29- override predicate isSanitizerOut ( DataFlow:: Node node ) { node instanceof XssSinkBarrier }
30-
31- override predicate isAdditionalTaintStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
32- any ( XssAdditionalTaintStep s ) .step ( node1 , node2 )
29+ predicate isAdditionalFlowStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
30+ exists ( XssAdditionalTaintStep s | s .step ( node1 , node2 ) )
31+ }
3332 }
33+
34+ module XssFlow = TaintTracking:: Global< XssConfig > ;
35+
36+ import XssFlow:: PathGraph
3437}
3538
3639class JSPTaintStep extends XssAdditionalTaintStep {
@@ -57,31 +60,35 @@ class JSPTaintStep extends XssAdditionalTaintStep {
5760 }
5861}
5962
60- class LiteralConfig extends TaintTracking2:: Configuration {
61- LiteralConfig ( ) { this = "LiteralConfig" }
63+ module LiteralConfig {
64+ module LiteralConfig implements DataFlow:: ConfigSig {
65+ predicate isSource ( DataFlow:: Node source ) { source .asExpr ( ) instanceof StringLiteral }
6266
63- override predicate isSource ( DataFlow2:: Node source ) { source .asExpr ( ) instanceof StringLiteral }
64-
65- override predicate isSink ( DataFlow2:: Node sink ) {
66- exists ( ReturnStmt rs | rs .getResult ( ) = sink .asExpr ( ) )
67+ predicate isSink ( DataFlow:: Node sink ) { exists ( ReturnStmt rs | rs .getResult ( ) = sink .asExpr ( ) ) }
6768 }
69+
70+ module LiteralFlow = TaintTracking:: Global< LiteralConfig > ;
71+
72+ import LiteralFlow:: PathGraph
6873}
6974
7075class RedirectToJsp extends ReturnStmt {
7176 File jsp ;
7277
7378 RedirectToJsp ( ) {
74- exists ( DataFlow2:: Node strLit , DataFlow2:: Node retVal , LiteralConfig lc |
79+ exists ( DataFlow2:: Node strLit , DataFlow2:: Node retVal |
7580 strLit .asExpr ( ) .( StringLiteral ) .getValue ( ) .splitAt ( "/" ) + "_jsp.java" = jsp .getBaseName ( )
7681 |
77- retVal .asExpr ( ) = this .getResult ( ) and lc . hasFlow ( strLit , retVal )
82+ retVal .asExpr ( ) = this .getResult ( ) and LiteralConfig :: LiteralFlow :: flow ( strLit , retVal )
7883 )
7984 }
8085
8186 File getJspFile ( ) { result = jsp }
8287}
8388
84- from DataFlow:: PathNode source , DataFlow:: PathNode sink , XSSConfig conf , JSPExpr jspe
85- where conf .hasFlowPath ( source , sink ) and jspe .isClosest ( sink .getNode ( ) .asExpr ( ) )
86- select jspe , source , sink , "Cross-site scripting vulnerability due to $@." , source .getNode ( ) ,
89+ from Xss:: XssFlow:: PathNode source , Xss:: XssFlow:: PathNode sink , JSPTaintStep jspts
90+ where
91+ Xss:: XssFlow:: flowPath ( source , sink ) and
92+ jspts .step ( source .getNode ( ) , sink .getNode ( ) )
93+ select source , source , sink , "Cross-site scripting vulnerability due to $@." , source .getNode ( ) ,
8794 "user-provided value"
0 commit comments