linux-integrity.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] selinux: remove the 'checkreqprot' functionality
       [not found] <20230316175749.233373-1-paul@paul-moore.com>
@ 2023-03-16 18:25 ` Stephen Smalley
  2023-03-16 20:21   ` Paul Moore
  0 siblings, 1 reply; 2+ messages in thread
From: Stephen Smalley @ 2023-03-16 18:25 UTC (permalink / raw)
  To: Paul Moore, Mimi Zohar; +Cc: selinux, linux-integrity

On Thu, Mar 16, 2023 at 2:01 PM Paul Moore <paul@paul-moore.com> wrote:
>
> We originally promised that the SELinux 'checkreqprot' functionality
> would be removed no sooner than June 2021, and now that it is March
> 2023 it seems like it is a good time to do the final removal.  The
> deprecation notice in the kernel provides plenty of detail on why
> 'checkreqprot' is not desirable, with the key point repeated below:
>
>   This was a compatibility mechanism for legacy userspace and
>   for the READ_IMPLIES_EXEC personality flag.  However, if set to
>   1, it weakens security by allowing mappings to be made executable
>   without authorization by policy.  The default value of checkreqprot
>   at boot was changed starting in Linux v4.4 to 0 (i.e. check the
>   actual protection), and Android and Linux distributions have been
>   explicitly writing a "0" to /sys/fs/selinux/checkreqprot during
>   initialization for some time.
>
> Along with the official deprecation notice, we have been discussing
> this on-list and directly with several of the larger SELinux-based
> distros and everyone is happy to see this feature finally removed.
> In an attempt to catch all of the smaller, and DIY, Linux systems
> we have been writing a deprecation notice URL into the kernel log,
> along with a growing ssleep() penalty, when admins enabled
> checkreqprot at runtime or via the kernel command line.  We have
> yet to have anyone come to us and raise an objection to the
> deprecation or planned removal.
>
> It is worth noting that while this patch removes the checkreqprot
> functionality, it leaves the user visible interfaces (kernel command
> line and selinuxfs file) intact, just inert.  This should help
> prevent breakages with existing userspace tools that correctly, but
> unnecessarily, disable checkreqprot at boot or runtime.  Admins
> that attempt to enable checkreqprot will be met with a removal
> message in the kernel log.
>
> Signed-off-by: Paul Moore <paul@paul-moore.com>

Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>

I was wondering if we could remove the reqprot parameter altogether from the
mmap/mprotect hooks but looks like IMA is using it.

> ---
>  .../sysfs-selinux-checkreqprot                |  3 +++
>  security/selinux/Kconfig                      | 23 -------------------
>  security/selinux/hooks.c                      | 20 ++++------------
>  security/selinux/include/security.h           |  9 ++++----
>  security/selinux/selinuxfs.c                  | 13 ++++-------
>  5 files changed, 17 insertions(+), 51 deletions(-)
>  rename Documentation/ABI/{obsolete => removed}/sysfs-selinux-checkreqprot (90%)
>
> diff --git a/Documentation/ABI/obsolete/sysfs-selinux-checkreqprot b/Documentation/ABI/removed/sysfs-selinux-checkreqprot
> similarity index 90%
> rename from Documentation/ABI/obsolete/sysfs-selinux-checkreqprot
> rename to Documentation/ABI/removed/sysfs-selinux-checkreqprot
> index ed6b52ca210f..f599a0a87e8b 100644
> --- a/Documentation/ABI/obsolete/sysfs-selinux-checkreqprot
> +++ b/Documentation/ABI/removed/sysfs-selinux-checkreqprot
> @@ -4,6 +4,9 @@ KernelVersion:  2.6.12-rc2 (predates git)
>  Contact:       selinux@vger.kernel.org
>  Description:
>
> +       REMOVAL UPDATE: The SELinux checkreqprot functionality was removed in
> +       March 2023, the original deprecation notice is shown below.
> +
>         The selinuxfs "checkreqprot" node allows SELinux to be configured
>         to check the protection requested by userspace for mmap/mprotect
>         calls instead of the actual protection applied by the kernel.
> diff --git a/security/selinux/Kconfig b/security/selinux/Kconfig
> index 9e921fc72538..4ea946123255 100644
> --- a/security/selinux/Kconfig
> +++ b/security/selinux/Kconfig
> @@ -70,29 +70,6 @@ config SECURITY_SELINUX_AVC_STATS
>           /sys/fs/selinux/avc/cache_stats, which may be monitored via
>           tools such as avcstat.
>
> -config SECURITY_SELINUX_CHECKREQPROT_VALUE
> -       int "NSA SELinux checkreqprot default value"
> -       depends on SECURITY_SELINUX
> -       range 0 1
> -       default 0
> -       help
> -         This option sets the default value for the 'checkreqprot' flag
> -         that determines whether SELinux checks the protection requested
> -         by the application or the protection that will be applied by the
> -         kernel (including any implied execute for read-implies-exec) for
> -         mmap and mprotect calls.  If this option is set to 0 (zero),
> -         SELinux will default to checking the protection that will be applied
> -         by the kernel.  If this option is set to 1 (one), SELinux will
> -         default to checking the protection requested by the application.
> -         The checkreqprot flag may be changed from the default via the
> -         'checkreqprot=' boot parameter.  It may also be changed at runtime
> -         via /sys/fs/selinux/checkreqprot if authorized by policy.
> -
> -         WARNING: this option is deprecated and will be removed in a future
> -         kernel release.
> -
> -         If you are unsure how to answer this question, answer 0.
> -
>  config SECURITY_SELINUX_SIDTAB_HASH_BITS
>         int "NSA SELinux sidtab hashtable size"
>         depends on SECURITY_SELINUX
> diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> index db6d8b68b543..9a58971f9a16 100644
> --- a/security/selinux/hooks.c
> +++ b/security/selinux/hooks.c
> @@ -136,17 +136,13 @@ static int __init selinux_enabled_setup(char *str)
>  __setup("selinux=", selinux_enabled_setup);
>  #endif
>
> -static unsigned int selinux_checkreqprot_boot =
> -       CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE;
> -
>  static int __init checkreqprot_setup(char *str)
>  {
>         unsigned long checkreqprot;
>
>         if (!kstrtoul(str, 0, &checkreqprot)) {
> -               selinux_checkreqprot_boot = checkreqprot ? 1 : 0;
>                 if (checkreqprot)
> -                       pr_err("SELinux: checkreqprot set to 1 via kernel parameter.  This is deprecated and will be rejected in a future kernel release.\n");
> +                       pr_err("SELinux: checkreqprot set to 1 via kernel parameter.  This is no longer supported.\n");
>         }
>         return 1;
>  }
> @@ -3712,7 +3708,8 @@ static int selinux_mmap_addr(unsigned long addr)
>         return rc;
>  }
>
> -static int selinux_mmap_file(struct file *file, unsigned long reqprot,
> +static int selinux_mmap_file(struct file *file,
> +                            unsigned long reqprot __always_unused,
>                              unsigned long prot, unsigned long flags)
>  {
>         struct common_audit_data ad;
> @@ -3727,23 +3724,17 @@ static int selinux_mmap_file(struct file *file, unsigned long reqprot,
>                         return rc;
>         }
>
> -       if (checkreqprot_get())
> -               prot = reqprot;
> -
>         return file_map_prot_check(file, prot,
>                                    (flags & MAP_TYPE) == MAP_SHARED);
>  }
>
>  static int selinux_file_mprotect(struct vm_area_struct *vma,
> -                                unsigned long reqprot,
> +                                unsigned long reqprot __always_unused,
>                                  unsigned long prot)
>  {
>         const struct cred *cred = current_cred();
>         u32 sid = cred_sid(cred);
>
> -       if (checkreqprot_get())
> -               prot = reqprot;
> -
>         if (default_noexec &&
>             (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
>                 int rc = 0;
> @@ -7202,9 +7193,6 @@ static __init int selinux_init(void)
>
>         memset(&selinux_state, 0, sizeof(selinux_state));
>         enforcing_set(selinux_enforcing_boot);
> -       if (CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE)
> -               pr_err("SELinux: CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE is non-zero.  This is deprecated and will be rejected in a future kernel release.\n");
> -       checkreqprot_set(selinux_checkreqprot_boot);
>         selinux_avc_init();
>         mutex_init(&selinux_state.status_lock);
>         mutex_init(&selinux_state.policy_mutex);
> diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h
> index cb38d1894cfc..7e9511841134 100644
> --- a/security/selinux/include/security.h
> +++ b/security/selinux/include/security.h
> @@ -95,7 +95,6 @@ struct selinux_state {
>  #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
>         bool enforcing;
>  #endif
> -       bool checkreqprot;
>         bool initialized;
>         bool policycap[__POLICYDB_CAP_MAX];
>
> @@ -145,14 +144,16 @@ static inline void enforcing_set(bool value)
>
>  static inline bool checkreqprot_get(void)
>  {
> -       return READ_ONCE(selinux_state.checkreqprot);
> +       /* setting checkreqprot to a non-zero value is no longer supported */
> +       return 0;
>  }
>
>  static inline void checkreqprot_set(bool value)
>  {
> -       if (value)
> +       if (value) {
>                 pr_err("SELinux: https://github.com/SELinuxProject/selinux-kernel/wiki/DEPRECATE-checkreqprot\n");
> -       WRITE_ONCE(selinux_state.checkreqprot, value);
> +               pr_err("SELinux: setting checkreqprot to '1' is no longer supported\n");
> +       }
>  }
>
>  #ifdef CONFIG_SECURITY_SELINUX_DISABLE
> diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
> index 08164d074e56..68688bc84912 100644
> --- a/security/selinux/selinuxfs.c
> +++ b/security/selinux/selinuxfs.c
> @@ -728,23 +728,20 @@ static ssize_t sel_write_checkreqprot(struct file *file, const char __user *buf,
>         if (IS_ERR(page))
>                 return PTR_ERR(page);
>
> -       length = -EINVAL;
> -       if (sscanf(page, "%u", &new_value) != 1)
> +       if (sscanf(page, "%u", &new_value) != 1) {
> +               length = -EINVAL;
>                 goto out;
> +       }
> +       length = count;
>
>         if (new_value) {
>                 char comm[sizeof(current->comm)];
>
>                 memcpy(comm, current->comm, sizeof(comm));
> -               pr_err("SELinux: %s (%d) set checkreqprot to 1. This is deprecated and will be rejected in a future kernel release.\n",
> +               pr_err("SELinux: %s (%d) set checkreqprot to 1. This is no longer supported.\n",
>                        comm, current->pid);
>         }
>
> -       checkreqprot_set((new_value ? 1 : 0));
> -       if (new_value)
> -               ssleep(15);
> -       length = count;
> -
>         selinux_ima_measure_state();
>
>  out:
> --
> 2.40.0
>

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] selinux: remove the 'checkreqprot' functionality
  2023-03-16 18:25 ` [PATCH] selinux: remove the 'checkreqprot' functionality Stephen Smalley
@ 2023-03-16 20:21   ` Paul Moore
  0 siblings, 0 replies; 2+ messages in thread
From: Paul Moore @ 2023-03-16 20:21 UTC (permalink / raw)
  To: Stephen Smalley; +Cc: Mimi Zohar, selinux, linux-integrity

On Thu, Mar 16, 2023 at 2:25 PM Stephen Smalley
<stephen.smalley.work@gmail.com> wrote:
>
> On Thu, Mar 16, 2023 at 2:01 PM Paul Moore <paul@paul-moore.com> wrote:
> >
> > We originally promised that the SELinux 'checkreqprot' functionality
> > would be removed no sooner than June 2021, and now that it is March
> > 2023 it seems like it is a good time to do the final removal.  The
> > deprecation notice in the kernel provides plenty of detail on why
> > 'checkreqprot' is not desirable, with the key point repeated below:
> >
> >   This was a compatibility mechanism for legacy userspace and
> >   for the READ_IMPLIES_EXEC personality flag.  However, if set to
> >   1, it weakens security by allowing mappings to be made executable
> >   without authorization by policy.  The default value of checkreqprot
> >   at boot was changed starting in Linux v4.4 to 0 (i.e. check the
> >   actual protection), and Android and Linux distributions have been
> >   explicitly writing a "0" to /sys/fs/selinux/checkreqprot during
> >   initialization for some time.
> >
> > Along with the official deprecation notice, we have been discussing
> > this on-list and directly with several of the larger SELinux-based
> > distros and everyone is happy to see this feature finally removed.
> > In an attempt to catch all of the smaller, and DIY, Linux systems
> > we have been writing a deprecation notice URL into the kernel log,
> > along with a growing ssleep() penalty, when admins enabled
> > checkreqprot at runtime or via the kernel command line.  We have
> > yet to have anyone come to us and raise an objection to the
> > deprecation or planned removal.
> >
> > It is worth noting that while this patch removes the checkreqprot
> > functionality, it leaves the user visible interfaces (kernel command
> > line and selinuxfs file) intact, just inert.  This should help
> > prevent breakages with existing userspace tools that correctly, but
> > unnecessarily, disable checkreqprot at boot or runtime.  Admins
> > that attempt to enable checkreqprot will be met with a removal
> > message in the kernel log.
> >
> > Signed-off-by: Paul Moore <paul@paul-moore.com>
>
> Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>

Thanks Stephen.  Although I just noticed that we can drop the
checkreqprot_set() function entirely now, expect a v2 in just a moment
...

> I was wondering if we could remove the reqprot parameter altogether from the
> mmap/mprotect hooks but looks like IMA is using it.

Yep, there was even a recent bug fix about that too.

-- 
paul-moore.com

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-03-16 20:22 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20230316175749.233373-1-paul@paul-moore.com>
2023-03-16 18:25 ` [PATCH] selinux: remove the 'checkreqprot' functionality Stephen Smalley
2023-03-16 20:21   ` Paul Moore

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).