Skip to content

Commit 94cbc4b

Browse files
committed
add step through the fclone library
1 parent f99a335 commit 94cbc4b

File tree

5 files changed

+36
-3
lines changed

5 files changed

+36
-3
lines changed

javascript/change-notes/2021-06-24-json.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ lgtm,codescanning
77
[flatted](https://npmjs.com/package/flatted),
88
[teleport-javascript](https://npmjs.com/package/teleport-javascript),
99
[replicator](https://npmjs.com/package/replicator),
10-
[safe-stable-stringify](https://npmjs.com/package/safe-stable-stringify)
10+
[safe-stable-stringify](https://npmjs.com/package/safe-stable-stringify),
11+
[fclone](https://npmjs.com/package/fclone)

javascript/ql/src/semmle/javascript/Extend.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,11 @@ private class ExtendCallTaintStep extends TaintTracking::SharedTaintStep {
178178
private import semmle.javascript.dataflow.internal.PreCallGraphStep
179179

180180
/**
181-
* A step for the `clone` package.
181+
* A step through a cloning library, such as `clone` or `fclone`.
182182
*/
183183
private class CloneStep extends PreCallGraphStep {
184184
override predicate step(DataFlow::Node pred, DataFlow::Node succ) {
185-
exists(DataFlow::CallNode call | call = DataFlow::moduleImport("clone").getACall() |
185+
exists(DataFlow::CallNode call | call = DataFlow::moduleImport(["clone", "fclone"]).getACall() |
186186
pred = call.getArgument(0) and
187187
succ = call
188188
)

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,14 @@ nodes
190190
| tst2.js:49:36:49:36 | p |
191191
| tst2.js:51:12:51:17 | unsafe |
192192
| tst2.js:51:12:51:17 | unsafe |
193+
| tst2.js:57:7:57:24 | p |
194+
| tst2.js:57:9:57:9 | p |
195+
| tst2.js:57:9:57:9 | p |
196+
| tst2.js:60:11:60:11 | p |
197+
| tst2.js:63:12:63:12 | p |
198+
| tst2.js:63:12:63:12 | p |
199+
| tst2.js:64:12:64:18 | other.p |
200+
| tst2.js:64:12:64:18 | other.p |
193201
| tst3.js:5:7:5:24 | p |
194202
| tst3.js:5:9:5:9 | p |
195203
| tst3.js:5:9:5:9 | p |
@@ -359,6 +367,13 @@ edges
359367
| tst2.js:49:7:49:53 | unsafe | tst2.js:51:12:51:17 | unsafe |
360368
| tst2.js:49:16:49:53 | seriali ... true}) | tst2.js:49:7:49:53 | unsafe |
361369
| tst2.js:49:36:49:36 | p | tst2.js:49:16:49:53 | seriali ... true}) |
370+
| tst2.js:57:7:57:24 | p | tst2.js:60:11:60:11 | p |
371+
| tst2.js:57:7:57:24 | p | tst2.js:63:12:63:12 | p |
372+
| tst2.js:57:7:57:24 | p | tst2.js:63:12:63:12 | p |
373+
| tst2.js:57:9:57:9 | p | tst2.js:57:7:57:24 | p |
374+
| tst2.js:57:9:57:9 | p | tst2.js:57:7:57:24 | p |
375+
| tst2.js:60:11:60:11 | p | tst2.js:64:12:64:18 | other.p |
376+
| tst2.js:60:11:60:11 | p | tst2.js:64:12:64:18 | other.p |
362377
| tst3.js:5:7:5:24 | p | tst3.js:6:12:6:12 | p |
363378
| tst3.js:5:7:5:24 | p | tst3.js:6:12:6:12 | p |
364379
| tst3.js:5:9:5:9 | p | tst3.js:5:7:5:24 | p |
@@ -412,5 +427,7 @@ edges
412427
| tst2.js:36:12:36:12 | p | tst2.js:30:9:30:9 | p | tst2.js:36:12:36:12 | p | Cross-site scripting vulnerability due to $@. | tst2.js:30:9:30:9 | p | user-provided value |
413428
| tst2.js:37:12:37:18 | other.p | tst2.js:30:9:30:9 | p | tst2.js:37:12:37:18 | other.p | Cross-site scripting vulnerability due to $@. | tst2.js:30:9:30:9 | p | user-provided value |
414429
| tst2.js:51:12:51:17 | unsafe | tst2.js:43:9:43:9 | p | tst2.js:51:12:51:17 | unsafe | Cross-site scripting vulnerability due to $@. | tst2.js:43:9:43:9 | p | user-provided value |
430+
| tst2.js:63:12:63:12 | p | tst2.js:57:9:57:9 | p | tst2.js:63:12:63:12 | p | Cross-site scripting vulnerability due to $@. | tst2.js:57:9:57:9 | p | user-provided value |
431+
| tst2.js:64:12:64:18 | other.p | tst2.js:57:9:57:9 | p | tst2.js:64:12:64:18 | other.p | Cross-site scripting vulnerability due to $@. | tst2.js:57:9:57:9 | p | user-provided value |
415432
| tst3.js:6:12:6:12 | p | tst3.js:5:9:5:9 | p | tst3.js:6:12:6:12 | p | Cross-site scripting vulnerability due to $@. | tst3.js:5:9:5:9 | p | user-provided value |
416433
| tst3.js:12:12:12:15 | code | tst3.js:11:32:11:39 | reg.body | tst3.js:12:12:12:15 | code | Cross-site scripting vulnerability due to $@. | tst3.js:11:32:11:39 | reg.body | user-provided value |

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,7 @@
4040
| tst2.js:36:12:36:12 | p | Cross-site scripting vulnerability due to $@. | tst2.js:30:9:30:9 | p | user-provided value |
4141
| tst2.js:37:12:37:18 | other.p | Cross-site scripting vulnerability due to $@. | tst2.js:30:9:30:9 | p | user-provided value |
4242
| tst2.js:51:12:51:17 | unsafe | Cross-site scripting vulnerability due to $@. | tst2.js:43:9:43:9 | p | user-provided value |
43+
| tst2.js:63:12:63:12 | p | Cross-site scripting vulnerability due to $@. | tst2.js:57:9:57:9 | p | user-provided value |
44+
| tst2.js:64:12:64:18 | other.p | Cross-site scripting vulnerability due to $@. | tst2.js:57:9:57:9 | p | user-provided value |
4345
| tst3.js:6:12:6:12 | p | Cross-site scripting vulnerability due to $@. | tst3.js:5:9:5:9 | p | user-provided value |
4446
| tst3.js:12:12:12:15 | code | Cross-site scripting vulnerability due to $@. | tst3.js:11:32:11:39 | reg.body | user-provided value |

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,17 @@ app.get('/baz', function(req, res) {
4949
var unsafe = serializeJavaScript(p, {unsafe: true});
5050

5151
res.send(unsafe); // NOT OK
52+
});
53+
54+
const fclone = require('fclone');
55+
56+
app.get('/baz', function(req, res) {
57+
let { p } = req.params;
58+
59+
var obj = {};
60+
obj.p = p;
61+
var other = fclone(obj);
62+
63+
res.send(p); // NOT OK
64+
res.send(other.p); // NOT OK
5265
});

0 commit comments

Comments
 (0)