Skip to content

Commit bdba647

Browse files
author
Max Schaefer
authored
Merge pull request #1893 from erik-semmle/addXLinkHref
JS: add xlink:href as xss target when using setAttribute
2 parents 79f456e + 2729566 commit bdba647

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ class DomMethodCallExpr extends MethodCallExpr {
8585
name = "setAttributeNS" and argPos = 2
8686
) and
8787
// restrict to potentially dangerous attributes
88-
exists(string attr | attr = "action" or attr = "formaction" or attr = "href" or attr = "src" |
88+
exists(string attr |
89+
attr = "action" or attr = "formaction" or attr = "href" or attr = "src" or attr = "xlink:href" |
8990
getArgument(argPos - 1).getStringValue().toLowerCase() = attr
9091
)
9192
)

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ nodes
5858
| tst3.js:4:25:4:32 | data.src |
5959
| tst3.js:5:26:5:29 | data |
6060
| tst3.js:5:26:5:31 | data.p |
61+
| tst3.js:7:32:7:35 | data |
62+
| tst3.js:7:32:7:37 | data.p |
63+
| tst3.js:9:37:9:40 | data |
64+
| tst3.js:9:37:9:42 | data.p |
65+
| tst3.js:10:38:10:41 | data |
66+
| tst3.js:10:38:10:43 | data.p |
6167
| tst.js:2:7:2:39 | target |
6268
| tst.js:2:16:2:32 | document.location |
6369
| tst.js:2:16:2:39 | documen ... .search |
@@ -226,12 +232,18 @@ edges
226232
| translate.js:7:42:7:60 | target.substring(1) | translate.js:9:27:9:50 | searchP ... 'term') |
227233
| tst3.js:2:12:2:75 | JSON.pa ... tr(1))) | tst3.js:4:25:4:28 | data |
228234
| tst3.js:2:12:2:75 | JSON.pa ... tr(1))) | tst3.js:5:26:5:29 | data |
235+
| tst3.js:2:12:2:75 | JSON.pa ... tr(1))) | tst3.js:7:32:7:35 | data |
236+
| tst3.js:2:12:2:75 | JSON.pa ... tr(1))) | tst3.js:9:37:9:40 | data |
237+
| tst3.js:2:12:2:75 | JSON.pa ... tr(1))) | tst3.js:10:38:10:41 | data |
229238
| tst3.js:2:23:2:74 | decodeU ... str(1)) | tst3.js:2:12:2:75 | JSON.pa ... tr(1))) |
230239
| tst3.js:2:42:2:56 | window.location | tst3.js:2:42:2:63 | window. ... .search |
231240
| tst3.js:2:42:2:63 | window. ... .search | tst3.js:2:42:2:73 | window. ... bstr(1) |
232241
| tst3.js:2:42:2:73 | window. ... bstr(1) | tst3.js:2:23:2:74 | decodeU ... str(1)) |
233242
| tst3.js:4:25:4:28 | data | tst3.js:4:25:4:32 | data.src |
234243
| tst3.js:5:26:5:29 | data | tst3.js:5:26:5:31 | data.p |
244+
| tst3.js:7:32:7:35 | data | tst3.js:7:32:7:37 | data.p |
245+
| tst3.js:9:37:9:40 | data | tst3.js:9:37:9:42 | data.p |
246+
| tst3.js:10:38:10:41 | data | tst3.js:10:38:10:43 | data.p |
235247
| tst.js:2:7:2:39 | target | tst.js:5:18:5:23 | target |
236248
| tst.js:2:7:2:39 | target | tst.js:12:28:12:33 | target |
237249
| tst.js:2:7:2:39 | target | tst.js:23:42:23:47 | target |
@@ -361,6 +373,9 @@ edges
361373
| translate.js:9:27:9:50 | searchP ... 'term') | translate.js:6:16:6:32 | document.location | translate.js:9:27:9:50 | searchP ... 'term') | Cross-site scripting vulnerability due to $@. | translate.js:6:16:6:32 | document.location | user-provided value |
362374
| tst3.js:4:25:4:32 | data.src | tst3.js:2:42:2:56 | window.location | tst3.js:4:25:4:32 | data.src | Cross-site scripting vulnerability due to $@. | tst3.js:2:42:2:56 | window.location | user-provided value |
363375
| tst3.js:5:26:5:31 | data.p | tst3.js:2:42:2:56 | window.location | tst3.js:5:26:5:31 | data.p | Cross-site scripting vulnerability due to $@. | tst3.js:2:42:2:56 | window.location | user-provided value |
376+
| tst3.js:7:32:7:37 | data.p | tst3.js:2:42:2:56 | window.location | tst3.js:7:32:7:37 | data.p | Cross-site scripting vulnerability due to $@. | tst3.js:2:42:2:56 | window.location | user-provided value |
377+
| tst3.js:9:37:9:42 | data.p | tst3.js:2:42:2:56 | window.location | tst3.js:9:37:9:42 | data.p | Cross-site scripting vulnerability due to $@. | tst3.js:2:42:2:56 | window.location | user-provided value |
378+
| tst3.js:10:38:10:43 | data.p | tst3.js:2:42:2:56 | window.location | tst3.js:10:38:10:43 | data.p | Cross-site scripting vulnerability due to $@. | tst3.js:2:42:2:56 | window.location | user-provided value |
364379
| tst.js:5:18:5:23 | target | tst.js:2:16:2:32 | document.location | tst.js:5:18:5:23 | target | Cross-site scripting vulnerability due to $@. | tst.js:2:16:2:32 | document.location | user-provided value |
365380
| tst.js:8:18:8:126 | "<OPTIO ... PTION>" | tst.js:8:37:8:53 | document.location | tst.js:8:18:8:126 | "<OPTIO ... PTION>" | Cross-site scripting vulnerability due to $@. | tst.js:8:37:8:53 | document.location | user-provided value |
366381
| tst.js:12:5:12:42 | '<div s ... 'px">' | tst.js:2:16:2:32 | document.location | tst.js:12:5:12:42 | '<div s ... 'px">' | Cross-site scripting vulnerability due to $@. | tst.js:2:16:2:32 | document.location | user-provided value |

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ var data = JSON.parse(decodeURIComponent(window.location.search.substr(1)));
44
foo.setAttribute("src", data.src); // NOT OK
55
foo.setAttribute("HREF", data.p); // NOT OK
66
foo.setAttribute("width", data.w); // OK
7+
foo.setAttribute("xlink:href", data.p) // NOT OK
8+
9+
foo.setAttributeNS('xlink', 'href', data.p); // NOT OK
10+
foo.setAttributeNS('foobar', 'href', data.p); // NOT OK
11+
foo.setAttributeNS('baz', 'width', data.w); // OK
12+
713

814
for (var p in data)
915
foo.setAttribute(p, data[p]); // not flagged since attribute name is unknown

0 commit comments

Comments
 (0)