| /* |
| * Linux Security Module for Chromium OS |
| * |
| * Copyright 2018 Google LLC. All Rights Reserved |
| * |
| * Authors: |
| * Micah Morton <mortonm@chromium.org> |
| * |
| * This software is licensed under the terms of the GNU General Public |
| * License version 2, as published by the Free Software Foundation, and |
| * may be copied, distributed, and modified under those terms. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #ifndef ALT_SYSCALL_H |
| #define ALT_SYSCALL_H |
| |
| /* |
| * NOTE: this file uses the 'static' keyword for variable and function |
| * definitions because alt-syscall.c is the only .c file that is expected to |
| * include this header. Definitions were pulled out from alt-syscall.c into |
| * this header and the *_whitelists.h headers for the sake of readability. |
| */ |
| |
| static int allow_devmode_syscalls; |
| |
| #ifdef CONFIG_SYSCTL |
| static int zero; |
| static int one = 1; |
| |
| static struct ctl_path chromiumos_sysctl_path[] = { |
| { .procname = "kernel", }, |
| { .procname = "chromiumos", }, |
| { .procname = "alt_syscall", }, |
| { } |
| }; |
| |
| static struct ctl_table chromiumos_sysctl_table[] = { |
| { |
| .procname = "allow_devmode_syscalls", |
| .data = &allow_devmode_syscalls, |
| .maxlen = sizeof(int), |
| .mode = 0644, |
| .proc_handler = proc_dointvec_minmax, |
| .extra1 = &zero, |
| .extra2 = &one, |
| }, |
| { } |
| }; |
| #endif |
| |
| struct syscall_whitelist_entry { |
| unsigned int nr; |
| sys_call_ptr_t alt; |
| }; |
| |
| struct syscall_whitelist { |
| const char *name; |
| const struct syscall_whitelist_entry *whitelist; |
| unsigned int nr_whitelist; |
| #ifdef CONFIG_COMPAT |
| const struct syscall_whitelist_entry *compat_whitelist; |
| unsigned int nr_compat_whitelist; |
| #endif |
| bool permissive; |
| }; |
| |
| static struct alt_sys_call_table default_table; |
| |
| #define SYSCALL_ENTRY_ALT(name, func) \ |
| { \ |
| .nr = __NR_ ## name, \ |
| .alt = (sys_call_ptr_t)func, \ |
| } |
| #define SYSCALL_ENTRY(name) SYSCALL_ENTRY_ALT(name, NULL) |
| #define COMPAT_SYSCALL_ENTRY_ALT(name, func) \ |
| { \ |
| .nr = __NR_compat_ ## name, \ |
| .alt = (sys_call_ptr_t)func, \ |
| } |
| #define COMPAT_SYSCALL_ENTRY(name) COMPAT_SYSCALL_ENTRY_ALT(name, NULL) |
| |
| /* |
| * If an alt_syscall table allows prctl(), override it to prevent a process |
| * from changing its syscall table. |
| */ |
| static asmlinkage long alt_sys_prctl(struct pt_regs *regs); |
| |
| #ifdef CONFIG_COMPAT |
| #define SYSCALL_WHITELIST_COMPAT(x) \ |
| .compat_whitelist = x ## _compat_whitelist, \ |
| .nr_compat_whitelist = ARRAY_SIZE(x ## _compat_whitelist), |
| #else |
| #define SYSCALL_WHITELIST_COMPAT(x) |
| #endif |
| |
| #define SYSCALL_WHITELIST(x) \ |
| { \ |
| .name = #x, \ |
| .whitelist = x ## _whitelist, \ |
| .nr_whitelist = ARRAY_SIZE(x ## _whitelist), \ |
| SYSCALL_WHITELIST_COMPAT(x) \ |
| } |
| |
| #define PERMISSIVE_SYSCALL_WHITELIST(x) \ |
| { \ |
| .name = #x "_permissive", \ |
| .permissive = true, \ |
| .whitelist = x ## _whitelist, \ |
| .nr_whitelist = ARRAY_SIZE(x ## _whitelist), \ |
| SYSCALL_WHITELIST_COMPAT(x) \ |
| } |
| |
| #ifdef CONFIG_COMPAT |
| #ifdef CONFIG_X86_64 |
| #define __NR_compat_access __NR_ia32_access |
| #define __NR_compat_adjtimex __NR_ia32_adjtimex |
| #define __NR_compat_brk __NR_ia32_brk |
| #define __NR_compat_capget __NR_ia32_capget |
| #define __NR_compat_capset __NR_ia32_capset |
| #define __NR_compat_chdir __NR_ia32_chdir |
| #define __NR_compat_chmod __NR_ia32_chmod |
| #define __NR_compat_clock_adjtime __NR_ia32_clock_adjtime |
| #define __NR_compat_clock_getres __NR_ia32_clock_getres |
| #define __NR_compat_clock_gettime __NR_ia32_clock_gettime |
| #define __NR_compat_clock_nanosleep __NR_ia32_clock_nanosleep |
| #define __NR_compat_clock_settime __NR_ia32_clock_settime |
| #define __NR_compat_clone __NR_ia32_clone |
| #define __NR_compat_close __NR_ia32_close |
| #define __NR_compat_creat __NR_ia32_creat |
| #define __NR_compat_dup __NR_ia32_dup |
| #define __NR_compat_dup2 __NR_ia32_dup2 |
| #define __NR_compat_dup3 __NR_ia32_dup3 |
| #define __NR_compat_epoll_create __NR_ia32_epoll_create |
| #define __NR_compat_epoll_create1 __NR_ia32_epoll_create1 |
| #define __NR_compat_epoll_ctl __NR_ia32_epoll_ctl |
| #define __NR_compat_epoll_wait __NR_ia32_epoll_wait |
| #define __NR_compat_epoll_pwait __NR_ia32_epoll_pwait |
| #define __NR_compat_eventfd __NR_ia32_eventfd |
| #define __NR_compat_eventfd2 __NR_ia32_eventfd2 |
| #define __NR_compat_execve __NR_ia32_execve |
| #define __NR_compat_exit __NR_ia32_exit |
| #define __NR_compat_exit_group __NR_ia32_exit_group |
| #define __NR_compat_faccessat __NR_ia32_faccessat |
| #define __NR_compat_fallocate __NR_ia32_fallocate |
| #define __NR_compat_fchdir __NR_ia32_fchdir |
| #define __NR_compat_fchmod __NR_ia32_fchmod |
| #define __NR_compat_fchmodat __NR_ia32_fchmodat |
| #define __NR_compat_fchown __NR_ia32_fchown |
| #define __NR_compat_fchownat __NR_ia32_fchownat |
| #define __NR_compat_fcntl __NR_ia32_fcntl |
| #define __NR_compat_fdatasync __NR_ia32_fdatasync |
| #define __NR_compat_fgetxattr __NR_ia32_fgetxattr |
| #define __NR_compat_flistxattr __NR_ia32_flistxattr |
| #define __NR_compat_flock __NR_ia32_flock |
| #define __NR_compat_fork __NR_ia32_fork |
| #define __NR_compat_fremovexattr __NR_ia32_fremovexattr |
| #define __NR_compat_fsetxattr __NR_ia32_fsetxattr |
| #define __NR_compat_fstat __NR_ia32_fstat |
| #define __NR_compat_fstatfs __NR_ia32_fstatfs |
| #define __NR_compat_fsync __NR_ia32_fsync |
| #define __NR_compat_ftruncate __NR_ia32_ftruncate |
| #define __NR_compat_futex __NR_ia32_futex |
| #define __NR_compat_futimesat __NR_ia32_futimesat |
| #define __NR_compat_getcpu __NR_ia32_getcpu |
| #define __NR_compat_getcwd __NR_ia32_getcwd |
| #define __NR_compat_getdents __NR_ia32_getdents |
| #define __NR_compat_getdents64 __NR_ia32_getdents64 |
| #define __NR_compat_getegid __NR_ia32_getegid |
| #define __NR_compat_geteuid __NR_ia32_geteuid |
| #define __NR_compat_getgid __NR_ia32_getgid |
| #define __NR_compat_getgroups32 __NR_ia32_getgroups32 |
| #define __NR_compat_getpgid __NR_ia32_getpgid |
| #define __NR_compat_getpgrp __NR_ia32_getpgrp |
| #define __NR_compat_getpid __NR_ia32_getpid |
| #define __NR_compat_getppid __NR_ia32_getppid |
| #define __NR_compat_getpriority __NR_ia32_getpriority |
| #define __NR_compat_getrandom __NR_ia32_getrandom |
| #define __NR_compat_getresgid __NR_ia32_getresgid |
| #define __NR_compat_getresuid __NR_ia32_getresuid |
| #define __NR_compat_getrlimit __NR_ia32_getrlimit |
| #define __NR_compat_getrusage __NR_ia32_getrusage |
| #define __NR_compat_getsid __NR_ia32_getsid |
| #define __NR_compat_gettid __NR_ia32_gettid |
| #define __NR_compat_gettimeofday __NR_ia32_gettimeofday |
| #define __NR_compat_getuid __NR_ia32_getuid |
| #define __NR_compat_getxattr __NR_ia32_getxattr |
| #define __NR_compat_inotify_add_watch __NR_ia32_inotify_add_watch |
| #define __NR_compat_inotify_init __NR_ia32_inotify_init |
| #define __NR_compat_inotify_init1 __NR_ia32_inotify_init1 |
| #define __NR_compat_inotify_rm_watch __NR_ia32_inotify_rm_watch |
| #define __NR_compat_ioctl __NR_ia32_ioctl |
| #define __NR_compat_io_destroy __NR_ia32_io_destroy |
| #define __NR_compat_io_getevents __NR_ia32_io_getevents |
| #define __NR_compat_io_setup __NR_ia32_io_setup |
| #define __NR_compat_io_submit __NR_ia32_io_submit |
| #define __NR_compat_ioprio_set __NR_ia32_ioprio_set |
| #define __NR_compat_kcmp __NR_ia32_kcmp |
| #define __NR_compat_keyctl __NR_ia32_keyctl |
| #define __NR_compat_kill __NR_ia32_kill |
| #define __NR_compat_lgetxattr __NR_ia32_lgetxattr |
| #define __NR_compat_link __NR_ia32_link |
| #define __NR_compat_linkat __NR_ia32_linkat |
| #define __NR_compat_listxattr __NR_ia32_listxattr |
| #define __NR_compat_llistxattr __NR_ia32_llistxattr |
| #define __NR_compat_lremovexattr __NR_ia32_lremovexattr |
| #define __NR_compat_lseek __NR_ia32_lseek |
| #define __NR_compat_lsetxattr __NR_ia32_lsetxattr |
| #define __NR_compat_lstat __NR_ia32_lstat |
| #define __NR_compat_madvise __NR_ia32_madvise |
| #define __NR_compat_membarrier __NR_ia32_membarrier |
| #define __NR_compat_memfd_create __NR_ia32_memfd_create |
| #define __NR_compat_mincore __NR_ia32_mincore |
| #define __NR_compat_mkdir __NR_ia32_mkdir |
| #define __NR_compat_mkdirat __NR_ia32_mkdirat |
| #define __NR_compat_mknod __NR_ia32_mknod |
| #define __NR_compat_mknodat __NR_ia32_mknodat |
| #define __NR_compat_mlock __NR_ia32_mlock |
| #define __NR_compat_munlock __NR_ia32_munlock |
| #define __NR_compat_mlockall __NR_ia32_mlockall |
| #define __NR_compat_munlockall __NR_ia32_munlockall |
| #define __NR_compat_modify_ldt __NR_ia32_modify_ldt |
| #define __NR_compat_mount __NR_ia32_mount |
| #define __NR_compat_mprotect __NR_ia32_mprotect |
| #define __NR_compat_mremap __NR_ia32_mremap |
| #define __NR_compat_msync __NR_ia32_msync |
| #define __NR_compat_munmap __NR_ia32_munmap |
| #define __NR_compat_name_to_handle_at __NR_ia32_name_to_handle_at |
| #define __NR_compat_nanosleep __NR_ia32_nanosleep |
| #define __NR_compat_open __NR_ia32_open |
| #define __NR_compat_open_by_handle_at __NR_ia32_open_by_handle_at |
| #define __NR_compat_openat __NR_ia32_openat |
| #define __NR_compat_perf_event_open __NR_ia32_perf_event_open |
| #define __NR_compat_personality __NR_ia32_personality |
| #define __NR_compat_pipe __NR_ia32_pipe |
| #define __NR_compat_pipe2 __NR_ia32_pipe2 |
| #define __NR_compat_poll __NR_ia32_poll |
| #define __NR_compat_ppoll __NR_ia32_ppoll |
| #define __NR_compat_prctl __NR_ia32_prctl |
| #define __NR_compat_pread64 __NR_ia32_pread64 |
| #define __NR_compat_preadv __NR_ia32_preadv |
| #define __NR_compat_prlimit64 __NR_ia32_prlimit64 |
| #define __NR_compat_process_vm_readv __NR_ia32_process_vm_readv |
| #define __NR_compat_process_vm_writev __NR_ia32_process_vm_writev |
| #define __NR_compat_pselect6 __NR_ia32_pselect6 |
| #define __NR_compat_ptrace __NR_ia32_ptrace |
| #define __NR_compat_pwrite64 __NR_ia32_pwrite64 |
| #define __NR_compat_pwritev __NR_ia32_pwritev |
| #define __NR_compat_read __NR_ia32_read |
| #define __NR_compat_readahead __NR_ia32_readahead |
| #define __NR_compat_readv __NR_ia32_readv |
| #define __NR_compat_readlink __NR_ia32_readlink |
| #define __NR_compat_readlinkat __NR_ia32_readlinkat |
| #define __NR_compat_recvmmsg __NR_ia32_recvmmsg |
| #define __NR_compat_remap_file_pages __NR_ia32_remap_file_pages |
| #define __NR_compat_removexattr __NR_ia32_removexattr |
| #define __NR_compat_rename __NR_ia32_rename |
| #define __NR_compat_renameat __NR_ia32_renameat |
| #define __NR_compat_renameat2 __NR_ia32_renameat2 |
| #define __NR_compat_restart_syscall __NR_ia32_restart_syscall |
| #define __NR_compat_rmdir __NR_ia32_rmdir |
| #define __NR_compat_rt_sigaction __NR_ia32_rt_sigaction |
| #define __NR_compat_rt_sigpending __NR_ia32_rt_sigpending |
| #define __NR_compat_rt_sigprocmask __NR_ia32_rt_sigprocmask |
| #define __NR_compat_rt_sigqueueinfo __NR_ia32_rt_sigqueueinfo |
| #define __NR_compat_rt_sigreturn __NR_ia32_rt_sigreturn |
| #define __NR_compat_rt_sigsuspend __NR_ia32_rt_sigsuspend |
| #define __NR_compat_rt_sigtimedwait __NR_ia32_rt_sigtimedwait |
| #define __NR_compat_rt_tgsigqueueinfo __NR_ia32_rt_tgsigqueueinfo |
| #define __NR_compat_sched_get_priority_max __NR_ia32_sched_get_priority_max |
| #define __NR_compat_sched_get_priority_min __NR_ia32_sched_get_priority_min |
| #define __NR_compat_sched_getaffinity __NR_ia32_sched_getaffinity |
| #define __NR_compat_sched_getparam __NR_ia32_sched_getparam |
| #define __NR_compat_sched_getscheduler __NR_ia32_sched_getscheduler |
| #define __NR_compat_sched_setaffinity __NR_ia32_sched_setaffinity |
| #define __NR_compat_sched_setparam __NR_ia32_sched_setparam |
| #define __NR_compat_sched_setscheduler __NR_ia32_sched_setscheduler |
| #define __NR_compat_sched_yield __NR_ia32_sched_yield |
| #define __NR_compat_seccomp __NR_ia32_seccomp |
| #define __NR_compat_sendfile __NR_ia32_sendfile |
| #define __NR_compat_sendfile64 __NR_ia32_sendfile64 |
| #define __NR_compat_sendmmsg __NR_ia32_sendmmsg |
| #define __NR_compat_setdomainname __NR_ia32_setdomainname |
| #define __NR_compat_set_robust_list __NR_ia32_set_robust_list |
| #define __NR_compat_set_tid_address __NR_ia32_set_tid_address |
| #define __NR_compat_set_thread_area __NR_ia32_set_thread_area |
| #define __NR_compat_setgid __NR_ia32_setgid |
| #define __NR_compat_setgroups __NR_ia32_setgroups |
| #define __NR_compat_setitimer __NR_ia32_setitimer |
| #define __NR_compat_setns __NR_ia32_setns |
| #define __NR_compat_setpgid __NR_ia32_setpgid |
| #define __NR_compat_setpriority __NR_ia32_setpriority |
| #define __NR_compat_setregid __NR_ia32_setregid |
| #define __NR_compat_setresgid __NR_ia32_setresgid |
| #define __NR_compat_setresuid __NR_ia32_setresuid |
| #define __NR_compat_setrlimit __NR_ia32_setrlimit |
| #define __NR_compat_setsid __NR_ia32_setsid |
| #define __NR_compat_settimeofday __NR_ia32_settimeofday |
| #define __NR_compat_setuid __NR_ia32_setuid |
| #define __NR_compat_setxattr __NR_ia32_setxattr |
| #define __NR_compat_signalfd4 __NR_ia32_signalfd4 |
| #define __NR_compat_sigaltstack __NR_ia32_sigaltstack |
| #define __NR_compat_socketcall __NR_ia32_socketcall |
| #define __NR_compat_splice __NR_ia32_splice |
| #define __NR_compat_stat __NR_ia32_stat |
| #define __NR_compat_statfs __NR_ia32_statfs |
| #define __NR_compat_symlink __NR_ia32_symlink |
| #define __NR_compat_symlinkat __NR_ia32_symlinkat |
| #define __NR_compat_sync __NR_ia32_sync |
| #define __NR_compat_syncfs __NR_ia32_syncfs |
| #define __NR_compat_sync_file_range __NR_ia32_sync_file_range |
| #define __NR_compat_sysinfo __NR_ia32_sysinfo |
| #define __NR_compat_syslog __NR_ia32_syslog |
| #define __NR_compat_tee __NR_ia32_tee |
| #define __NR_compat_tgkill __NR_ia32_tgkill |
| #define __NR_compat_tkill __NR_ia32_tkill |
| #define __NR_compat_time __NR_ia32_time |
| #define __NR_compat_timer_create __NR_ia32_timer_create |
| #define __NR_compat_timer_delete __NR_ia32_timer_delete |
| #define __NR_compat_timer_getoverrun __NR_ia32_timer_getoverrun |
| #define __NR_compat_timer_gettime __NR_ia32_timer_gettime |
| #define __NR_compat_timer_settime __NR_ia32_timer_settime |
| #define __NR_compat_timerfd_create __NR_ia32_timerfd_create |
| #define __NR_compat_timerfd_gettime __NR_ia32_timerfd_gettime |
| #define __NR_compat_timerfd_settime __NR_ia32_timerfd_settime |
| #define __NR_compat_times __NR_ia32_times |
| #define __NR_compat_truncate __NR_ia32_truncate |
| #define __NR_compat_umask __NR_ia32_umask |
| #define __NR_compat_umount2 __NR_ia32_umount2 |
| #define __NR_compat_uname __NR_ia32_uname |
| #define __NR_compat_unlink __NR_ia32_unlink |
| #define __NR_compat_unlinkat __NR_ia32_unlinkat |
| #define __NR_compat_unshare __NR_ia32_unshare |
| #define __NR_compat_ustat __NR_ia32_ustat |
| #define __NR_compat_utimensat __NR_ia32_utimensat |
| #define __NR_compat_utimes __NR_ia32_utimes |
| #define __NR_compat_vfork __NR_ia32_vfork |
| #define __NR_compat_vmsplice __NR_ia32_vmsplice |
| #define __NR_compat_wait4 __NR_ia32_wait4 |
| #define __NR_compat_waitid __NR_ia32_waitid |
| #define __NR_compat_waitpid __NR_ia32_waitpid |
| #define __NR_compat_write __NR_ia32_write |
| #define __NR_compat_writev __NR_ia32_writev |
| #define __NR_compat_chown32 __NR_ia32_chown32 |
| #define __NR_compat_fadvise64 __NR_ia32_fadvise64 |
| #define __NR_compat_fadvise64_64 __NR_ia32_fadvise64_64 |
| #define __NR_compat_fchown32 __NR_ia32_fchown32 |
| #define __NR_compat_fcntl64 __NR_ia32_fcntl64 |
| #define __NR_compat_fstat64 __NR_ia32_fstat64 |
| #define __NR_compat_fstatat64 __NR_ia32_fstatat64 |
| #define __NR_compat_fstatfs64 __NR_ia32_fstatfs64 |
| #define __NR_compat_ftruncate64 __NR_ia32_ftruncate64 |
| #define __NR_compat_getegid32 __NR_ia32_getegid32 |
| #define __NR_compat_geteuid32 __NR_ia32_geteuid32 |
| #define __NR_compat_getgid32 __NR_ia32_getgid32 |
| #define __NR_compat_getresgid32 __NR_ia32_getresgid32 |
| #define __NR_compat_getresuid32 __NR_ia32_getresuid32 |
| #define __NR_compat_getuid32 __NR_ia32_getuid32 |
| #define __NR_compat_lchown32 __NR_ia32_lchown32 |
| #define __NR_compat_lstat64 __NR_ia32_lstat64 |
| #define __NR_compat_mmap2 __NR_ia32_mmap2 |
| #define __NR_compat__newselect __NR_ia32__newselect |
| #define __NR_compat__llseek __NR_ia32__llseek |
| #define __NR_compat_sigaction __NR_ia32_sigaction |
| #define __NR_compat_sigpending __NR_ia32_sigpending |
| #define __NR_compat_sigprocmask __NR_ia32_sigprocmask |
| #define __NR_compat_sigreturn __NR_ia32_sigreturn |
| #define __NR_compat_sigsuspend __NR_ia32_sigsuspend |
| #define __NR_compat_setgid32 __NR_ia32_setgid32 |
| #define __NR_compat_setgroups32 __NR_ia32_setgroups32 |
| #define __NR_compat_setregid32 __NR_ia32_setregid32 |
| #define __NR_compat_setresgid32 __NR_ia32_setresgid32 |
| #define __NR_compat_setresuid32 __NR_ia32_setresuid32 |
| #define __NR_compat_setreuid32 __NR_ia32_setreuid32 |
| #define __NR_compat_setuid32 __NR_ia32_setuid32 |
| #define __NR_compat_stat64 __NR_ia32_stat64 |
| #define __NR_compat_statfs64 __NR_ia32_statfs64 |
| #define __NR_compat_truncate64 __NR_ia32_truncate64 |
| #define __NR_compat_ugetrlimit __NR_ia32_ugetrlimit |
| #endif |
| #endif |
| |
| #endif /* ALT_SYSCALL_H */ |