lkml.org 
[lkml]   [2023]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RESEND RFC PATCH v2 04/14] lsm: Add security_dev_permission() hook
    Date
    Provide a new lsm hook which may be used to check permission on
    a device by its dev_t representation only. This could be used if
    an inode is not available and the security_inode_permission
    check is not applicable.

    A first lsm to use this will be the lately converted cgroup_device
    module, to allow permission checks inside driver implementations.

    Signed-off-by: Michael Weiß <michael.weiss@aisec.fraunhofer.de>
    ---
    include/linux/lsm_hook_defs.h | 1 +
    include/linux/security.h | 5 +++++
    security/security.c | 18 ++++++++++++++++++
    3 files changed, 24 insertions(+)

    diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h
    index ac962c4cb44b..a868982725a9 100644
    --- a/include/linux/lsm_hook_defs.h
    +++ b/include/linux/lsm_hook_defs.h
    @@ -275,6 +275,7 @@ LSM_HOOK(int, 0, inode_notifysecctx, struct inode *inode, void *ctx, u32 ctxlen)
    LSM_HOOK(int, 0, inode_setsecctx, struct dentry *dentry, void *ctx, u32 ctxlen)
    LSM_HOOK(int, 0, inode_getsecctx, struct inode *inode, void **ctx,
    u32 *ctxlen)
    +LSM_HOOK(int, 0, dev_permission, umode_t mode, dev_t dev, int mask)

    #if defined(CONFIG_SECURITY) && defined(CONFIG_WATCH_QUEUE)
    LSM_HOOK(int, 0, post_notification, const struct cred *w_cred,
    diff --git a/include/linux/security.h b/include/linux/security.h
    index 5f16eecde00b..8bc6ac8816c6 100644
    --- a/include/linux/security.h
    +++ b/include/linux/security.h
    @@ -484,6 +484,7 @@ int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen);
    int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen);
    int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen);
    int security_locked_down(enum lockdown_reason what);
    +int security_dev_permission(umode_t mode, dev_t dev, int mask);
    #else /* CONFIG_SECURITY */

    static inline int call_blocking_lsm_notifier(enum lsm_event event, void *data)
    @@ -1395,6 +1396,10 @@ static inline int security_locked_down(enum lockdown_reason what)
    {
    return 0;
    }
    +static inline int security_dev_permission(umode_t mode, dev_t dev, int mask)
    +{
    + return 0;
    +}
    #endif /* CONFIG_SECURITY */

    #if defined(CONFIG_SECURITY) && defined(CONFIG_WATCH_QUEUE)
    diff --git a/security/security.c b/security/security.c
    index 23b129d482a7..40f6787df3b1 100644
    --- a/security/security.c
    +++ b/security/security.c
    @@ -4016,6 +4016,24 @@ int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
    }
    EXPORT_SYMBOL(security_inode_getsecctx);

    +/**
    + * security_dev_permission() - Check if accessing a dev is allowed
    + * @mode: file mode holding device type
    + * @dev: device
    + * @mask: access mask
    + *
    + * Check permission before accessing an device by its major minor.
    + * This hook is called by drivers which may not have an inode but only
    + * the dev_t representation of a device to check permission.
    + *
    + * Return: Returns 0 if permission is granted.
    + */
    +int security_dev_permission(umode_t mode, dev_t dev, int mask)
    +{
    + return call_int_hook(dev_permission, 0, mode, dev, mask);
    +}
    +EXPORT_SYMBOL(security_dev_permission);
    +
    #ifdef CONFIG_WATCH_QUEUE
    /**
    * security_post_notification() - Check if a watch notification can be posted
    --
    2.30.2
    \
     
     \ /
      Last update: 2023-10-25 11:46    [W:3.418 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site