@@ -14,23 +14,26 @@ import java
14
14
import semmle.code.java.dataflow.FlowSources
15
15
import semmle.code.java.dataflow.TaintTracking2
16
16
import semmle.code.java.security.XSS
17
- import DataFlow:: PathGraph
18
17
import JSPLocations
19
18
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 }
22
22
23
- override predicate isSource ( DataFlow:: Node source ) { source instanceof RemoteFlowSource }
23
+ predicate isSink ( DataFlow:: Node sink ) { sink instanceof XssSink }
24
24
25
- override predicate isSink ( DataFlow:: Node sink ) { sink instanceof XssSink }
25
+ predicate isBarrier ( DataFlow:: Node node ) { node instanceof XssSanitizer }
26
26
27
- override predicate isSanitizer ( DataFlow:: Node node ) { node instanceof XssSanitizer }
27
+ predicate isBarrierOut ( DataFlow:: Node node ) { node instanceof XssSinkBarrier }
28
28
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
+ }
33
32
}
33
+
34
+ module XssFlow = TaintTracking:: Global< XssConfig > ;
35
+
36
+ import XssFlow:: PathGraph
34
37
}
35
38
36
39
class JSPTaintStep extends XssAdditionalTaintStep {
@@ -57,31 +60,35 @@ class JSPTaintStep extends XssAdditionalTaintStep {
57
60
}
58
61
}
59
62
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 }
62
66
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 ( ) ) }
67
68
}
69
+
70
+ module LiteralFlow = TaintTracking:: Global< LiteralConfig > ;
71
+
72
+ import LiteralFlow:: PathGraph
68
73
}
69
74
70
75
class RedirectToJsp extends ReturnStmt {
71
76
File jsp ;
72
77
73
78
RedirectToJsp ( ) {
74
- exists ( DataFlow2:: Node strLit , DataFlow2:: Node retVal , LiteralConfig lc |
79
+ exists ( DataFlow2:: Node strLit , DataFlow2:: Node retVal |
75
80
strLit .asExpr ( ) .( StringLiteral ) .getValue ( ) .splitAt ( "/" ) + "_jsp.java" = jsp .getBaseName ( )
76
81
|
77
- retVal .asExpr ( ) = this .getResult ( ) and lc . hasFlow ( strLit , retVal )
82
+ retVal .asExpr ( ) = this .getResult ( ) and LiteralConfig :: LiteralFlow :: flow ( strLit , retVal )
78
83
)
79
84
}
80
85
81
86
File getJspFile ( ) { result = jsp }
82
87
}
83
88
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 ( ) ,
87
94
"user-provided value"
0 commit comments