Skip to content

Commit 57ae3f6

Browse files
committed
Clean up /proc hardening logic in SandboxContext
Signed-off-by: Cong Wang <cwang@multikernel.io>
1 parent b8e8ad3 commit 57ae3f6

File tree

2 files changed

+20
-22
lines changed

2 files changed

+20
-22
lines changed

src/sandlock/_context.py

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -476,9 +476,9 @@ def _close_pidfd(self) -> None:
476476
pass
477477
self._control_fd = -1
478478

479-
# Sensitive /proc and /sys paths blocked via Landlock fs_denied when
480-
# /proc is readable. Only includes paths that Landlock can actually
481-
# enforce on procfs (some procfs entries ignore Landlock).
479+
# Paths that Landlock can enforce on procfs/sysfs. Added to
480+
# fs_denied as defense-in-depth alongside the seccomp notification
481+
# rules that block the rest (kallsyms, modules, keys, mounts, etc.).
482482
_PROC_DENY_PATHS = [
483483
"/proc/kcore", "/proc/config.gz",
484484
"/proc/sched_debug", "/proc/timer_list",
@@ -492,30 +492,28 @@ def __enter__(self) -> "SandboxContext":
492492
p == "/proc" or p.rstrip("/") == "/proc"
493493
for p in self._policy.fs_readable
494494
)
495-
# Auto-enable /proc hardening when /proc is readable:
496-
# - PID isolation (hide foreign PIDs via getdents64 + openat)
497-
# - Sensitive file blocking (/proc/kallsyms, /proc/modules, etc.)
498-
# - Mount info virtualization (/proc/mounts → empty)
499-
# The openat handler uses a fast prefix check to skip non-/proc
500-
# paths with minimal overhead (single pread on cached fd).
495+
# /proc hardening when /proc is readable:
496+
# - Always: sensitive file blocking + mount info virtualization
497+
# via default_proc_rules() (enforced in seccomp notification)
498+
# - When isolate_pids=True: hide foreign PIDs via getdents64 +
499+
# openat interception (fast prefix check skips non-/proc paths)
501500
if self._has_proc:
502501
from ._notif_policy import NotifPolicy, default_proc_rules
503502
import dataclasses
503+
proc_rules = default_proc_rules()
504+
isolate = self._policy.isolate_pids
504505
if self._notif_policy is None:
505506
self._notif_policy = NotifPolicy(
506-
rules=default_proc_rules(),
507-
isolate_pids=True,
507+
rules=proc_rules,
508+
isolate_pids=isolate,
508509
)
509510
else:
510-
updates = {}
511-
if not self._notif_policy.isolate_pids:
512-
updates["isolate_pids"] = True
513-
if not self._notif_policy.rules:
514-
updates["rules"] = default_proc_rules()
515-
if updates:
516-
self._notif_policy = dataclasses.replace(
517-
self._notif_policy, **updates,
518-
)
511+
merged_rules = self._notif_policy.rules + proc_rules
512+
self._notif_policy = dataclasses.replace(
513+
self._notif_policy,
514+
rules=merged_rules,
515+
isolate_pids=isolate or self._notif_policy.isolate_pids,
516+
)
519517
use_notif = self._notif_policy is not None
520518

521519
# Pre-import modules used in the child BEFORE fork — the child's

src/sandlock/policy.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ class Policy:
135135
isolate_pids: bool = False
136136
"""Hide foreign process entries in /proc. When enabled, directory
137137
listings of /proc only show the sandbox's own PIDs, and direct
138-
access to /proc/<foreign_pid>/... is denied. Requires seccomp
139-
user notification (adds per-openat overhead)."""
138+
access to /proc/<foreign_pid>/... is denied. Uses seccomp user
139+
notification with a fast prefix check for minimal overhead."""
140140

141141
no_coredump: bool = False
142142
"""Disable core dumps and restrict /proc/pid access from other

0 commit comments

Comments
 (0)