Skip to content

Commit 4eda6f6

Browse files
committed
JS: Recognize subclasses of HTMLElement in domValueRef
1 parent cff8dc0 commit 4eda6f6

File tree

3 files changed

+20
-0
lines changed

3 files changed

+20
-0
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,13 @@ module DOM {
420420
t.startInProp("target") and
421421
result = domEventSource()
422422
or
423+
t.start() and
424+
exists(DataFlow::ClassNode cls |
425+
cls.getASuperClassNode().getALocalSource() =
426+
DataFlow::globalVarRef(any(string s | s.matches("HTML%Element"))) and
427+
result = cls.getAReceiverNode()
428+
)
429+
or
423430
exists(DataFlow::TypeTracker t2 | result = domValueRef(t2).track(t2, t))
424431
}
425432

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ nodes
136136
| clipboard.ts:33:19:33:68 | e.origi ... /html') |
137137
| clipboard.ts:33:19:33:68 | e.origi ... /html') |
138138
| clipboard.ts:33:19:33:68 | e.origi ... /html') |
139+
| custom-element.js:5:26:5:36 | window.name |
140+
| custom-element.js:5:26:5:36 | window.name |
141+
| custom-element.js:5:26:5:36 | window.name |
142+
| custom-element.js:5:26:5:36 | window.name |
139143
| d3.js:4:12:4:22 | window.name |
140144
| d3.js:4:12:4:22 | window.name |
141145
| d3.js:4:12:4:22 | window.name |
@@ -1130,6 +1134,7 @@ edges
11301134
| clipboard.ts:24:23:24:58 | e.clipb ... /html') | clipboard.ts:24:23:24:58 | e.clipb ... /html') |
11311135
| clipboard.ts:29:19:29:54 | e.clipb ... /html') | clipboard.ts:29:19:29:54 | e.clipb ... /html') |
11321136
| clipboard.ts:33:19:33:68 | e.origi ... /html') | clipboard.ts:33:19:33:68 | e.origi ... /html') |
1137+
| custom-element.js:5:26:5:36 | window.name | custom-element.js:5:26:5:36 | window.name |
11331138
| d3.js:4:12:4:22 | window.name | d3.js:11:15:11:24 | getTaint() |
11341139
| d3.js:4:12:4:22 | window.name | d3.js:11:15:11:24 | getTaint() |
11351140
| d3.js:4:12:4:22 | window.name | d3.js:11:15:11:24 | getTaint() |
@@ -2062,6 +2067,7 @@ edges
20622067
| 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 |
20632068
| 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 |
20642069
| clipboard.ts:33:19:33:68 | e.origi ... /html') | clipboard.ts:33:19:33:68 | e.origi ... /html') | clipboard.ts:33:19:33:68 | e.origi ... /html') | Cross-site scripting vulnerability due to $@. | clipboard.ts:33:19:33:68 | e.origi ... /html') | user-provided value |
2070+
| custom-element.js:5:26:5:36 | window.name | custom-element.js:5:26:5:36 | window.name | custom-element.js:5:26:5:36 | window.name | Cross-site scripting vulnerability due to $@. | custom-element.js:5:26:5:36 | window.name | user-provided value |
20652071
| d3.js:11:15:11:24 | getTaint() | d3.js:4:12:4:22 | window.name | d3.js:11:15:11:24 | getTaint() | Cross-site scripting vulnerability due to $@. | d3.js:4:12:4:22 | window.name | user-provided value |
20662072
| d3.js:12:20:12:29 | getTaint() | d3.js:4:12:4:22 | window.name | d3.js:12:20:12:29 | getTaint() | Cross-site scripting vulnerability due to $@. | d3.js:4:12:4:22 | window.name | user-provided value |
20672073
| d3.js:14:20:14:29 | getTaint() | d3.js:4:12:4:22 | window.name | d3.js:14:20:14:29 | getTaint() | Cross-site scripting vulnerability due to $@. | d3.js:4:12:4:22 | window.name | user-provided value |
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import * as dummy from 'dummy';
2+
3+
class CustomElm extends HTMLElement {
4+
test() {
5+
this.innerHTML = window.name; // NOT OK
6+
}
7+
}

0 commit comments

Comments
 (0)