diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/util/ZipUtils.java b/src/main/java/the/bytecode/club/bytecodeviewer/util/ZipUtils.java index 499fc662b..f7e9a648e 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/util/ZipUtils.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/util/ZipUtils.java @@ -35,6 +35,7 @@ */ public final class ZipUtils { + // TODO: Maybe migrate to org.apache.commons.compress.archivers.examples.Expander? /** * Unzip files to path. * @@ -67,6 +68,11 @@ public static void unzipFilesToPath(String jarPath, String destinationDir) throw String fileName = destinationDir + File.separator + entry.getName(); File f = new File(fileName); + if (!f.getCanonicalPath().startsWith(destinationDir)) { + System.out.println("Zip Slip exploit detected. Skipping entry " + entry.getName()); + continue; + } + File parent = f.getParentFile(); if (!parent.exists()) { parent.mkdirs(); @@ -106,7 +112,7 @@ public static void zipFile(File inputFile, File outputZip) { public static void zipFolder(String srcFolder, String destZipFile, String ignore) throws Exception { try (FileOutputStream fileWriter = new FileOutputStream(destZipFile); - ZipOutputStream zip = new ZipOutputStream(fileWriter)){ + ZipOutputStream zip = new ZipOutputStream(fileWriter)) { addFolderToZip("", srcFolder, zip, ignore); zip.flush(); } @@ -114,7 +120,7 @@ public static void zipFolder(String srcFolder, String destZipFile, String ignore public static void zipFolderAPKTool(String srcFolder, String destZipFile) throws Exception { try (FileOutputStream fileWriter = new FileOutputStream(destZipFile); - ZipOutputStream zip = new ZipOutputStream(fileWriter)){ + ZipOutputStream zip = new ZipOutputStream(fileWriter)) { addFolderToZipAPKTool("", srcFolder, zip); zip.flush(); } @@ -199,4 +205,4 @@ public static void addFolderToZipAPKTool(String path, String srcFolder, ZipOutpu } } } -} \ No newline at end of file +}