Headline
CVE-2022-21675: Mitigate Zip Slip exlpoit · Konloch/bytecode-viewer@c968e94
Bytecode Viewer (BCV) is a Java/Android reverse engineering suite. Versions of the package prior to 2.11.0 are vulnerable to Arbitrary File Write via Archive Extraction (AKA “Zip Slip”). The vulnerability is exploited using a specially crafted archive that holds directory traversal filenames (e.g. …/…/evil.exe). The Zip Slip vulnerability can affect numerous archive formats, including zip, jar, tar, war, cpio, apk, rar and 7z. The attacker can then overwrite executable files and either invoke them remotely or wait for the system or user to call them, thus achieving remote command execution on the victim’s machine. The impact of a Zip Slip vulnerability would allow an attacker to create or overwrite existing files on the filesystem. In the context of a web application, a web shell could be placed within the application directory to achieve code execution. All users should upgrade to BCV v2.11.0 when possible to receive a patch. There are no recommended workarounds aside from upgrading.
@@ -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,15 +112,15 @@ 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(); } }
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 } } } } }