Skip to content

Commit 2bba905

Browse files
committed
better callgraph support for global variables
1 parent 663d4e8 commit 2bba905

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,11 @@ module AccessPath {
243243
root.isGlobal()
244244
)
245245
or
246+
exists(Assignment assign |
247+
fromReference(assign.getLhs().flow(), root) = result and
248+
node = assign.getRhs().flow()
249+
)
250+
or
246251
exists(FunctionDeclStmt fun |
247252
node = DataFlow::valueNode(fun) and
248253
result = fun.getIdentifier().(GlobalVarDecl).getName() and

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ nodes
159159
| xss-through-dom.js:141:25:141:27 | src |
160160
| xss-through-dom.js:150:24:150:26 | src |
161161
| xss-through-dom.js:150:24:150:26 | src |
162+
| xss-through-dom.js:154:25:154:27 | msg |
163+
| xss-through-dom.js:155:27:155:29 | msg |
164+
| xss-through-dom.js:155:27:155:29 | msg |
165+
| xss-through-dom.js:159:34:159:52 | $("textarea").val() |
166+
| xss-through-dom.js:159:34:159:52 | $("textarea").val() |
162167
edges
163168
| forms.js:8:23:8:28 | values | forms.js:9:31:9:36 | values |
164169
| forms.js:8:23:8:28 | values | forms.js:9:31:9:36 | values |
@@ -263,6 +268,10 @@ edges
263268
| xss-through-dom.js:139:11:139:52 | src | xss-through-dom.js:150:24:150:26 | src |
264269
| xss-through-dom.js:139:17:139:52 | documen ... k").src | xss-through-dom.js:139:11:139:52 | src |
265270
| xss-through-dom.js:139:17:139:52 | documen ... k").src | xss-through-dom.js:139:11:139:52 | src |
271+
| xss-through-dom.js:154:25:154:27 | msg | xss-through-dom.js:155:27:155:29 | msg |
272+
| xss-through-dom.js:154:25:154:27 | msg | xss-through-dom.js:155:27:155:29 | msg |
273+
| xss-through-dom.js:159:34:159:52 | $("textarea").val() | xss-through-dom.js:154:25:154:27 | msg |
274+
| xss-through-dom.js:159:34:159:52 | $("textarea").val() | xss-through-dom.js:154:25:154:27 | msg |
266275
#select
267276
| forms.js:9:31:9:40 | values.foo | forms.js:8:23:8:28 | values | forms.js:9:31:9:40 | values.foo | $@ is reinterpreted as HTML without escaping meta-characters. | forms.js:8:23:8:28 | values | DOM text |
268277
| forms.js:12:31:12:40 | values.bar | forms.js:11:24:11:29 | values | forms.js:12:31:12:40 | values.bar | $@ is reinterpreted as HTML without escaping meta-characters. | forms.js:11:24:11:29 | values | DOM text |
@@ -307,3 +316,4 @@ edges
307316
| xss-through-dom.js:140:19:140:21 | src | xss-through-dom.js:139:17:139:52 | documen ... k").src | xss-through-dom.js:140:19:140:21 | src | $@ is reinterpreted as HTML without escaping meta-characters. | xss-through-dom.js:139:17:139:52 | documen ... k").src | DOM text |
308317
| xss-through-dom.js:141:25:141:27 | src | xss-through-dom.js:139:17:139:52 | documen ... k").src | xss-through-dom.js:141:25:141:27 | src | $@ is reinterpreted as HTML without escaping meta-characters. | xss-through-dom.js:139:17:139:52 | documen ... k").src | DOM text |
309318
| xss-through-dom.js:150:24:150:26 | src | xss-through-dom.js:139:17:139:52 | documen ... k").src | xss-through-dom.js:150:24:150:26 | src | $@ is reinterpreted as HTML without escaping meta-characters. | xss-through-dom.js:139:17:139:52 | documen ... k").src | DOM text |
319+
| xss-through-dom.js:155:27:155:29 | msg | xss-through-dom.js:159:34:159:52 | $("textarea").val() | xss-through-dom.js:155:27:155:29 | msg | $@ is reinterpreted as HTML without escaping meta-characters. | xss-through-dom.js:159:34:159:52 | $("textarea").val() | DOM text |

javascript/ql/test/query-tests/Security/CWE-079/XssThroughDom/xss-through-dom.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,15 @@ const cashDom = require("cash-dom");
148148
cashDom("#id").html(DOMPurify ? DOMPurify.sanitize(src) : src); // OK
149149

150150
$("<a />", { html: src }).appendTo("#id"); // NOT OK
151+
152+
function foo() {
153+
window.VeryUniqueXssTestName = {
154+
send: function (msg) {
155+
$("#id").html(msg); // NOT OK
156+
},
157+
};
158+
159+
VeryUniqueXssTestName.send($("textarea").val());
160+
}
161+
foo()
151162
})();

0 commit comments

Comments
 (0)