From: Cong Wang The existing __NR_seccomp_* aliases name only the strict-mode syscalls (read/write/exit/sigreturn). SEND_REDIRECT must also recognise rt_sigreturn and the clone/fork task-creation family, native and compat, so it can refuse to redirect them. Gate these behind a new SECCOMP_ARCH_REDIRECT opt-in, mirroring how SECCOMP_ARCH_NATIVE gates the bitmap cache: an arch declares it only once it supplies a complete, verified set of these numbers, and where it is undefined the feature is compiled out. This avoids a generic fallback silently handing an arch a wrong number that would drop a syscall from the deny list. x86_64 opts in and supplies the ia32 compat numbers. Assisted-by: Claude:claude-opus-4.8 Signed-off-by: Cong Wang --- arch/x86/include/asm/seccomp.h | 15 ++++++++++++++- include/asm-generic/seccomp.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/seccomp.h b/arch/x86/include/asm/seccomp.h index 42bcd42d70d1..a911fce504ac 100644 --- a/arch/x86/include/asm/seccomp.h +++ b/arch/x86/include/asm/seccomp.h @@ -6,6 +6,7 @@ #ifdef CONFIG_X86_32 #define __NR_seccomp_sigreturn __NR_sigreturn +#define __NR_seccomp_rt_sigreturn __NR_rt_sigreturn #endif #ifdef CONFIG_COMPAT @@ -14,12 +15,18 @@ #define __NR_seccomp_write_32 __NR_ia32_write #define __NR_seccomp_exit_32 __NR_ia32_exit #define __NR_seccomp_sigreturn_32 __NR_ia32_sigreturn +#define __NR_seccomp_rt_sigreturn_32 __NR_ia32_rt_sigreturn +#define __NR_seccomp_clone_32 __NR_ia32_clone +#define __NR_seccomp_clone3_32 __NR_ia32_clone3 +#define __NR_seccomp_fork_32 __NR_ia32_fork +#define __NR_seccomp_vfork_32 __NR_ia32_vfork #endif #ifdef CONFIG_X86_64 # define SECCOMP_ARCH_NATIVE AUDIT_ARCH_X86_64 # define SECCOMP_ARCH_NATIVE_NR NR_syscalls # define SECCOMP_ARCH_NATIVE_NAME "x86_64" +# define SECCOMP_ARCH_REDIRECT 1 # ifdef CONFIG_COMPAT # define SECCOMP_ARCH_COMPAT AUDIT_ARCH_I386 # define SECCOMP_ARCH_COMPAT_NR IA32_NR_syscalls @@ -28,8 +35,14 @@ /* * x32 will have __X32_SYSCALL_BIT set in syscall number. We don't support * caching them and they are treated as out of range syscalls, which will - * always pass through the BPF filter. + * always pass through the BPF filter. It shares AUDIT_ARCH_X86_64 with the + * native ABI, so refuse to redirect it: the generic denylist keys off plain + * syscall numbers and cannot name x32's sigreturn/clone. */ +static inline bool arch_seccomp_redirect_deny(const struct seccomp_data *sd) +{ + return sd->nr & __X32_SYSCALL_BIT; +} #else /* !CONFIG_X86_64 */ # define SECCOMP_ARCH_NATIVE AUDIT_ARCH_I386 # define SECCOMP_ARCH_NATIVE_NR NR_syscalls diff --git a/include/asm-generic/seccomp.h b/include/asm-generic/seccomp.h index 6b6f42bc58f9..42b1b9b79ddf 100644 --- a/include/asm-generic/seccomp.h +++ b/include/asm-generic/seccomp.h @@ -26,6 +26,36 @@ #define __NR_seccomp_sigreturn __NR_rt_sigreturn #endif +#ifdef SECCOMP_ARCH_REDIRECT +#ifndef __NR_seccomp_rt_sigreturn +#define __NR_seccomp_rt_sigreturn __NR_seccomp_sigreturn +#endif +#ifndef __NR_seccomp_clone +#define __NR_seccomp_clone __NR_clone +#endif +#ifndef __NR_seccomp_clone3 +#ifdef __NR_clone3 +#define __NR_seccomp_clone3 __NR_clone3 +#else +#define __NR_seccomp_clone3 (-1) +#endif +#endif +#ifndef __NR_seccomp_fork +#ifdef __NR_fork +#define __NR_seccomp_fork __NR_fork +#else +#define __NR_seccomp_fork (-1) +#endif +#endif +#ifndef __NR_seccomp_vfork +#ifdef __NR_vfork +#define __NR_seccomp_vfork __NR_vfork +#else +#define __NR_seccomp_vfork (-1) +#endif +#endif +#endif /* SECCOMP_ARCH_REDIRECT */ + #ifdef CONFIG_COMPAT #ifndef get_compat_mode1_syscalls static inline const int *get_compat_mode1_syscalls(void) -- 2.43.0