Skip to content

Commit 7c9edff

Browse files
authored
Merge pull request #18964 from Napalys/js/mark_down_table
JS: Refactor `markdown-table` library modeling
2 parents b583e52 + 1ad8b46 commit 7c9edff

File tree

6 files changed

+21
-15
lines changed

6 files changed

+21
-15
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Improved the modeling of the `markdown-table` package to ensure it handles nested arrays properly.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/javascript-all
4+
extensible: summaryModel
5+
data:
6+
- ["markdown-table", "", "Argument[0].ArrayElement.ArrayElement", "ReturnValue", "taint"]

javascript/ql/lib/semmle/javascript/frameworks/Markdown.qll

-13
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,6 @@ module Markdown {
4646
}
4747
}
4848

49-
/**
50-
* A taint step for the `markdown-table` library.
51-
*/
52-
private class MarkdownTableStep extends MarkdownStep {
53-
override predicate step(DataFlow::Node pred, DataFlow::Node succ) {
54-
exists(DataFlow::CallNode call | call = DataFlow::moduleImport("markdown-table").getACall() |
55-
// TODO: needs a flow summary to ensure ArrayElement content is unfolded
56-
succ = call and
57-
pred = call.getArgument(0)
58-
)
59-
}
60-
}
61-
6249
/**
6350
* A taint step for the `showdown` library.
6451
*/

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

+8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ edges
22
| ReflectedXss.js:8:33:8:45 | req.params.id | ReflectedXss.js:8:14:8:45 | "Unknow ... rams.id | provenance | |
33
| ReflectedXss.js:17:31:17:39 | params.id | ReflectedXss.js:17:12:17:39 | "Unknow ... rams.id | provenance | |
44
| ReflectedXss.js:23:19:23:26 | req.body | ReflectedXss.js:23:12:23:27 | marked(req.body) | provenance | |
5+
| ReflectedXss.js:30:7:33:4 | mytable | ReflectedXss.js:34:12:34:18 | mytable | provenance | |
6+
| ReflectedXss.js:30:17:33:4 | table([ ... y]\\n ]) | ReflectedXss.js:30:7:33:4 | mytable | provenance | |
7+
| ReflectedXss.js:32:14:32:21 | req.body | ReflectedXss.js:30:17:33:4 | table([ ... y]\\n ]) | provenance | |
58
| ReflectedXss.js:42:31:42:38 | req.body | ReflectedXss.js:42:12:42:39 | convert ... q.body) | provenance | |
69
| ReflectedXss.js:64:14:64:21 | req.body | ReflectedXss.js:64:39:64:42 | file | provenance | |
710
| ReflectedXss.js:64:39:64:42 | file | ReflectedXss.js:65:16:65:19 | file | provenance | |
@@ -152,6 +155,10 @@ nodes
152155
| ReflectedXss.js:23:12:23:27 | marked(req.body) | semmle.label | marked(req.body) |
153156
| ReflectedXss.js:23:19:23:26 | req.body | semmle.label | req.body |
154157
| ReflectedXss.js:29:12:29:19 | req.body | semmle.label | req.body |
158+
| ReflectedXss.js:30:7:33:4 | mytable | semmle.label | mytable |
159+
| ReflectedXss.js:30:17:33:4 | table([ ... y]\\n ]) | semmle.label | table([ ... y]\\n ]) |
160+
| ReflectedXss.js:32:14:32:21 | req.body | semmle.label | req.body |
161+
| ReflectedXss.js:34:12:34:18 | mytable | semmle.label | mytable |
155162
| ReflectedXss.js:41:12:41:19 | req.body | semmle.label | req.body |
156163
| ReflectedXss.js:42:12:42:39 | convert ... q.body) | semmle.label | convert ... q.body) |
157164
| ReflectedXss.js:42:31:42:38 | req.body | semmle.label | req.body |
@@ -340,6 +347,7 @@ subpaths
340347
| ReflectedXss.js:22:12:22:19 | req.body | ReflectedXss.js:22:12:22:19 | req.body | ReflectedXss.js:22:12:22:19 | req.body | Cross-site scripting vulnerability due to a $@. | ReflectedXss.js:22:12:22:19 | req.body | user-provided value |
341348
| ReflectedXss.js:23:12:23:27 | marked(req.body) | ReflectedXss.js:23:19:23:26 | req.body | ReflectedXss.js:23:12:23:27 | marked(req.body) | Cross-site scripting vulnerability due to a $@. | ReflectedXss.js:23:19:23:26 | req.body | user-provided value |
342349
| ReflectedXss.js:29:12:29:19 | req.body | ReflectedXss.js:29:12:29:19 | req.body | ReflectedXss.js:29:12:29:19 | req.body | Cross-site scripting vulnerability due to a $@. | ReflectedXss.js:29:12:29:19 | req.body | user-provided value |
350+
| ReflectedXss.js:34:12:34:18 | mytable | ReflectedXss.js:32:14:32:21 | req.body | ReflectedXss.js:34:12:34:18 | mytable | Cross-site scripting vulnerability due to a $@. | ReflectedXss.js:32:14:32:21 | req.body | user-provided value |
343351
| ReflectedXss.js:41:12:41:19 | req.body | ReflectedXss.js:41:12:41:19 | req.body | ReflectedXss.js:41:12:41:19 | req.body | Cross-site scripting vulnerability due to a $@. | ReflectedXss.js:41:12:41:19 | req.body | user-provided value |
344352
| ReflectedXss.js:42:12:42:39 | convert ... q.body) | ReflectedXss.js:42:31:42:38 | req.body | ReflectedXss.js:42:12:42:39 | convert ... q.body) | Cross-site scripting vulnerability due to a $@. | ReflectedXss.js:42:31:42:38 | req.body | user-provided value |
345353
| ReflectedXss.js:56:12:56:19 | req.body | ReflectedXss.js:56:12:56:19 | req.body | ReflectedXss.js:56:12:56:19 | req.body | Cross-site scripting vulnerability due to a $@. | ReflectedXss.js:56:12:56:19 | req.body | user-provided value |

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ app.get('/user/:id', function(req, res) {
3131
['Name', 'Content'],
3232
['body', req.body]
3333
]);
34-
res.send(mytable); // NOT OK - FIXME: only works in OLD dataflow, add implicit reads before library-contributed taint steps
34+
res.send(mytable); // NOT OK
3535
});
3636

3737
var showdown = require('showdown');
@@ -122,4 +122,4 @@ app.get("invalid/keys/:id", async (req, res) => {
122122
res.status(400).send(`${invalidKeys.join(', ')} not in whitelist`);
123123
return;
124124
}
125-
});
125+
});

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

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
| ReflectedXss.js:22:12:22:19 | req.body | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:22:12:22:19 | req.body | user-provided value |
44
| ReflectedXss.js:23:12:23:27 | marked(req.body) | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:23:19:23:26 | req.body | user-provided value |
55
| ReflectedXss.js:29:12:29:19 | req.body | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:29:12:29:19 | req.body | user-provided value |
6+
| ReflectedXss.js:34:12:34:18 | mytable | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:32:14:32:21 | req.body | user-provided value |
67
| ReflectedXss.js:41:12:41:19 | req.body | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:41:12:41:19 | req.body | user-provided value |
78
| ReflectedXss.js:42:12:42:39 | convert ... q.body) | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:42:31:42:38 | req.body | user-provided value |
89
| ReflectedXss.js:56:12:56:19 | req.body | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:56:12:56:19 | req.body | user-provided value |

0 commit comments

Comments
 (0)