fix(import): resolve symlinks when checking the upload path

The temp root is resolve()d in settings but the file path was only
abspath()ed, so a symlink inside the temp folder could point outside it
and still pass the check. Resolve both sides the same way.

Also drop the unused /temp folder from the prod image.
This commit is contained in:
Herculino Trotta committed 2026-11-08 03:09:04 -03:00
1 parent 38118c56d3
commit e0c1e4d5ff
3 files changed
+13 -4

No files matched your search

+2 -1
View File
@@ -1131,7 +1131,8 @@ class ImportService:
Validates that the file path is within the allowed temporary directory.
Returns the absolute path.
"""
abs_path = os.path.abspath(file_path)
# resolve() like IMPORT_TEMP_ROOT, so symlinks can't point outside it
abs_path = str(Path(file_path).resolve())
if not Path(abs_path).is_relative_to(settings.IMPORT_TEMP_ROOT):
raise ValueError(
f"Invalid file path. File must be in {settings.IMPORT_TEMP_ROOT}"
+10
View File
@@ -149,3 +149,13 @@ class ImportTempRootTests(ImportObjectPermissionTestCase):
):
with self.subTest(path=path), self.assertRaises(ValueError):
service._validate_file_path(str(path))
def test_service_rejects_symlinks_pointing_outside_temp_root(self):
link = self.temp_root / "link.csv"
try:
link.symlink_to("/etc/passwd")
except OSError:
self.skipTest("symlinks not available")
with self.assertRaises(ValueError):
self._service()._validate_file_path(str(link))
+1 -3
View File
@@ -69,9 +69,7 @@ RUN sed -i 's/\r$//g' /start && \
COPY --chown=app:app ./app .
RUN chown -R app:app /usr/src/app && \
chown -R app:app /usr/src/frontend && \
mkdir /temp && \
chown -R app:app /temp
chown -R app:app /usr/src/frontend
USER app