diff options
Diffstat (limited to 'security/selinux/hooks.c')
-rw-r--r-- | security/selinux/hooks.c | 94 |
1 files changed, 15 insertions, 79 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 0cf105f346d4..06c9dd962c3c 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -1990,12 +1990,6 @@ static int selinux_binder_transfer_file(struct task_struct *from, | |||
1990 | static int selinux_ptrace_access_check(struct task_struct *child, | 1990 | static int selinux_ptrace_access_check(struct task_struct *child, |
1991 | unsigned int mode) | 1991 | unsigned int mode) |
1992 | { | 1992 | { |
1993 | int rc; | ||
1994 | |||
1995 | rc = cap_ptrace_access_check(child, mode); | ||
1996 | if (rc) | ||
1997 | return rc; | ||
1998 | |||
1999 | if (mode & PTRACE_MODE_READ) { | 1993 | if (mode & PTRACE_MODE_READ) { |
2000 | u32 sid = current_sid(); | 1994 | u32 sid = current_sid(); |
2001 | u32 csid = task_sid(child); | 1995 | u32 csid = task_sid(child); |
@@ -2007,25 +2001,13 @@ static int selinux_ptrace_access_check(struct task_struct *child, | |||
2007 | 2001 | ||
2008 | static int selinux_ptrace_traceme(struct task_struct *parent) | 2002 | static int selinux_ptrace_traceme(struct task_struct *parent) |
2009 | { | 2003 | { |
2010 | int rc; | ||
2011 | |||
2012 | rc = cap_ptrace_traceme(parent); | ||
2013 | if (rc) | ||
2014 | return rc; | ||
2015 | |||
2016 | return task_has_perm(parent, current, PROCESS__PTRACE); | 2004 | return task_has_perm(parent, current, PROCESS__PTRACE); |
2017 | } | 2005 | } |
2018 | 2006 | ||
2019 | static int selinux_capget(struct task_struct *target, kernel_cap_t *effective, | 2007 | static int selinux_capget(struct task_struct *target, kernel_cap_t *effective, |
2020 | kernel_cap_t *inheritable, kernel_cap_t *permitted) | 2008 | kernel_cap_t *inheritable, kernel_cap_t *permitted) |
2021 | { | 2009 | { |
2022 | int error; | 2010 | return current_has_perm(target, PROCESS__GETCAP); |
2023 | |||
2024 | error = current_has_perm(target, PROCESS__GETCAP); | ||
2025 | if (error) | ||
2026 | return error; | ||
2027 | |||
2028 | return cap_capget(target, effective, inheritable, permitted); | ||
2029 | } | 2011 | } |
2030 | 2012 | ||
2031 | static int selinux_capset(struct cred *new, const struct cred *old, | 2013 | static int selinux_capset(struct cred *new, const struct cred *old, |
@@ -2033,13 +2015,6 @@ static int selinux_capset(struct cred *new, const struct cred *old, | |||
2033 | const kernel_cap_t *inheritable, | 2015 | const kernel_cap_t *inheritable, |
2034 | const kernel_cap_t *permitted) | 2016 | const kernel_cap_t *permitted) |
2035 | { | 2017 | { |
2036 | int error; | ||
2037 | |||
2038 | error = cap_capset(new, old, | ||
2039 | effective, inheritable, permitted); | ||
2040 | if (error) | ||
2041 | return error; | ||
2042 | |||
2043 | return cred_has_perm(old, new, PROCESS__SETCAP); | 2018 | return cred_has_perm(old, new, PROCESS__SETCAP); |
2044 | } | 2019 | } |
2045 | 2020 | ||
@@ -2056,12 +2031,6 @@ static int selinux_capset(struct cred *new, const struct cred *old, | |||
2056 | static int selinux_capable(const struct cred *cred, struct user_namespace *ns, | 2031 | static int selinux_capable(const struct cred *cred, struct user_namespace *ns, |
2057 | int cap, int audit) | 2032 | int cap, int audit) |
2058 | { | 2033 | { |
2059 | int rc; | ||
2060 | |||
2061 | rc = cap_capable(cred, ns, cap, audit); | ||
2062 | if (rc) | ||
2063 | return rc; | ||
2064 | |||
2065 | return cred_has_capability(cred, cap, audit); | 2034 | return cred_has_capability(cred, cap, audit); |
2066 | } | 2035 | } |
2067 | 2036 | ||
@@ -2139,12 +2108,12 @@ static int selinux_vm_enough_memory(struct mm_struct *mm, long pages) | |||
2139 | { | 2108 | { |
2140 | int rc, cap_sys_admin = 0; | 2109 | int rc, cap_sys_admin = 0; |
2141 | 2110 | ||
2142 | rc = selinux_capable(current_cred(), &init_user_ns, CAP_SYS_ADMIN, | 2111 | rc = cred_has_capability(current_cred(), CAP_SYS_ADMIN, |
2143 | SECURITY_CAP_NOAUDIT); | 2112 | SECURITY_CAP_NOAUDIT); |
2144 | if (rc == 0) | 2113 | if (rc == 0) |
2145 | cap_sys_admin = 1; | 2114 | cap_sys_admin = 1; |
2146 | 2115 | ||
2147 | return __vm_enough_memory(mm, pages, cap_sys_admin); | 2116 | return cap_sys_admin; |
2148 | } | 2117 | } |
2149 | 2118 | ||
2150 | /* binprm security operations */ | 2119 | /* binprm security operations */ |
@@ -2193,10 +2162,6 @@ static int selinux_bprm_set_creds(struct linux_binprm *bprm) | |||
2193 | struct inode *inode = file_inode(bprm->file); | 2162 | struct inode *inode = file_inode(bprm->file); |
2194 | int rc; | 2163 | int rc; |
2195 | 2164 | ||
2196 | rc = cap_bprm_set_creds(bprm); | ||
2197 | if (rc) | ||
2198 | return rc; | ||
2199 | |||
2200 | /* SELinux context only depends on initial program or script and not | 2165 | /* SELinux context only depends on initial program or script and not |
2201 | * the script interpreter */ | 2166 | * the script interpreter */ |
2202 | if (bprm->cred_prepared) | 2167 | if (bprm->cred_prepared) |
@@ -2320,7 +2285,7 @@ static int selinux_bprm_secureexec(struct linux_binprm *bprm) | |||
2320 | PROCESS__NOATSECURE, NULL); | 2285 | PROCESS__NOATSECURE, NULL); |
2321 | } | 2286 | } |
2322 | 2287 | ||
2323 | return (atsecure || cap_bprm_secureexec(bprm)); | 2288 | return !!atsecure; |
2324 | } | 2289 | } |
2325 | 2290 | ||
2326 | static int match_file(const void *p, struct file *file, unsigned fd) | 2291 | static int match_file(const void *p, struct file *file, unsigned fd) |
@@ -3132,8 +3097,11 @@ static int selinux_inode_getsecurity(const struct inode *inode, const char *name | |||
3132 | * and lack of permission just means that we fall back to the | 3097 | * and lack of permission just means that we fall back to the |
3133 | * in-core context value, not a denial. | 3098 | * in-core context value, not a denial. |
3134 | */ | 3099 | */ |
3135 | error = selinux_capable(current_cred(), &init_user_ns, CAP_MAC_ADMIN, | 3100 | error = cap_capable(current_cred(), &init_user_ns, CAP_MAC_ADMIN, |
3136 | SECURITY_CAP_NOAUDIT); | 3101 | SECURITY_CAP_NOAUDIT); |
3102 | if (!error) | ||
3103 | error = cred_has_capability(current_cred(), CAP_MAC_ADMIN, | ||
3104 | SECURITY_CAP_NOAUDIT); | ||
3137 | if (!error) | 3105 | if (!error) |
3138 | error = security_sid_to_context_force(isec->sid, &context, | 3106 | error = security_sid_to_context_force(isec->sid, &context, |
3139 | &size); | 3107 | &size); |
@@ -3318,12 +3286,7 @@ error: | |||
3318 | 3286 | ||
3319 | static int selinux_mmap_addr(unsigned long addr) | 3287 | static int selinux_mmap_addr(unsigned long addr) |
3320 | { | 3288 | { |
3321 | int rc; | 3289 | int rc = 0; |
3322 | |||
3323 | /* do DAC check on address space usage */ | ||
3324 | rc = cap_mmap_addr(addr); | ||
3325 | if (rc) | ||
3326 | return rc; | ||
3327 | 3290 | ||
3328 | if (addr < CONFIG_LSM_MMAP_MIN_ADDR) { | 3291 | if (addr < CONFIG_LSM_MMAP_MIN_ADDR) { |
3329 | u32 sid = current_sid(); | 3292 | u32 sid = current_sid(); |
@@ -3639,23 +3602,11 @@ static void selinux_task_getsecid(struct task_struct *p, u32 *secid) | |||
3639 | 3602 | ||
3640 | static int selinux_task_setnice(struct task_struct *p, int nice) | 3603 | static int selinux_task_setnice(struct task_struct *p, int nice) |
3641 | { | 3604 | { |
3642 | int rc; | ||
3643 | |||
3644 | rc = cap_task_setnice(p, nice); | ||
3645 | if (rc) | ||
3646 | return rc; | ||
3647 | |||
3648 | return current_has_perm(p, PROCESS__SETSCHED); | 3605 | return current_has_perm(p, PROCESS__SETSCHED); |
3649 | } | 3606 | } |
3650 | 3607 | ||
3651 | static int selinux_task_setioprio(struct task_struct *p, int ioprio) | 3608 | static int selinux_task_setioprio(struct task_struct *p, int ioprio) |
3652 | { | 3609 | { |
3653 | int rc; | ||
3654 | |||
3655 | rc = cap_task_setioprio(p, ioprio); | ||
3656 | if (rc) | ||
3657 | return rc; | ||
3658 | |||
3659 | return current_has_perm(p, PROCESS__SETSCHED); | 3610 | return current_has_perm(p, PROCESS__SETSCHED); |
3660 | } | 3611 | } |
3661 | 3612 | ||
@@ -3681,12 +3632,6 @@ static int selinux_task_setrlimit(struct task_struct *p, unsigned int resource, | |||
3681 | 3632 | ||
3682 | static int selinux_task_setscheduler(struct task_struct *p) | 3633 | static int selinux_task_setscheduler(struct task_struct *p) |
3683 | { | 3634 | { |
3684 | int rc; | ||
3685 | |||
3686 | rc = cap_task_setscheduler(p); | ||
3687 | if (rc) | ||
3688 | return rc; | ||
3689 | |||
3690 | return current_has_perm(p, PROCESS__SETSCHED); | 3635 | return current_has_perm(p, PROCESS__SETSCHED); |
3691 | } | 3636 | } |
3692 | 3637 | ||
@@ -5097,12 +5042,6 @@ static unsigned int selinux_ipv6_postroute(const struct nf_hook_ops *ops, | |||
5097 | 5042 | ||
5098 | static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb) | 5043 | static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb) |
5099 | { | 5044 | { |
5100 | int err; | ||
5101 | |||
5102 | err = cap_netlink_send(sk, skb); | ||
5103 | if (err) | ||
5104 | return err; | ||
5105 | |||
5106 | return selinux_nlmsg_perm(sk, skb); | 5045 | return selinux_nlmsg_perm(sk, skb); |
5107 | } | 5046 | } |
5108 | 5047 | ||
@@ -5840,9 +5779,7 @@ static int selinux_key_getsecurity(struct key *key, char **_buffer) | |||
5840 | 5779 | ||
5841 | #endif | 5780 | #endif |
5842 | 5781 | ||
5843 | static struct security_operations selinux_ops = { | 5782 | static struct security_hook_list selinux_hooks[] = { |
5844 | LSM_HOOK_INIT(name, "selinux"), | ||
5845 | |||
5846 | LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr), | 5783 | LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr), |
5847 | LSM_HOOK_INIT(binder_transaction, selinux_binder_transaction), | 5784 | LSM_HOOK_INIT(binder_transaction, selinux_binder_transaction), |
5848 | LSM_HOOK_INIT(binder_transfer_binder, selinux_binder_transfer_binder), | 5785 | LSM_HOOK_INIT(binder_transfer_binder, selinux_binder_transfer_binder), |
@@ -6055,7 +5992,7 @@ static struct security_operations selinux_ops = { | |||
6055 | 5992 | ||
6056 | static __init int selinux_init(void) | 5993 | static __init int selinux_init(void) |
6057 | { | 5994 | { |
6058 | if (!security_module_enable(&selinux_ops)) { | 5995 | if (!security_module_enable("selinux")) { |
6059 | selinux_enabled = 0; | 5996 | selinux_enabled = 0; |
6060 | return 0; | 5997 | return 0; |
6061 | } | 5998 | } |
@@ -6077,8 +6014,7 @@ static __init int selinux_init(void) | |||
6077 | 0, SLAB_PANIC, NULL); | 6014 | 0, SLAB_PANIC, NULL); |
6078 | avc_init(); | 6015 | avc_init(); |
6079 | 6016 | ||
6080 | if (register_security(&selinux_ops)) | 6017 | security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks)); |
6081 | panic("SELinux: Unable to register with kernel.\n"); | ||
6082 | 6018 | ||
6083 | if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET)) | 6019 | if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET)) |
6084 | panic("SELinux: Unable to register AVC netcache callback\n"); | 6020 | panic("SELinux: Unable to register AVC netcache callback\n"); |
@@ -6206,7 +6142,7 @@ int selinux_disable(void) | |||
6206 | selinux_disabled = 1; | 6142 | selinux_disabled = 1; |
6207 | selinux_enabled = 0; | 6143 | selinux_enabled = 0; |
6208 | 6144 | ||
6209 | reset_security_ops(); | 6145 | security_delete_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks)); |
6210 | 6146 | ||
6211 | /* Try to destroy the avc node cache */ | 6147 | /* Try to destroy the avc node cache */ |
6212 | avc_disable(); | 6148 | avc_disable(); |