This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 7d22c6f  CVE-2022-22931 JAMES-3646 Rely on strong typing for file 
paths operations (#877)
7d22c6f is described below

commit 7d22c6fbd79d817bc137da7b9d712cb2802a7df8
Author: Benoit TELLIER <[email protected]>
AuthorDate: Wed Feb 9 08:24:12 2022 +0700

    CVE-2022-22931 JAMES-3646 Rely on strong typing for file paths operations 
(#877)
---
 .../apache/james/sieverepository/file/SieveFileRepository.java   | 8 ++------
 .../james/sieverepository/file/SieveFileRepositoryTest.java      | 9 +++++++++
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git 
a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
 
b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
index 26baf98..b70496b 100644
--- 
a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
+++ 
b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
@@ -316,12 +316,8 @@ public class SieveFileRepository implements 
SieveRepository {
     }
 
     private void enforceRoot(File file) throws StorageException {
-        try {
-            if (!file.getCanonicalPath().startsWith(root.getCanonicalPath())) {
-                throw new StorageException(new IllegalStateException("Path 
traversal attempted"));
-            }
-        } catch (IOException e) {
-            throw new StorageException(e);
+        if (!file.toPath().normalize().startsWith(root.toPath().normalize())) {
+            throw new StorageException(new IllegalStateException("Path 
traversal attempted"));
         }
     }
 
diff --git 
a/server/data/data-file/src/test/java/org/apache/james/sieverepository/file/SieveFileRepositoryTest.java
 
b/server/data/data-file/src/test/java/org/apache/james/sieverepository/file/SieveFileRepositoryTest.java
index e6b4f17..1077ec8 100644
--- 
a/server/data/data-file/src/test/java/org/apache/james/sieverepository/file/SieveFileRepositoryTest.java
+++ 
b/server/data/data-file/src/test/java/org/apache/james/sieverepository/file/SieveFileRepositoryTest.java
@@ -84,4 +84,13 @@ class SieveFileRepositoryTest implements 
SieveRepositoryContract {
                 new ScriptName("../other/script")))
             .isInstanceOf(StorageException.class);
     }
+
+    @Test
+    void getScriptShouldNotAllowToReadScriptsOfOtherUsersWhenPrefix() throws 
Exception {
+        sieveRepository().putScript(Username.of("testa"), new 
ScriptName("script"), new ScriptContent("PWND!!!"));
+
+        assertThatThrownBy(() ->  
sieveRepository().getScript(Username.of("test"),
+            new ScriptName("../other/script")))
+            .isInstanceOf(StorageException.class);
+    }
 }

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to