From 526026fbc9b0c24bb359a5e28b0c93cc29f16108 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Thu, 8 May 2025 17:00:06 +0100 Subject: [PATCH] Potential fix for code scanning alert no. 47: Arbitrary file access during archive extraction ("Zip Slip") Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .../software/SPDF/utils/FileToPdf.java | 22 +++++-------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index da4aeab3c..4ab3aef2f 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -156,7 +156,10 @@ public class FileToPdf { ZipSecurity.createHardenedInputStream(new ByteArrayInputStream(fileBytes))) { ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { - Path filePath = tempDirectory.resolve(sanitizeZipFilename(entry.getName())); + Path filePath = tempDirectory.resolve(entry.getName()).normalize(); + if (!filePath.startsWith(tempDirectory)) { + throw new IOException("Entry is outside of the target directory: " + entry.getName()); + } if (entry.isDirectory()) { Files.createDirectories(filePath); // Explicitly create the directory structure } else { @@ -188,20 +191,5 @@ public class FileToPdf { } } - static String sanitizeZipFilename(String entryName) { - if (entryName == null || entryName.trim().isEmpty()) { - return ""; - } - // Remove any drive letters (e.g., "C:\") and leading forward/backslashes - entryName = entryName.replaceAll("^[a-zA-Z]:[\\\\/]+", ""); - entryName = entryName.replaceAll("^[\\\\/]+", ""); - - // Recursively remove path traversal sequences - while (entryName.contains("../") || entryName.contains("..\\")) { - entryName = entryName.replace("../", "").replace("..\\", ""); - } - // Normalize all backslashes to forward slashes - entryName = entryName.replaceAll("\\\\", "/"); - return entryName; - } + // Removed sanitizeZipFilename method as it is no longer needed. }