Skip to content

Commit 199a607

Browse files
authored
Merge pull request #154 from mockingbot/fix-zip-traversal-vulnerability
Fix zip traversal vulnerability
2 parents 2fdb740 + af7fbd0 commit 199a607

File tree

2 files changed

+16
-15
lines changed

2 files changed

+16
-15
lines changed

android/src/main/java/com/rnziparchive/RNZipArchiveModule.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,15 @@
2727
import java.util.zip.ZipEntry;
2828
import java.util.zip.ZipFile;
2929
import java.util.zip.ZipInputStream;
30-
import java.util.zip.ZipOutputStream;
3130

3231
import net.lingala.zip4j.exception.ZipException;
3332
import net.lingala.zip4j.model.FileHeader;
34-
import net.lingala.zip4j.progress.ProgressMonitor;
3533
import net.lingala.zip4j.model.ZipParameters;
3634
import net.lingala.zip4j.util.Zip4jConstants;
3735

3836
public class RNZipArchiveModule extends ReactContextBaseJavaModule {
3937
private static final String TAG = RNZipArchiveModule.class.getSimpleName();
4038

41-
private static final int BUFFER_SIZE = 4096;
4239
private static final String PROGRESS_EVENT_NAME = "zipArchiveProgressEvent";
4340
private static final String EVENT_KEY_FILENAME = "filePath";
4441
private static final String EVENT_KEY_PROGRESS = "progress";
@@ -83,14 +80,18 @@ public void run() {
8380
updateProgress(0, 1, zipFilePath); // force 0%
8481
for (int i = 0; i < totalFiles; i++) {
8582
FileHeader fileHeader = (FileHeader) fileHeaderList.get(i);
83+
84+
File fout = new File(destDirectory, fileHeader.getFileName());
85+
ensureZipPathSafety(fout, destDirectory);
86+
8687
zipFile.extractFile(fileHeader, destDirectory);
8788
if (!fileHeader.isDirectory()) {
8889
extractedFileNames.add(fileHeader.getFileName());
8990
}
9091
updateProgress(i + 1, totalFiles, zipFilePath);
9192
}
9293
promise.resolve(Arguments.fromList(extractedFileNames));
93-
} catch (ZipException ex) {
94+
} catch (Exception ex) {
9495
updateProgress(0, 1, zipFilePath); // force 0%
9596
promise.reject(null, String.format("Failed to unzip file, due to: %s", getStackTrace(ex)));
9697
}
@@ -161,11 +162,7 @@ public void onCopyProgress(long bytesRead) {
161162
};
162163

163164
File fout = new File(destDirectory, entry.getName());
164-
String destDirCanonicalPath = (new File(destDirectory)).getCanonicalPath();
165-
String canonicalPath = fout.getCanonicalPath();
166-
if (!canonicalPath.startsWith(destDirCanonicalPath)) {
167-
throw new Exception(String.format("Found Zip Path Traversal Vulnerability with %s", canonicalPath));
168-
}
165+
ensureZipPathSafety(fout, destDirectory);
169166

170167
if (!fout.exists()) {
171168
//noinspection ResultOfMethodCallIgnored
@@ -254,11 +251,7 @@ public void run() {
254251
if (entry.isDirectory()) continue;
255252
fout = new File(destDirectory, entry.getName());
256253

257-
String destDirCanonicalPath = (new File(destDirectory)).getCanonicalPath();
258-
String canonicalPath = fout.getCanonicalPath();
259-
if (!canonicalPath.startsWith(destDirCanonicalPath)) {
260-
throw new Exception(String.format("Found Zip Path Traversal Vulnerability with %s", canonicalPath));
261-
}
254+
ensureZipPathSafety(fout, destDirectory);
262255

263256
if (!fout.exists()) {
264257
//noinspection ResultOfMethodCallIgnored
@@ -493,4 +486,12 @@ private String getStackTrace(Exception e) {
493486
return sw.toString();
494487
}
495488

489+
private void ensureZipPathSafety(final File fout, final String destDirectory) throws Exception {
490+
String destDirCanonicalPath = (new File(destDirectory)).getCanonicalPath();
491+
String canonicalPath = fout.getCanonicalPath();
492+
if (!canonicalPath.startsWith(destDirCanonicalPath)) {
493+
throw new Exception(String.format("Found Zip Path Traversal Vulnerability with %s", canonicalPath));
494+
}
495+
}
496+
496497
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-native-zip-archive",
3-
"version": "4.1.1",
3+
"version": "4.1.2-beta.0",
44
"description": "A little wrapper on ZipArchive for react-native",
55
"main": "index.js",
66
"scripts": {

0 commit comments

Comments
 (0)