Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

apparmor: Refactor to remove bprm_secureexec hook

The AppArmor bprm_secureexec hook can be merged with the bprm_set_creds
hook since it's dealing with the same information, and all of the details
are finalized during the first call to the bprm_set_creds hook via
prepare_binprm() (subsequent calls due to binfmt_script, etc, are ignored
via bprm->called_set_creds).

Here, all the comments describe how secureexec is actually calculated
during bprm_set_creds, so this actually does it, drops the bprm flag that
was being used internally by AppArmor, and drops the bprm_secureexec hook.

Signed-off-by: Kees Cook <keescook@chromium.org>
Acked-by: John Johansen <john.johansen@canonical.com>
Reviewed-by: James Morris <james.l.morris@oracle.com>
Acked-by: Serge Hallyn <serge@hallyn.com>

+1 -23
+1 -18
security/apparmor/domain.c
··· 807 807 aa_label_printk(new, GFP_ATOMIC); 808 808 dbg_printk("\n"); 809 809 } 810 - bprm->unsafe |= AA_SECURE_X_NEEDED; 810 + bprm->secureexec = 1; 811 811 } 812 812 813 813 if (label->proxy != new->proxy) { ··· 841 841 error)); 842 842 aa_put_label(new); 843 843 goto done; 844 - } 845 - 846 - /** 847 - * apparmor_bprm_secureexec - determine if secureexec is needed 848 - * @bprm: binprm for exec (NOT NULL) 849 - * 850 - * Returns: %1 if secureexec is needed else %0 851 - */ 852 - int apparmor_bprm_secureexec(struct linux_binprm *bprm) 853 - { 854 - /* the decision to use secure exec is computed in set_creds 855 - * and stored in bprm->unsafe. 856 - */ 857 - if (bprm->unsafe & AA_SECURE_X_NEEDED) 858 - return 1; 859 - 860 - return 0; 861 844 } 862 845 863 846 /*
-1
security/apparmor/include/domain.h
··· 30 30 #define AA_CHANGE_STACK 8 31 31 32 32 int apparmor_bprm_set_creds(struct linux_binprm *bprm); 33 - int apparmor_bprm_secureexec(struct linux_binprm *bprm); 34 33 35 34 void aa_free_domain_entries(struct aa_domain *domain); 36 35 int aa_change_hat(const char *hats[], int count, u64 token, int flags);
-3
security/apparmor/include/file.h
··· 101 101 #define AA_X_INHERIT 0x4000 102 102 #define AA_X_UNCONFINED 0x8000 103 103 104 - /* AA_SECURE_X_NEEDED - is passed in the bprm->unsafe field */ 105 - #define AA_SECURE_X_NEEDED 0x8000 106 - 107 104 /* need to make conditional which ones are being set */ 108 105 struct path_cond { 109 106 kuid_t uid;
-1
security/apparmor/lsm.c
··· 694 694 LSM_HOOK_INIT(bprm_set_creds, apparmor_bprm_set_creds), 695 695 LSM_HOOK_INIT(bprm_committing_creds, apparmor_bprm_committing_creds), 696 696 LSM_HOOK_INIT(bprm_committed_creds, apparmor_bprm_committed_creds), 697 - LSM_HOOK_INIT(bprm_secureexec, apparmor_bprm_secureexec), 698 697 699 698 LSM_HOOK_INIT(task_setrlimit, apparmor_task_setrlimit), 700 699 };