Skip to content

Commit 4c06eb8

Browse files
committed
JS: Add test showing FPs
1 parent 04a0d47 commit 4c06eb8

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

javascript/ql/test/query-tests/Security/CWE-601/ClientSideUrlRedirect/ClientSideUrlRedirect.expected

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,31 @@
11
nodes
2+
| sanitizer.js:2:9:2:25 | url |
3+
| sanitizer.js:2:15:2:25 | window.name |
4+
| sanitizer.js:2:15:2:25 | window.name |
5+
| sanitizer.js:4:27:4:29 | url |
6+
| sanitizer.js:4:27:4:29 | url |
7+
| sanitizer.js:7:27:7:29 | url |
8+
| sanitizer.js:7:27:7:29 | url |
9+
| sanitizer.js:10:27:10:29 | url |
10+
| sanitizer.js:10:27:10:29 | url |
11+
| sanitizer.js:13:27:13:29 | url |
12+
| sanitizer.js:13:27:13:29 | url |
13+
| sanitizer.js:16:27:16:29 | url |
14+
| sanitizer.js:16:27:16:29 | url |
15+
| sanitizer.js:19:27:19:29 | url |
16+
| sanitizer.js:19:27:19:29 | url |
17+
| sanitizer.js:22:27:22:29 | url |
18+
| sanitizer.js:22:27:22:29 | url |
19+
| sanitizer.js:25:27:25:29 | url |
20+
| sanitizer.js:25:27:25:29 | url |
21+
| sanitizer.js:28:27:28:29 | url |
22+
| sanitizer.js:28:27:28:29 | url |
23+
| sanitizer.js:31:27:31:29 | url |
24+
| sanitizer.js:31:27:31:29 | url |
25+
| sanitizer.js:34:27:34:29 | url |
26+
| sanitizer.js:34:27:34:29 | url |
27+
| sanitizer.js:37:27:37:29 | url |
28+
| sanitizer.js:37:27:37:29 | url |
229
| tst2.js:2:7:2:33 | href |
330
| tst2.js:2:7:2:33 | href |
431
| tst2.js:2:14:2:28 | window.location |
@@ -80,6 +107,32 @@ nodes
80107
| tst.js:6:34:6:50 | document.location |
81108
| tst.js:6:34:6:55 | documen ... on.href |
82109
edges
110+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:4:27:4:29 | url |
111+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:4:27:4:29 | url |
112+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:7:27:7:29 | url |
113+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:7:27:7:29 | url |
114+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:10:27:10:29 | url |
115+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:10:27:10:29 | url |
116+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:13:27:13:29 | url |
117+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:13:27:13:29 | url |
118+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:16:27:16:29 | url |
119+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:16:27:16:29 | url |
120+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:19:27:19:29 | url |
121+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:19:27:19:29 | url |
122+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:22:27:22:29 | url |
123+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:22:27:22:29 | url |
124+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:25:27:25:29 | url |
125+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:25:27:25:29 | url |
126+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:28:27:28:29 | url |
127+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:28:27:28:29 | url |
128+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:31:27:31:29 | url |
129+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:31:27:31:29 | url |
130+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:34:27:34:29 | url |
131+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:34:27:34:29 | url |
132+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:37:27:37:29 | url |
133+
| sanitizer.js:2:9:2:25 | url | sanitizer.js:37:27:37:29 | url |
134+
| sanitizer.js:2:15:2:25 | window.name | sanitizer.js:2:9:2:25 | url |
135+
| sanitizer.js:2:15:2:25 | window.name | sanitizer.js:2:9:2:25 | url |
83136
| tst2.js:2:7:2:33 | href | tst2.js:4:21:4:24 | href |
84137
| tst2.js:2:7:2:33 | href | tst2.js:4:21:4:24 | href |
85138
| tst2.js:2:14:2:28 | window.location | tst2.js:2:14:2:33 | window.location.href |
@@ -155,6 +208,18 @@ edges
155208
| tst.js:6:34:6:50 | document.location | tst.js:6:34:6:55 | documen ... on.href |
156209
| tst.js:6:34:6:55 | documen ... on.href | tst.js:6:20:6:56 | indirec ... n.href) |
157210
#select
211+
| sanitizer.js:4:27:4:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:4:27:4:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
212+
| sanitizer.js:7:27:7:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:7:27:7:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
213+
| sanitizer.js:10:27:10:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:10:27:10:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
214+
| sanitizer.js:13:27:13:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:13:27:13:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
215+
| sanitizer.js:16:27:16:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:16:27:16:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
216+
| sanitizer.js:19:27:19:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:19:27:19:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
217+
| sanitizer.js:22:27:22:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:22:27:22:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
218+
| sanitizer.js:25:27:25:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:25:27:25:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
219+
| sanitizer.js:28:27:28:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:28:27:28:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
220+
| sanitizer.js:31:27:31:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:31:27:31:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
221+
| sanitizer.js:34:27:34:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:34:27:34:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
222+
| sanitizer.js:37:27:37:29 | url | sanitizer.js:2:15:2:25 | window.name | sanitizer.js:37:27:37:29 | url | Untrusted URL redirection due to $@. | sanitizer.js:2:15:2:25 | window.name | user-provided value |
158223
| tst2.js:4:21:4:55 | href.su ... '?')+1) | tst2.js:2:14:2:28 | window.location | tst2.js:4:21:4:55 | href.su ... '?')+1) | Untrusted URL redirection due to $@. | tst2.js:2:14:2:28 | window.location | user-provided value |
159224
| tst6.js:4:21:4:28 | redirect | tst6.js:2:18:2:45 | $locati ... irect') | tst6.js:4:21:4:28 | redirect | Untrusted URL redirection due to $@. | tst6.js:2:18:2:45 | $locati ... irect') | user-provided value |
160225
| tst6.js:6:17:6:24 | redirect | tst6.js:2:18:2:45 | $locati ... irect') | tst6.js:6:17:6:24 | redirect | Untrusted URL redirection due to $@. | tst6.js:2:18:2:45 | $locati ... irect') | user-provided value |
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
function f() {
2+
let url = window.name;
3+
if (url.startsWith('https://example.com')) {
4+
window.location = url; // NOT OK - can be example.com.evil.com
5+
}
6+
if (url.startsWith('https://example.com/')) {
7+
window.location = url; // OK - but flagged anyway
8+
}
9+
if (url.startsWith('https://example.com//')) {
10+
window.location = url; // OK - but flagged anyway
11+
}
12+
if (url.startsWith('https://example.com/foo')) {
13+
window.location = url; // OK - but flagged anyway
14+
}
15+
if (url.startsWith('https://')) {
16+
window.location = url; // NOT OK - does not restrict hostname
17+
}
18+
if (url.startsWith('https:/')) {
19+
window.location = url; // NOT OK - does not restrict hostname
20+
}
21+
if (url.startsWith('https:')) {
22+
window.location = url; // NOT OK - does not restrict hostname
23+
}
24+
if (url.startsWith('/')) {
25+
window.location = url; // NOT OK - can be //evil.com
26+
}
27+
if (url.startsWith('//')) {
28+
window.location = url; // NOT OK - can be //evil.com
29+
}
30+
if (url.startsWith('//example.com')) {
31+
window.location = url; // NOT OK - can be //example.com.evil.com
32+
}
33+
if (url.startsWith('//example.com/')) {
34+
window.location = url; // OK - but flagged anyway
35+
}
36+
if (url.endsWith('https://example.com/')) {
37+
window.location = url; // NOT OK - could be evil.com?x=https://example.com/
38+
}
39+
}

0 commit comments

Comments
 (0)