@@ -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
0 commit comments