Skip to content

Commit e95ccee

Browse files
committed
import all the shared XSS sources and sinks
1 parent 65a018c commit e95ccee

File tree

6 files changed

+57
-17
lines changed

6 files changed

+57
-17
lines changed

javascript/ql/src/Security/CWE-079/ExceptionXss.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@ from
2121
where
2222
cfg.hasFlowPath(source, sink)
2323
select sink.getNode(), source, sink,
24-
sink.getNode().(Sink).getVulnerabilityKind() + " vulnerability due to $@.", source.getNode(),
24+
sink.getNode().(XSS::Shared::Sink).getVulnerabilityKind() + " vulnerability due to $@.", source.getNode(),
2525
"user-provided value"

javascript/ql/src/semmle/javascript/security/dataflow/ExceptionXss.qll

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
/**
2-
* Provides a taint-tracking configuration for TODO:
2+
* Provides a taint-tracking configuration for reasoning about cross-site
3+
* scripting vulnerabilities where the taint-flow passes through a thrown
4+
* exception.
35
*/
46

57
import javascript
68

79
module ExceptionXss {
8-
import Xss::DomBasedXss // imports sinks
9-
import DomBasedXssCustomizations::DomBasedXss // imports sources
10+
import DomBasedXssCustomizations::DomBasedXss as DomBasedXssCustom
11+
import ReflectedXssCustomizations::ReflectedXss as ReflectedXssCustom
12+
import Xss::DomBasedXss as DomBasedXss
13+
import Xss::ReflectedXss as ReflectedXSS
14+
import Xss::StoredXss as StoredXss
15+
import Xss as XSS
1016

1117
DataFlow::Node getExceptionalSuccssor(DataFlow::Node pred) {
1218
exists(DataFlow::FunctionNode func |
@@ -53,16 +59,16 @@ module ExceptionXss {
5359
Configuration() { this = "ExceptionXss"}
5460

5561
override predicate isSource(DataFlow::Node source, DataFlow::FlowLabel label) {
56-
source instanceof Source and label instanceof NotYetThrown
62+
source instanceof XSS::Shared::Source and label instanceof NotYetThrown
5763
}
5864

5965
override predicate isSink(DataFlow::Node sink, DataFlow::FlowLabel label) {
60-
sink instanceof Sink and label.isDataOrTaint()
66+
sink instanceof XSS::Shared::Sink and label.isDataOrTaint()
6167
}
6268

6369
override predicate isSanitizer(DataFlow::Node node) {
6470
super.isSanitizer(node) or
65-
node instanceof Sanitizer
71+
node instanceof XSS::Shared::Sanitizer
6672
}
6773

6874
override predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ, DataFlow::FlowLabel inlbl, DataFlow::FlowLabel outlbl) {

javascript/ql/src/semmle/javascript/security/dataflow/ReflectedXss.qll

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import javascript
77

88
module ReflectedXss {
9-
import Xss::ReflectedXss
9+
import ReflectedXssCustomizations::ReflectedXss
1010

1111
/**
1212
* A taint-tracking configuration for reasoning about XSS.
@@ -23,13 +23,4 @@ module ReflectedXss {
2323
node instanceof Sanitizer
2424
}
2525
}
26-
27-
/** A third-party controllable request input, considered as a flow source for reflected XSS. */
28-
class ThirdPartyRequestInputAccessAsSource extends Source {
29-
ThirdPartyRequestInputAccessAsSource() {
30-
this.(HTTP::RequestInputAccess).isThirdPartyControllable()
31-
or
32-
this.(HTTP::RequestHeaderAccess).getAHeaderName() = "referer"
33-
}
34-
}
3526
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* Provides default sources for reasoning about reflected
3+
* cross-site scripting vulnerabilities.
4+
*/
5+
6+
import javascript
7+
8+
module ReflectedXss {
9+
import Xss::ReflectedXss
10+
11+
/** A third-party controllable request input, considered as a flow source for reflected XSS. */
12+
class ThirdPartyRequestInputAccessAsSource extends Source {
13+
ThirdPartyRequestInputAccessAsSource() {
14+
this.(HTTP::RequestInputAccess).isThirdPartyControllable()
15+
or
16+
this.(HTTP::RequestHeaderAccess).getAHeaderName() = "referer"
17+
}
18+
}
19+
}

javascript/ql/test/query-tests/Security/CWE-079/ExceptionXss.expected

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ nodes
5252
| exception-xss.js:96:10:96:10 | e |
5353
| exception-xss.js:97:18:97:18 | e |
5454
| exception-xss.js:97:18:97:18 | e |
55+
| exception-xss.js:107:13:107:25 | req.params.id |
56+
| exception-xss.js:107:13:107:25 | req.params.id |
57+
| exception-xss.js:108:11:108:11 | e |
58+
| exception-xss.js:109:14:109:30 | "Exception: " + e |
59+
| exception-xss.js:109:14:109:30 | "Exception: " + e |
60+
| exception-xss.js:109:30:109:30 | e |
5561
edges
5662
| exception-xss.js:2:9:2:31 | foo | exception-xss.js:9:11:9:13 | foo |
5763
| exception-xss.js:2:9:2:31 | foo | exception-xss.js:15:9:15:11 | foo |
@@ -107,6 +113,11 @@ edges
107113
| exception-xss.js:95:12:95:14 | foo | exception-xss.js:95:11:95:22 | [foo, "bar"] |
108114
| exception-xss.js:96:10:96:10 | e | exception-xss.js:97:18:97:18 | e |
109115
| exception-xss.js:96:10:96:10 | e | exception-xss.js:97:18:97:18 | e |
116+
| exception-xss.js:107:13:107:25 | req.params.id | exception-xss.js:108:11:108:11 | e |
117+
| exception-xss.js:107:13:107:25 | req.params.id | exception-xss.js:108:11:108:11 | e |
118+
| exception-xss.js:108:11:108:11 | e | exception-xss.js:109:30:109:30 | e |
119+
| exception-xss.js:109:30:109:30 | e | exception-xss.js:109:14:109:30 | "Exception: " + e |
120+
| exception-xss.js:109:30:109:30 | e | exception-xss.js:109:14:109:30 | "Exception: " + e |
110121
#select
111122
| exception-xss.js:11:18:11:18 | e | exception-xss.js:2:15:2:31 | document.location | exception-xss.js:11:18:11:18 | e | Cross-site scripting vulnerability due to $@. | exception-xss.js:2:15:2:31 | document.location | user-provided value |
112123
| exception-xss.js:17:18:17:18 | e | exception-xss.js:2:15:2:31 | document.location | exception-xss.js:17:18:17:18 | e | Cross-site scripting vulnerability due to $@. | exception-xss.js:2:15:2:31 | document.location | user-provided value |

javascript/ql/test/query-tests/Security/CWE-079/exception-xss.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,16 @@
9797
$('myId').html(e); // NOT OK!
9898
}
9999
});
100+
101+
var express = require('express');
102+
103+
var app = express();
104+
105+
app.get('/user/:id', function(req, res) {
106+
try {
107+
unknown(req.params.id);
108+
} catch(e) {
109+
res.send("Exception: " + e); // NOT OK!
110+
}
111+
});
112+

0 commit comments

Comments
 (0)