Skip to content

Commit 32950ed

Browse files
authored
Fix: normalize multiple slashes when detecting potentially malicious zip files (#1933)
1 parent 351e17c commit 32950ed

2 files changed

Lines changed: 25 additions & 1 deletion

File tree

server/src/main/java/org/eclipse/openvsx/scanning/MaliciousZipCheckService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private PublishCheck.Result checkForDuplicateEntries(ZipFile zipFile) {
7777
// yauzl which is used by VS Code to extract vsix archives, silently normalizes
7878
// backslash characters to forward slashes, so we reject any extension that contains
7979
// duplicate filenames after normalization to avoid any potential issue.
80-
var normalizedName = Path.of(name).normalize().toString().replaceAll("\\\\+", "/");
80+
var normalizedName = Path.of(name).normalize().toString().replaceAll("\\\\+", "/").replaceAll("/+", "/");
8181
if (!seen.add(normalizedName)) {
8282
return PublishCheck.Result.fail(DUPLICATE_ENTRIES_RULE, DUPLICATE_ENTRIES_MESSAGE);
8383
}

server/src/test/java/org/eclipse/openvsx/scanning/MaliciousZipCheckServiceTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,30 @@ void check_failsWhenEntriesCollideAfterDotDotSegmentNormalization() throws Excep
130130
assertEquals("UNSAFE_PATH_DETECTED", result.failures().getLast().ruleName());
131131
}
132132

133+
@Test
134+
void check_failsWhenEntriesCollideAfterDotDotSegmentNormalizationMultipleSlashes() throws Exception {
135+
TempFile extensionFile = createZipWithEntries("dotdot-segment.vsix",
136+
"extension\\/package.json", "extension/package.json");
137+
138+
var result = service.check(createContext(extensionFile));
139+
140+
assertFalse(result.passed());
141+
assertEquals(1, result.failures().size());
142+
assertEquals("DUPLICATE_NORMALIZED_ENTRIES", result.failures().getFirst().ruleName());
143+
}
144+
145+
@Test
146+
void check_failsWhenEntriesCollideAfterDotDotSegmentNormalizationMultipleSlashes2() throws Exception {
147+
TempFile extensionFile = createZipWithEntries("dotdot-segment.vsix",
148+
"extension/\\package.json", "extension/package.json");
149+
150+
var result = service.check(createContext(extensionFile));
151+
152+
assertFalse(result.passed());
153+
assertEquals(1, result.failures().size());
154+
assertEquals("DUPLICATE_NORMALIZED_ENTRIES", result.failures().getFirst().ruleName());
155+
}
156+
133157
// --- Unsafe paths checks ---
134158

135159
@Test

0 commit comments

Comments
 (0)