Fix directory traversal on bad jar/zip files
Signed-off-by: Joakim Erdfelt <joakim.erdfelt@gmail.com>
This commit is contained in:
parent
f8a6a0f5bc
commit
a84fe38fef
|
@ -198,7 +198,14 @@ public class FS
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Path destFile = destination.resolve(entry.getName());
|
String entryName = entry.getName();
|
||||||
|
Path destFile = destination.resolve(entryName).normalize().toAbsolutePath();
|
||||||
|
// make sure extracted path does not escape the destination directory
|
||||||
|
if (!destFile.startsWith(destination))
|
||||||
|
{
|
||||||
|
throw new IOException(String.format("Malicious Archive %s found with bad entry \"%s\"",
|
||||||
|
archive, entryName));
|
||||||
|
}
|
||||||
if (!Files.exists(destFile))
|
if (!Files.exists(destFile))
|
||||||
{
|
{
|
||||||
FS.ensureDirectoryExists(destFile.getParent());
|
FS.ensureDirectoryExists(destFile.getParent());
|
||||||
|
|
|
@ -14,12 +14,18 @@
|
||||||
package org.eclipse.jetty.start;
|
package org.eclipse.jetty.start;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.toolchain.test.MavenPaths;
|
||||||
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
|
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
|
||||||
|
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
public class FSTest
|
public class FSTest
|
||||||
|
@ -45,6 +51,17 @@ public class FSTest
|
||||||
assertTrue(FS.canReadFile(pom.toPath()), "Can read file: " + pom);
|
assertTrue(FS.canReadFile(pom.toPath()), "Can read file: " + pom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExtractEscaperZip(WorkDir workDir) throws IOException
|
||||||
|
{
|
||||||
|
Path archive = MavenPaths.findTestResourceFile("bad-libs/escaper.zip");
|
||||||
|
Path dest = workDir.getEmptyPathDir();
|
||||||
|
Path bad = Path.of("/tmp/evil.txt");
|
||||||
|
Files.deleteIfExists(bad);
|
||||||
|
assertThrows(IOException.class, () -> FS.extractZip(archive, dest));
|
||||||
|
assertFalse(Files.exists(bad), "The escaper prevention didn't work, you should not have a /tmp/evil.txt file, but you do.");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility method used by other test cases
|
* Utility method used by other test cases
|
||||||
*
|
*
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue