Re: [PATCH] selinux: remove the SELinux lockdown implementation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Sep 29, 2021 at 4:24 PM Paul Moore <paul@xxxxxxxxxxxxxx> wrote:
> NOTE: This patch intentionally omits any "Fixes:" metadata or stable
> tagging since it removes a SELinux access control check; while
> removing the control point is the right thing to do moving forward,
> removing it in stable kernels could be seen as a regression.
>
> The original SELinux lockdown implementation in 59438b46471a
> ("security,lockdown,selinux: implement SELinux lockdown") used the
> current task's credentials as both the subject and object in the
> SELinux lockdown hook, selinux_lockdown().  Unfortunately that
> proved to be incorrect in a number of cases as the core kernel was
> calling the LSM lockdown hook in places where the credentials from
> the "current" task_struct were not the correct credentials to use
> in the SELinux access check.
>
> Attempts were made to resolve this by adding a credential pointer
> to the LSM lockdown hook as well as suggesting that the single hook
> be split into two: one for user tasks, one for kernel tasks; however
> neither approach was deemed acceptable by Linus.  Faced with the
> prospect of either changing the subj/obj in the access check to a
> constant context (likely the kernel's label) or removing the SELinux
> lockdown check entirely, the SELinux community decided that removing
> the lockdown check was preferable.
>
> The supporting changes to the general LSM layer are left intact, this
> patch only removes the SELinux implementation.
>
> Signed-off-by: Paul Moore <paul@xxxxxxxxxxxxxx>

I would probably also remove LSM_AUDIT_DATA_LOCKDOWN, but I don't care
enough to argue about it :)

Acked-by: Ondrej Mosnacek <omosnace@xxxxxxxxxx>

/me goes off to prepare a patch to remove the lockdown test from the
testsuite...

> ---
>  security/selinux/hooks.c            |   30 ------------------------------
>  security/selinux/include/classmap.h |    2 --
>  2 files changed, 32 deletions(-)
>
> diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> index 6517f221d52c..11ebbbd65823 100644
> --- a/security/selinux/hooks.c
> +++ b/security/selinux/hooks.c
> @@ -7013,34 +7013,6 @@ static void selinux_bpf_prog_free(struct bpf_prog_aux *aux)
>  }
>  #endif
>
> -static int selinux_lockdown(enum lockdown_reason what)
> -{
> -       struct common_audit_data ad;
> -       u32 sid = current_sid();
> -       int invalid_reason = (what <= LOCKDOWN_NONE) ||
> -                            (what == LOCKDOWN_INTEGRITY_MAX) ||
> -                            (what >= LOCKDOWN_CONFIDENTIALITY_MAX);
> -
> -       if (WARN(invalid_reason, "Invalid lockdown reason")) {
> -               audit_log(audit_context(),
> -                         GFP_ATOMIC, AUDIT_SELINUX_ERR,
> -                         "lockdown_reason=invalid");
> -               return -EINVAL;
> -       }
> -
> -       ad.type = LSM_AUDIT_DATA_LOCKDOWN;
> -       ad.u.reason = what;
> -
> -       if (what <= LOCKDOWN_INTEGRITY_MAX)
> -               return avc_has_perm(&selinux_state,
> -                                   sid, sid, SECCLASS_LOCKDOWN,
> -                                   LOCKDOWN__INTEGRITY, &ad);
> -       else
> -               return avc_has_perm(&selinux_state,
> -                                   sid, sid, SECCLASS_LOCKDOWN,
> -                                   LOCKDOWN__CONFIDENTIALITY, &ad);
> -}
> -
>  struct lsm_blob_sizes selinux_blob_sizes __lsm_ro_after_init = {
>         .lbs_cred = sizeof(struct task_security_struct),
>         .lbs_file = sizeof(struct file_security_struct),
> @@ -7349,8 +7321,6 @@ static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = {
>         LSM_HOOK_INIT(perf_event_write, selinux_perf_event_write),
>  #endif
>
> -       LSM_HOOK_INIT(locked_down, selinux_lockdown),
> -
>         /*
>          * PUT "CLONING" (ACCESSING + ALLOCATING) HOOKS HERE
>          */
> diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h
> index 084757ff4390..9859787e8e61 100644
> --- a/security/selinux/include/classmap.h
> +++ b/security/selinux/include/classmap.h
> @@ -250,8 +250,6 @@ struct security_class_mapping secclass_map[] = {
>           { COMMON_SOCK_PERMS, NULL } },
>         { "perf_event",
>           { "open", "cpu", "kernel", "tracepoint", "read", "write", NULL } },
> -       { "lockdown",
> -         { "integrity", "confidentiality", NULL } },
>         { "anon_inode",
>           { COMMON_FILE_PERMS, NULL } },
>         { NULL }
>

--
Ondrej Mosnacek
Software Engineer, Linux Security - SELinux kernel
Red Hat, Inc.




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux