[RFC PATCH 4/6] um: forbid mmap/munmap in the stub seccomp filter
Cong Wang <[email protected]> Fri, 10 Jul 2026 13:53:22 -0700
| Newsgroups | gmane.linux.uml.devel,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Cong Wang <[email protected]> In seccomp mode the monitor now installs all guest mappings via pidfd_mmap(), so the stub has no legitimate need to mmap/munmap after its filter is in place (the pre-filter bootstrap mmaps are unaffected). Drop the STUB_MMAP_NR and __NR_munmap allowlist arms and fix the jump offsets; both now hit SECCOMP_RET_KILL_PROCESS. A hijacked stub can no longer map arbitrary physmem. The filter exists only in seccomp mode, so ptrace (SKAS0) is untouched. Assisted-by: Claude:claude-opus-4.8 Signed-off-by: Cong Wang <[email protected]> --- arch/um/kernel/skas/stub_exe.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/arch/um/kernel/skas/stub_exe.c b/arch/um/kernel/skas/stub_exe.c index cbafaa684e66..a88274449168 100644 --- a/arch/um/kernel/skas/stub_exe.c +++ b/arch/um/kernel/skas/stub_exe.c @@ -165,16 +165,18 @@ noinline static void real_init(void) BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, nr)), - /* [10-16] Check against permitted syscalls */ + /* + * [10-14] Check against permitted syscalls. mmap and + * munmap are deliberately absent: in seccomp mode the + * monitor installs all guest mappings via pidfd_mmap(), + * so a stub that attempts mmap/munmap hits the KILL at + * [15]. + */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_futex, - 7, 0), - BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K,__NR_recvmsg, - 6, 0), - BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K,__NR_close, 5, 0), - BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, STUB_MMAP_NR, + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_recvmsg, 4, 0), - BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_munmap, + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_close, 3, 0), #ifdef __i386__ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_set_thread_area, @@ -186,10 +188,10 @@ noinline static void real_init(void) BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_rt_sigreturn, 1, 0), - /* [17] Not one of the permitted syscalls */ + /* [15] Not one of the permitted syscalls */ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS), - /* [18] Permitted call for the stub */ + /* [16] Permitted call for the stub */ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW), }; struct sock_fprog prog = { -- 2.43.0