diff options
| author | Kees Cook <keescook@chromium.org> | 2017-07-18 18:25:24 -0400 |
|---|---|---|
| committer | Kees Cook <keescook@chromium.org> | 2017-08-01 15:03:06 -0400 |
| commit | 993b3ab0642e57da5de6bef11dd50db7e2fc3b7e (patch) | |
| tree | 0406425b33f4d3c513d9cf773ddcfe25500a5d5e /security | |
| parent | c425e189ffd7720c881fe9ccd7143cea577f6d03 (diff) | |
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>
Diffstat (limited to 'security')
| -rw-r--r-- | security/apparmor/domain.c | 19 | ||||
| -rw-r--r-- | security/apparmor/include/domain.h | 1 | ||||
| -rw-r--r-- | security/apparmor/include/file.h | 3 | ||||
| -rw-r--r-- | security/apparmor/lsm.c | 1 |
4 files changed, 1 insertions, 23 deletions
diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c index 67ec52cfc523..17a601c67b62 100644 --- a/security/apparmor/domain.c +++ b/security/apparmor/domain.c | |||
| @@ -807,7 +807,7 @@ int apparmor_bprm_set_creds(struct linux_binprm *bprm) | |||
| 807 | aa_label_printk(new, GFP_ATOMIC); | 807 | aa_label_printk(new, GFP_ATOMIC); |
| 808 | dbg_printk("\n"); | 808 | dbg_printk("\n"); |
| 809 | } | 809 | } |
| 810 | bprm->unsafe |= AA_SECURE_X_NEEDED; | 810 | bprm->secureexec = 1; |
| 811 | } | 811 | } |
| 812 | 812 | ||
| 813 | if (label->proxy != new->proxy) { | 813 | if (label->proxy != new->proxy) { |
| @@ -843,23 +843,6 @@ audit: | |||
| 843 | goto done; | 843 | goto done; |
| 844 | } | 844 | } |
| 845 | 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 | } | ||
| 862 | |||
| 863 | /* | 846 | /* |
| 864 | * Functions for self directed profile change | 847 | * Functions for self directed profile change |
| 865 | */ | 848 | */ |
diff --git a/security/apparmor/include/domain.h b/security/apparmor/include/domain.h index bab5810b6e9a..24c5976d6143 100644 --- a/security/apparmor/include/domain.h +++ b/security/apparmor/include/domain.h | |||
| @@ -30,7 +30,6 @@ struct aa_domain { | |||
| 30 | #define AA_CHANGE_STACK 8 | 30 | #define AA_CHANGE_STACK 8 |
| 31 | 31 | ||
| 32 | int apparmor_bprm_set_creds(struct linux_binprm *bprm); | 32 | int apparmor_bprm_set_creds(struct linux_binprm *bprm); |
| 33 | int apparmor_bprm_secureexec(struct linux_binprm *bprm); | ||
| 34 | 33 | ||
| 35 | void aa_free_domain_entries(struct aa_domain *domain); | 34 | void aa_free_domain_entries(struct aa_domain *domain); |
| 36 | int aa_change_hat(const char *hats[], int count, u64 token, int flags); | 35 | int aa_change_hat(const char *hats[], int count, u64 token, int flags); |
diff --git a/security/apparmor/include/file.h b/security/apparmor/include/file.h index 001e40073ff9..4c2c8ac8842f 100644 --- a/security/apparmor/include/file.h +++ b/security/apparmor/include/file.h | |||
| @@ -101,9 +101,6 @@ static inline struct aa_label *aa_get_file_label(struct aa_file_ctx *ctx) | |||
| 101 | #define AA_X_INHERIT 0x4000 | 101 | #define AA_X_INHERIT 0x4000 |
| 102 | #define AA_X_UNCONFINED 0x8000 | 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 | /* need to make conditional which ones are being set */ | 104 | /* need to make conditional which ones are being set */ |
| 108 | struct path_cond { | 105 | struct path_cond { |
| 109 | kuid_t uid; | 106 | kuid_t uid; |
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index 867bcd154c7e..7a82c0f61452 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c | |||
| @@ -694,7 +694,6 @@ static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = { | |||
| 694 | LSM_HOOK_INIT(bprm_set_creds, apparmor_bprm_set_creds), | 694 | LSM_HOOK_INIT(bprm_set_creds, apparmor_bprm_set_creds), |
| 695 | LSM_HOOK_INIT(bprm_committing_creds, apparmor_bprm_committing_creds), | 695 | LSM_HOOK_INIT(bprm_committing_creds, apparmor_bprm_committing_creds), |
| 696 | LSM_HOOK_INIT(bprm_committed_creds, apparmor_bprm_committed_creds), | 696 | LSM_HOOK_INIT(bprm_committed_creds, apparmor_bprm_committed_creds), |
| 697 | LSM_HOOK_INIT(bprm_secureexec, apparmor_bprm_secureexec), | ||
| 698 | 697 | ||
| 699 | LSM_HOOK_INIT(task_setrlimit, apparmor_task_setrlimit), | 698 | LSM_HOOK_INIT(task_setrlimit, apparmor_task_setrlimit), |
| 700 | }; | 699 | }; |
