On Thu, Sep 19, 2024 at 08:11:12PM +0000, Simon J. Gerraty wrote:
> The branch main has been updated by sjg:
> 
> URL: 
> https://cgit.FreeBSD.org/src/commit/?id=4a5fa1086184f7450f63d4a8e403b16f40a78fce
> 
> commit 4a5fa1086184f7450f63d4a8e403b16f40a78fce
> Author:     Simon J. Gerraty <s...@freebsd.org>
> AuthorDate: 2024-09-19 20:10:27 +0000
> Commit:     Simon J. Gerraty <s...@freebsd.org>
> CommitDate: 2024-09-19 20:10:27 +0000
> 
>     procfs require PRIV_PROC_MEM_WRITE to write mem
>     
>     Add a priv_check for PRIV_PROC_MEM_WRITE which will be blocked
>     by mac_veriexec if being enforced, unless the process has a maclabel
>     to grant priv.
>     
>     Reviewed by:    stevek
>     Sponsored by:   Juniper Networks, Inc.
>     Differential Revision:  https://reviews.freebsd.org/D46692
> ---
>  sys/fs/procfs/procfs_mem.c                       | 3 +++
>  sys/kern/kern_priv.c                             | 4 +++-
>  sys/security/mac_grantbylabel/mac_grantbylabel.c | 2 ++
>  sys/security/mac_veriexec/mac_veriexec.c         | 1 +
>  sys/sys/priv.h                                   | 1 +
>  5 files changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/sys/fs/procfs/procfs_mem.c b/sys/fs/procfs/procfs_mem.c
> index 6ef725ee0ee7..159b40785172 100644
> --- a/sys/fs/procfs/procfs_mem.c
> +++ b/sys/fs/procfs/procfs_mem.c
> @@ -41,6 +41,7 @@
>  #include <sys/ptrace.h>
>  #include <sys/systm.h>
>  #include <sys/uio.h>
> +#include <sys/priv.h>
>  
>  #include <fs/pseudofs/pseudofs.h>
>  #include <fs/procfs/procfs.h>
> @@ -61,6 +62,8 @@ procfs_doprocmem(PFS_FILL_ARGS)
>  
>       PROC_LOCK(p);
>       error = p_candebug(td, p);
> +     if (error == 0 && uio->uio_rw == UIO_WRITE)
> +             error = priv_check(td, PRIV_PROC_MEM_WRITE);

Why is this check here and not in proc_rwmem()?  procfs isn't the only
interface to this kind of functionality, and it isn't even the main one.

>       PROC_UNLOCK(p);
>       if (error == 0)
>               error = proc_rwmem(p, uio);
> diff --git a/sys/kern/kern_priv.c b/sys/kern/kern_priv.c
> index c146f9e6f8d5..83fd246eef9b 100644
> --- a/sys/kern/kern_priv.c
> +++ b/sys/kern/kern_priv.c
> @@ -242,7 +242,9 @@ priv_check_cred(struct ucred *cred, int priv)
>        * but non-root users are expected to be able to read it (provided they
>        * have permission to access /dev/[k]mem).
>        */
> -     if (priv == PRIV_KMEM_READ) {
> +     switch (priv) {
> +     case PRIV_KMEM_READ:
> +     case PRIV_PROC_MEM_WRITE:       /* we already checked candebug */
>               error = 0;
>               goto out;
>       }
> diff --git a/sys/security/mac_grantbylabel/mac_grantbylabel.c 
> b/sys/security/mac_grantbylabel/mac_grantbylabel.c
> index 848131e54590..4d14577820eb 100644
> --- a/sys/security/mac_grantbylabel/mac_grantbylabel.c
> +++ b/sys/security/mac_grantbylabel/mac_grantbylabel.c
> @@ -218,6 +218,7 @@ mac_grantbylabel_priv_grant(struct ucred *cred, int priv)
>               return rc;              /* not interested */
>  
>       switch (priv) {
> +     case PRIV_PROC_MEM_WRITE:
>       case PRIV_KMEM_READ:
>       case PRIV_KMEM_WRITE:
>               break;
> @@ -244,6 +245,7 @@ mac_grantbylabel_priv_grant(struct ucred *cred, int priv)
>               if (label & GBL_IPC)
>                       rc = 0;
>               break;
> +     case PRIV_PROC_MEM_WRITE:
>       case PRIV_KMEM_READ:
>       case PRIV_KMEM_WRITE:
>               if (label & GBL_KMEM)
> diff --git a/sys/security/mac_veriexec/mac_veriexec.c 
> b/sys/security/mac_veriexec/mac_veriexec.c
> index 7ac09e2acf0f..490601863197 100644
> --- a/sys/security/mac_veriexec/mac_veriexec.c
> +++ b/sys/security/mac_veriexec/mac_veriexec.c
> @@ -435,6 +435,7 @@ mac_veriexec_priv_check(struct ucred *cred, int priv)
>       error = 0;
>       switch (priv) {
>       case PRIV_KMEM_WRITE:
> +     case PRIV_PROC_MEM_WRITE:
>       case PRIV_VERIEXEC_CONTROL:
>               /*
>                * Do not allow writing to memory or manipulating veriexec,
> diff --git a/sys/sys/priv.h b/sys/sys/priv.h
> index a61de8d32fe0..7a5773da220f 100644
> --- a/sys/sys/priv.h
> +++ b/sys/sys/priv.h
> @@ -513,6 +513,7 @@
>   */
>  #define      PRIV_KMEM_READ          680     /* Open mem/kmem for reading. */
>  #define      PRIV_KMEM_WRITE         681     /* Open mem/kmem for writing. */
> +#define      PRIV_PROC_MEM_WRITE     682     /* Open /proc/<pid>/mem for 
> writing. */
>  
>  /*
>   * Kernel debugger privileges.

Reply via email to