Skip to content

Commit e387eba

Browse files
committed
add domNode.innerHTML += sink as a DOM sink
1 parent 74a79f8 commit e387eba

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,11 @@ class DomPropertyWrite extends DataFlow::Node instanceof DataFlow::PropWrite {
208208
/**
209209
* Gets the data flow node corresponding to the value being written.
210210
*/
211-
DataFlow::Node getRhs() { result = super.getRhs() }
211+
DataFlow::Node getRhs() {
212+
result = super.getRhs()
213+
or
214+
result = super.getWriteNode().(AssignAddExpr).getRhs().flow()
215+
}
212216
}
213217

214218
/**

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ nodes
116116
| classnames.js:15:47:15:63 | clsx(window.name) |
117117
| classnames.js:15:52:15:62 | window.name |
118118
| classnames.js:15:52:15:62 | window.name |
119+
| classnames.js:17:32:17:79 | `<span ... <span>` |
120+
| classnames.js:17:32:17:79 | `<span ... <span>` |
121+
| classnames.js:17:48:17:64 | clsx(window.name) |
122+
| classnames.js:17:53:17:63 | window.name |
123+
| classnames.js:17:53:17:63 | window.name |
119124
| clipboard.ts:8:11:8:51 | html |
120125
| clipboard.ts:8:11:8:51 | html |
121126
| clipboard.ts:8:18:8:51 | clipboa ... /html') |
@@ -1187,6 +1192,10 @@ edges
11871192
| classnames.js:15:47:15:63 | clsx(window.name) | classnames.js:15:31:15:78 | `<span ... <span>` |
11881193
| classnames.js:15:52:15:62 | window.name | classnames.js:15:47:15:63 | clsx(window.name) |
11891194
| classnames.js:15:52:15:62 | window.name | classnames.js:15:47:15:63 | clsx(window.name) |
1195+
| classnames.js:17:48:17:64 | clsx(window.name) | classnames.js:17:32:17:79 | `<span ... <span>` |
1196+
| classnames.js:17:48:17:64 | clsx(window.name) | classnames.js:17:32:17:79 | `<span ... <span>` |
1197+
| classnames.js:17:53:17:63 | window.name | classnames.js:17:48:17:64 | clsx(window.name) |
1198+
| classnames.js:17:53:17:63 | window.name | classnames.js:17:48:17:64 | clsx(window.name) |
11901199
| clipboard.ts:8:11:8:51 | html | clipboard.ts:15:25:15:28 | html |
11911200
| clipboard.ts:8:11:8:51 | html | clipboard.ts:15:25:15:28 | html |
11921201
| clipboard.ts:8:11:8:51 | html | clipboard.ts:15:25:15:28 | html |
@@ -2182,6 +2191,7 @@ edges
21822191
| classnames.js:11:31:11:79 | `<span ... <span>` | classnames.js:10:45:10:55 | window.name | classnames.js:11:31:11:79 | `<span ... <span>` | Cross-site scripting vulnerability due to $@. | classnames.js:10:45:10:55 | window.name | user-provided value |
21832192
| classnames.js:13:31:13:83 | `<span ... <span>` | classnames.js:13:57:13:67 | window.name | classnames.js:13:31:13:83 | `<span ... <span>` | Cross-site scripting vulnerability due to $@. | classnames.js:13:57:13:67 | window.name | user-provided value |
21842193
| classnames.js:15:31:15:78 | `<span ... <span>` | classnames.js:15:52:15:62 | window.name | classnames.js:15:31:15:78 | `<span ... <span>` | Cross-site scripting vulnerability due to $@. | classnames.js:15:52:15:62 | window.name | user-provided value |
2194+
| classnames.js:17:32:17:79 | `<span ... <span>` | classnames.js:17:53:17:63 | window.name | classnames.js:17:32:17:79 | `<span ... <span>` | Cross-site scripting vulnerability due to $@. | classnames.js:17:53:17:63 | window.name | user-provided value |
21852195
| clipboard.ts:15:25:15:28 | html | clipboard.ts:8:18:8:51 | clipboa ... /html') | clipboard.ts:15:25:15:28 | html | Cross-site scripting vulnerability due to $@. | clipboard.ts:8:18:8:51 | clipboa ... /html') | user-provided value |
21862196
| clipboard.ts:24:23:24:58 | e.clipb ... /html') | clipboard.ts:24:23:24:58 | e.clipb ... /html') | clipboard.ts:24:23:24:58 | e.clipb ... /html') | Cross-site scripting vulnerability due to $@. | clipboard.ts:24:23:24:58 | e.clipb ... /html') | user-provided value |
21872197
| clipboard.ts:29:19:29:54 | e.clipb ... /html') | clipboard.ts:29:19:29:54 | e.clipb ... /html') | clipboard.ts:29:19:29:54 | e.clipb ... /html') | Cross-site scripting vulnerability due to $@. | clipboard.ts:29:19:29:54 | e.clipb ... /html') | user-provided value |

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ nodes
116116
| classnames.js:15:47:15:63 | clsx(window.name) |
117117
| classnames.js:15:52:15:62 | window.name |
118118
| classnames.js:15:52:15:62 | window.name |
119+
| classnames.js:17:32:17:79 | `<span ... <span>` |
120+
| classnames.js:17:32:17:79 | `<span ... <span>` |
121+
| classnames.js:17:48:17:64 | clsx(window.name) |
122+
| classnames.js:17:53:17:63 | window.name |
123+
| classnames.js:17:53:17:63 | window.name |
119124
| clipboard.ts:8:11:8:51 | html |
120125
| clipboard.ts:8:11:8:51 | html |
121126
| clipboard.ts:8:18:8:51 | clipboa ... /html') |
@@ -1237,6 +1242,10 @@ edges
12371242
| classnames.js:15:47:15:63 | clsx(window.name) | classnames.js:15:31:15:78 | `<span ... <span>` |
12381243
| classnames.js:15:52:15:62 | window.name | classnames.js:15:47:15:63 | clsx(window.name) |
12391244
| classnames.js:15:52:15:62 | window.name | classnames.js:15:47:15:63 | clsx(window.name) |
1245+
| classnames.js:17:48:17:64 | clsx(window.name) | classnames.js:17:32:17:79 | `<span ... <span>` |
1246+
| classnames.js:17:48:17:64 | clsx(window.name) | classnames.js:17:32:17:79 | `<span ... <span>` |
1247+
| classnames.js:17:53:17:63 | window.name | classnames.js:17:48:17:64 | clsx(window.name) |
1248+
| classnames.js:17:53:17:63 | window.name | classnames.js:17:48:17:64 | clsx(window.name) |
12401249
| clipboard.ts:8:11:8:51 | html | clipboard.ts:15:25:15:28 | html |
12411250
| clipboard.ts:8:11:8:51 | html | clipboard.ts:15:25:15:28 | html |
12421251
| clipboard.ts:8:11:8:51 | html | clipboard.ts:15:25:15:28 | html |

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@ function main() {
1313
document.body.innerHTML = `<span class="${safeStyle(window.name)}">Hello<span>`; // NOT OK
1414
document.body.innerHTML = `<span class="${safeStyle('foo')}">Hello<span>`; // OK
1515
document.body.innerHTML = `<span class="${clsx(window.name)}">Hello<span>`; // NOT OK
16+
17+
document.body.innerHTML += `<span class="${clsx(window.name)}">Hello<span>`; // NOT OK
1618
}

0 commit comments

Comments
 (0)