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

mandarambawane pushed a commit to branch ATLAS-5421-V2-1013
in repository https://gitbox.apache.org/repos/asf/atlas.git

commit 67185768a728a47ae33a7cc3546ac2683695b51c
Author: Mandar Ambawane <[email protected]>
AuthorDate: Tue Oct 13 13:22:56 2026 +0530

    ATLAS-5421 : Prevent /api/atlas/admin/importfile from reading arbitrary 
server files and enumerating filesystem paths
---
 docs/src/documents/Import-Export/ImportAPI.md                |  2 +-
 docs/src/documents/Import-Export/ImportAPIOptions.md         | 12 +++++++++++-
 release-log.txt                                              |  5 +++++
 .../atlas/repository/impexp/ImportFilePathValidatorTest.java |  9 +++++++++
 4 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/docs/src/documents/Import-Export/ImportAPI.md 
b/docs/src/documents/Import-Export/ImportAPI.md
index 0cae7f86f..d06aabbb3 100644
--- a/docs/src/documents/Import-Export/ImportAPI.md
+++ b/docs/src/documents/Import-Export/ImportAPI.md
@@ -42,7 +42,7 @@ The general approach is:
 | _Data Parameters_|_None_|
 | _Success Response_ | _AtlasImporResult_ is returned as JSON. See details 
below.|
 |_Error Response_|Errors that are handled within the system will be returned 
as _AtlasBaseException_. |
-|_Notes_| The file to be imported needs to be present on the server at the 
location specified by the _FILENAME_ parameter.|
+|_Notes_| The file to be imported must be a `.zip` file present under the 
configured import directory. Set _atlas.import.allowed.directory_ in 
_atlas-application.properties_ (default: `${sys:atlas.data}/import`). The 
_fileName_ option must be a relative path under that directory; absolute paths 
and path traversal are rejected. All file-access failures return 
_IMPORT_FILE_NOT_ACCESSIBLE_ (ATLAS-400-00-10B). Ensure the configured import 
directory exists on disk before calling this API.|
 
 __Method Signature for Import__
 
diff --git a/docs/src/documents/Import-Export/ImportAPIOptions.md 
b/docs/src/documents/Import-Export/ImportAPIOptions.md
index d05a680bb..643f56a4d 100644
--- a/docs/src/documents/Import-Export/ImportAPIOptions.md
+++ b/docs/src/documents/Import-Export/ImportAPIOptions.md
@@ -131,12 +131,22 @@ To use the option, set the contents of 
_importOptions.json_ to:
 
 In a scenario where the file to be imported is present at a location on the 
server, the _importfile_ API can be used. It behaves like the Import API.
 
+The _fileName_ option must be a relative path to a `.zip` file under the 
configured import directory. Absolute paths and path traversal (for example, 
`../`) are rejected.
+
+Configure the allowed import directory in _atlas-application.properties_:
+
+<SyntaxHighlighter wrapLines={true} language="properties" style={theme.dark}>
+{`atlas.import.allowed.directory=${sys:atlas.data}/import`}
+</SyntaxHighlighter>
+
+New installations ship with this default. After upgrading, ensure 
_atlas.import.allowed.directory_ is set and that the directory exists on disk; 
otherwise, _importfile_ requests will fail with _IMPORT_FILE_NOT_ACCESSIBLE_ 
(ATLAS-400-00-10B).
+
 To use the option, set the contents of _importOptions.json_ to:
 
 <SyntaxHighlighter wrapLines={true} language="json" style={theme.dark}>
 {`{
   "options": {
-    "fileName": "/root/fileToBeImported.zip"
+    "fileName": "export.zip"
   }
 }`}
 </SyntaxHighlighter>
diff --git a/release-log.txt b/release-log.txt
index 344f5bfe4..4bfff883d 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -3,12 +3,17 @@ Apache Atlas Release Notes
 
 --trunk - unreleased
 INCOMPATIBLE CHANGES:
+ATLAS-5421: importfile API now returns IMPORT_FILE_NOT_ACCESSIBLE 
(ATLAS-400-00-10B) for all file-access failures. Callers that previously relied 
on distinct "file not found" or "empty ZIP" errors must update automation that 
parses error codes.
 ATLAS-675 Storm Hook should use timestamps as Date type instead of Long 
(ayubkhan via sumasai)
 ATLAS-1122 Change trait edge labels to have trait name alone (sumasai)
 ATLAS-1060 Add composite indexes for exact match performance improvements for 
all attributes (sumasai via shwethags)
 ATLAS-1127 Modify creation and modification timestamps to Date instead of 
Long(sumasai)
 
+CONFIGURATION CHANGES:
+ATLAS-5421: After upgrading, ensure atlas.import.allowed.directory is set. New 
installations ship with ${sys:atlas.data}/import. Also ensure the configured 
import directory exists on disk; otherwise, importfile will fail.
+
 ALL CHANGES:
+ATLAS-5421: Prevent /api/atlas/admin/importfile from reading arbitrary server 
files and enumerating filesystem paths
 ATLAS-1608 :Search UI improvement (kevalbhatt)
 ATLAS-1630: basic search implementation (#2)
 ATLAS-1630: basic search implementation using fulltext with support for filter 
by type & classification
diff --git 
a/repository/src/test/java/org/apache/atlas/repository/impexp/ImportFilePathValidatorTest.java
 
b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportFilePathValidatorTest.java
index c165e7ebf..a59a640e9 100644
--- 
a/repository/src/test/java/org/apache/atlas/repository/impexp/ImportFilePathValidatorTest.java
+++ 
b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportFilePathValidatorTest.java
@@ -121,6 +121,15 @@ public class ImportFilePathValidatorTest {
         assertImportFileNotAccessible("export.zip");
     }
 
+    @Test
+    public void validateRejectsWhenAllowedDirectoryDoesNotExist() throws 
Exception {
+        File nonExistentDir = new File(importDirectory, "missing-import-dir");
+        
ApplicationProperties.get().setProperty(AtlasConfiguration.IMPORT_ALLOWED_DIRECTORY.getPropertyName(),
+                nonExistentDir.getAbsolutePath());
+
+        assertImportFileNotAccessible("export.zip");
+    }
+
     @Test
     public void validateReturnsSameErrorForMissingAndInvalidFiles() throws 
Exception {
         File existingFile = new File(importDirectory, "existing.txt");

Reply via email to