Skip to content

Commit 008e5f3

Browse files
committed
slightly more robust way to evade path traversal
1 parent ffde069 commit 008e5f3

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

opengrok-indexer/src/main/java/org/opengrok/indexer/web/Laundromat.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
import org.jetbrains.annotations.NotNull;
2626
import org.jetbrains.annotations.Nullable;
2727

28+
import java.nio.file.Path;
29+
import java.util.ArrayList;
2830
import java.util.Arrays;
2931
import java.util.Collection;
32+
import java.util.List;
3033
import java.util.Map;
3134
import java.util.Optional;
3235
import java.util.stream.Collectors;
@@ -78,7 +81,15 @@ public static String launderRevision(String value) {
7881
* path components {@code /../} removed.
7982
*/
8083
public static String launderPath(String value) {
81-
return replaceAll(value, "/../", "");
84+
Path path = Path.of(value);
85+
List<String> pathElements = new ArrayList<>();
86+
for (int i = 0; i < path.getNameCount(); i++) {
87+
if (path.getName(i).toString().equals("..")) {
88+
continue;
89+
}
90+
pathElements.add(path.getName(i).toString());
91+
}
92+
return (path.isAbsolute() ? "/" : "") + String.join("/", pathElements);
8293
}
8394

8495
/**

opengrok-indexer/src/test/java/org/opengrok/indexer/web/LaundromatTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,20 @@ void testLaunderServerName(Pair<String, String> param) {
7070
assertEquals(param.getLeft(), param.getRight());
7171
}
7272

73+
private static Stream<Pair<String, String>> getParamsForTestLaunderPath() {
74+
return Stream.of(Pair.of("foo", Laundromat.launderPath("../../../foo")),
75+
Pair.of("/foo/bar", Laundromat.launderPath("/foo/../../bar")),
76+
Pair.of("/foo/bar..", Laundromat.launderPath("/foo/bar..")),
77+
Pair.of("..foo/bar", Laundromat.launderPath("..foo/bar")),
78+
Pair.of("/foo/bar.txt", Laundromat.launderPath("/foo/bar.txt")));
79+
}
80+
81+
@ParameterizedTest
82+
@MethodSource("getParamsForTestLaunderPath")
83+
void testLaunderPath(Pair<String, String> param) {
84+
assertEquals(param.getLeft(), param.getRight());
85+
}
86+
7387
@Test
7488
void launderLogMap() {
7589
HashMap<String, String[]> testMap = new HashMap<>();

0 commit comments

Comments
 (0)