Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion tests/tools/test_file_read_guards.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,37 @@ def test_proc_fd_other_not_blocked(self):
self.assertFalse(_is_blocked_device_path("/proc/self/fd/3"))

def test_proc_sensitive_pseudo_files_blocked(self):
"""environ/cmdline/maps under /proc/<pid> must be blocked (issue #4427)."""
"""environ/cmdline/maps (and maps variants) under /proc/<pid> must be blocked (issue #4427)."""
for path in (
"/proc/self/environ",
"/proc/12345/environ",
"/proc/self/cmdline",
"/proc/99/cmdline",
"/proc/self/maps",
"/proc/1/maps",
"/proc/self/smaps",
"/proc/12345/smaps",
"/proc/self/smaps_rollup",
"/proc/99/smaps_rollup",
"/proc/self/numa_maps",
"/proc/1/numa_maps",
"/proc/self/mem",
"/proc/12345/mem",
"/proc/self/auxv",
"/proc/1/auxv",
"/proc/self/pagemap",
"/proc/99/pagemap",
):
self.assertTrue(_is_blocked_device(path), f"{path} should be blocked")

def test_proc_task_thread_sensitive_files_blocked(self):
"""Per-thread /proc/<pid>/task/<tid>/<file> aliases leak the same data."""
for path in (
"/proc/self/task/1234/maps",
"/proc/self/task/1234/smaps",
"/proc/self/task/1234/auxv",
"/proc/self/task/1234/pagemap",
"/proc/self/task/1234/environ",
):
self.assertTrue(_is_blocked_device(path), f"{path} should be blocked")

Expand Down
23 changes: 20 additions & 3 deletions tools/file_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -362,10 +362,27 @@ def _is_blocked_device_path(path: str) -> bool:
("/fd/0", "/fd/1", "/fd/2")
):
return True
# /proc/*/environ, /proc/*/cmdline, /proc/*/maps can leak secrets,
# command-line args, and memory layout from the host process (issue #4427)
# /proc/*/environ, /proc/*/cmdline, /proc/*/maps (and the maps variants
# smaps, smaps_rollup, numa_maps) can leak secrets, command-line args, and
# memory layout (ASLR bypass) from the host process (issue #4427).
# /proc/*/mem exposes raw process memory; block it as defense-in-depth even
# though it requires address knowledge to exploit usefully.
# /proc/*/auxv leaks AT_RANDOM (stack canary seed) plus AT_BASE/AT_PHDR
# load addresses — an ASLR oracle on par with maps. /proc/*/pagemap exposes
# virtual->physical translation. Both are blocked alongside the maps family.
# endswith matches both /proc/<pid>/X and /proc/<pid>/task/<tid>/X.
if normalized.startswith("/proc/") and normalized.endswith(
("/environ", "/cmdline", "/maps")
(
"/environ",
"/cmdline",
"/maps",
"/smaps",
"/smaps_rollup",
"/numa_maps",
"/mem",
"/auxv",
"/pagemap",
)
):
return True
return False
Expand Down
Loading