Skip to content

Commit 313134c

Browse files
authored
Merge pull request #1148 from xiemaisi/js/adm-zip
Approved by esben-semmle
2 parents 395089d + 4533e1f commit 313134c

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

javascript/ql/src/semmle/javascript/security/dataflow/ZipSlip.qll

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,26 @@ module ZipSlip {
9191
}
9292
}
9393

94+
/** An archive entry path access using the `adm-zip` package. */
95+
class AdmZipEntrySource extends Source {
96+
AdmZipEntrySource() {
97+
exists(DataFlow::SourceNode admZip, DataFlow::SourceNode entry |
98+
admZip = DataFlow::moduleImport("adm-zip").getAnInstantiation() and
99+
this = entry.getAPropertyRead("entryName")
100+
|
101+
entry = admZip.getAMethodCall("getEntry")
102+
or
103+
exists(DataFlow::SourceNode entries | entries = admZip.getAMethodCall("getEntries") |
104+
entry = entries.getAPropertyRead()
105+
or
106+
exists(string map | map = "map" or map = "forEach" |
107+
entry = entries.getAMethodCall(map).getCallback(0).getParameter(0)
108+
)
109+
)
110+
)
111+
}
112+
}
113+
94114
/** A call to `fs.createWriteStream`, as a sink for unsafe archive extraction. */
95115
class CreateWriteStreamSink extends Sink {
96116
CreateWriteStreamSink() {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const fs = require('fs');
2+
var AdmZip = require('adm-zip');
3+
var zip = new AdmZip("archive.zip");
4+
var zipEntries = zip.getEntries();
5+
zipEntries.forEach(function(zipEntry) {
6+
fs.createWriteStream(zipEntry.entryName);
7+
});

javascript/ql/test/query-tests/Security/CWE-022/ZipSlip/ZipSlip.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
nodes
2+
| AdmZipBad.js:6:24:6:41 | zipEntry.entryName |
23
| TarSlipBad.js:6:36:6:46 | header.name |
34
| ZipSlipBad2.js:5:9:5:46 | fileName |
45
| ZipSlipBad2.js:5:20:5:46 | 'output ... ry.path |
@@ -19,6 +20,7 @@ edges
1920
| ZipSlipBadUnzipper.js:7:9:7:29 | fileName | ZipSlipBadUnzipper.js:8:37:8:44 | fileName |
2021
| ZipSlipBadUnzipper.js:7:20:7:29 | entry.path | ZipSlipBadUnzipper.js:7:9:7:29 | fileName |
2122
#select
23+
| AdmZipBad.js:6:24:6:41 | zipEntry.entryName | AdmZipBad.js:6:24:6:41 | zipEntry.entryName | AdmZipBad.js:6:24:6:41 | zipEntry.entryName | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | AdmZipBad.js:6:24:6:41 | zipEntry.entryName | item path |
2224
| TarSlipBad.js:6:36:6:46 | header.name | TarSlipBad.js:6:36:6:46 | header.name | TarSlipBad.js:6:36:6:46 | header.name | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | TarSlipBad.js:6:36:6:46 | header.name | item path |
2325
| ZipSlipBad2.js:6:22:6:29 | fileName | ZipSlipBad2.js:5:37:5:46 | entry.path | ZipSlipBad2.js:6:22:6:29 | fileName | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBad2.js:5:37:5:46 | entry.path | item path |
2426
| ZipSlipBad.js:8:37:8:44 | fileName | ZipSlipBad.js:7:22:7:31 | entry.path | ZipSlipBad.js:8:37:8:44 | fileName | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBad.js:7:22:7:31 | entry.path | item path |

0 commit comments

Comments
 (0)