seccomp: Use -1 marker for end of mode 1 syscall list
authorKees Cook <keescook@chromium.org>
Fri, 19 Jun 2020 19:20:15 +0000 (12:20 -0700)
committerKees Cook <keescook@chromium.org>
Fri, 10 Jul 2020 23:01:52 +0000 (16:01 -0700)
The terminator for the mode 1 syscalls list was a 0, but that could be
a valid syscall number (e.g. x86_64 __NR_read). By luck, __NR_read was
listed first and the loop construct would not test it, so there was no
bug. However, this is fragile. Replace the terminator with -1 instead,
and make the variable name for mode 1 syscall lists more descriptive.

Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Will Drewry <wad@chromium.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
arch/mips/include/asm/seccomp.h
include/asm-generic/seccomp.h
kernel/seccomp.c

index e383d7e27b9359dc8a6867bc826c3958a6ea3acd..aa809589a181a0759711728c61bb7456cd1a6228 100644 (file)
@@ -9,12 +9,12 @@ static inline const int *get_compat_mode1_syscalls(void)
        static const int syscalls_O32[] = {
                __NR_O32_Linux + 3, __NR_O32_Linux + 4,
                __NR_O32_Linux + 1, __NR_O32_Linux + 193,
-               0, /* null terminated */
+               -1, /* negative terminated */
        };
        static const int syscalls_N32[] = {
                __NR_N32_Linux + 0, __NR_N32_Linux + 1,
                __NR_N32_Linux + 58, __NR_N32_Linux + 211,
-               0, /* null terminated */
+               -1, /* negative terminated */
        };
 
        if (IS_ENABLED(CONFIG_MIPS32_O32) && test_thread_flag(TIF_32BIT_REGS))
index 1321ac7821d7a4ac0b606bc50da9878b08b0adf0..6b6f42bc58f95942b610ac8b199dd30903cd2962 100644 (file)
@@ -33,7 +33,7 @@ static inline const int *get_compat_mode1_syscalls(void)
        static const int mode1_syscalls_32[] = {
                __NR_seccomp_read_32, __NR_seccomp_write_32,
                __NR_seccomp_exit_32, __NR_seccomp_sigreturn_32,
-               0, /* null terminated */
+               -1, /* negative terminated */
        };
        return mode1_syscalls_32;
 }
index 0ed57e8c49d0b71463d59c5b368fb10e79a5efd7..866a432cd7465e3cf52f15d0b74e206a5f06a2e2 100644 (file)
@@ -742,20 +742,20 @@ static inline void seccomp_log(unsigned long syscall, long signr, u32 action,
  */
 static const int mode1_syscalls[] = {
        __NR_seccomp_read, __NR_seccomp_write, __NR_seccomp_exit, __NR_seccomp_sigreturn,
-       0, /* null terminated */
+       -1, /* negative terminated */
 };
 
 static void __secure_computing_strict(int this_syscall)
 {
-       const int *syscall_whitelist = mode1_syscalls;
+       const int *allowed_syscalls = mode1_syscalls;
 #ifdef CONFIG_COMPAT
        if (in_compat_syscall())
-               syscall_whitelist = get_compat_mode1_syscalls();
+               allowed_syscalls = get_compat_mode1_syscalls();
 #endif
        do {
-               if (*syscall_whitelist == this_syscall)
+               if (*allowed_syscalls == this_syscall)
                        return;
-       } while (*++syscall_whitelist);
+       } while (*++allowed_syscalls != -1);
 
 #ifdef SECCOMP_DEBUG
        dump_stack();