diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index b7e15bda..ecfe2873 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -39,7 +39,7 @@ jobs: if: runner.os == 'Linux' run: >- mvn -B -pl server - -Dtest=FtpCommandSecurityTests,UploadPathSecurityTests,PreviewSourceSecurityTests,PreviewParameterSecurityTests,ArchiveDirectorySecurityTests,ActuatorExposureSecurityTests,ArchiveTraversalSecurityTests,FileControllerPathSecurityTests,FileControllerDeleteSecurityTests + -Dtest=FtpCommandSecurityTests,UploadPathSecurityTests,PreviewSourceSecurityTests,PreviewParameterSecurityTests,ArchiveDirectorySecurityTests,ActuatorExposureSecurityTests,ActuatorOverrideExposureSecurityTests,ArchiveTraversalSecurityTests,FileControllerPathSecurityTests,FileControllerDeleteSecurityTests test - name: Validate Windows deployment diff --git a/server/src/main/config/test.properties b/server/src/main/config/test.properties index 650701e0..45bf7bdf 100644 --- a/server/src/main/config/test.properties +++ b/server/src/main/config/test.properties @@ -35,8 +35,8 @@ spring.freemarker.request-context-attribute = request spring.freemarker.suffix = .ftl # Spring Boot Actuator监控端点配置 -management.endpoints.web.exposure.include = health,info,metrics -management.endpoint.health.show-details = always +management.endpoints.web.exposure.include = health +management.endpoint.health.show-details = never management.health.defaults.enabled = true diff --git a/server/src/main/java/cn/keking/service/CompressFileReader.java b/server/src/main/java/cn/keking/service/CompressFileReader.java index b3e15f9e..c98ac72e 100644 --- a/server/src/main/java/cn/keking/service/CompressFileReader.java +++ b/server/src/main/java/cn/keking/service/CompressFileReader.java @@ -35,13 +35,13 @@ import java.util.List; @Component public class CompressFileReader { private final FileHandlerService fileHandlerService; - private static final String fileDir = ConfigConstants.getFileDir(); public CompressFileReader(FileHandlerService fileHandlerService) { this.fileHandlerService = fileHandlerService; } public String unRar(String filePath, String filePassword, String fileName, FileAttribute fileAttribute) throws Exception { + String fileDir = ConfigConstants.getFileDir(); List imgUrls = new ArrayList<>(); String baseUrl = BaseUrlFilter.getBaseUrl(); String packagePath = "_"; diff --git a/server/src/test/java/cn/keking/config/ActuatorOverrideExposureSecurityTests.java b/server/src/test/java/cn/keking/config/ActuatorOverrideExposureSecurityTests.java new file mode 100644 index 00000000..75155ab4 --- /dev/null +++ b/server/src/test/java/cn/keking/config/ActuatorOverrideExposureSecurityTests.java @@ -0,0 +1,9 @@ +package cn.keking.config; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(classes = ActuatorExposureSecurityTests.ManagementApp.class, + properties = "spring.config.name=test", + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class ActuatorOverrideExposureSecurityTests extends ActuatorExposureSecurityTests { +} diff --git a/server/src/test/java/cn/keking/service/ArchiveTraversalSecurityTests.java b/server/src/test/java/cn/keking/service/ArchiveTraversalSecurityTests.java index db67e46d..eab8d72b 100644 --- a/server/src/test/java/cn/keking/service/ArchiveTraversalSecurityTests.java +++ b/server/src/test/java/cn/keking/service/ArchiveTraversalSecurityTests.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.io.TempDir; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -17,18 +18,23 @@ class ArchiveTraversalSecurityTests { @Test void existingExtractorRejectsZipSlipBeforeWritingOutsideArchive() throws Exception { String previous = ConfigConstants.getFileDir(); - ConfigConstants.setFileDirValue(temp.toString()); try { - Path archive = temp.resolve("malicious.zip"); - try (ZipOutputStream zip = new ZipOutputStream(Files.newOutputStream(archive))) { - zip.putNextEntry(new ZipEntry("../outside-marker.txt")); - zip.write("BENIGN-CANARY".getBytes()); - zip.closeEntry(); + CompressFileReader reader = new CompressFileReader(null); + for (String directory : List.of("first", "second")) { + Path root = Files.createDirectory(temp.resolve(directory)); + ConfigConstants.setFileDirValue(root.toString()); + Path archive = root.resolve("malicious.zip"); + try (ZipOutputStream zip = new ZipOutputStream(Files.newOutputStream(archive))) { + zip.putNextEntry(new ZipEntry("../outside-marker.txt")); + zip.write("BENIGN-CANARY".getBytes()); + zip.closeEntry(); + } + Exception error = assertThrows(Exception.class, () -> reader + .unRar(archive.toString(), "", "malicious.zip", new FileAttribute())); + assertTrue(error.getMessage().contains("Unsafe path detected"), error.toString()); + assertTrue(Files.isDirectory(root.resolve("malicious.zip_"))); + assertFalse(Files.exists(root.resolve("outside-marker.txt"))); } - Exception error = assertThrows(Exception.class, () -> new CompressFileReader(null) - .unRar(archive.toString(), "", "malicious.zip", new FileAttribute())); - assertTrue(error.getMessage().contains("Unsafe path detected"), error.toString()); - assertFalse(Files.exists(temp.resolve("outside-marker.txt"))); } finally { ConfigConstants.setFileDirValue(previous); }