lsm/stable-6.0 PR 20220829
-----BEGIN PGP SIGNATURE----- iQJIBAABCAAyFiEES0KozwfymdVUl37v6iDy2pc3iXMFAmMNEC8UHHBhdWxAcGF1 bC1tb29yZS5jb20ACgkQ6iDy2pc3iXN6uA//Wvoj5l33ngi5p6CNAfxrZiOeeki7 ylMO9NF4BZY+BOKtWDcrUvpZoLCEEEtLihQ8vz7Iyedtpd34KBzI+H+36JDC9jei dWZiXYzzmaN6JVQ2pIGWr9kTfRPbbE4X91bI2jhDOBv64zCqZu2qDoXshud5WHU1 XhMMtAsQHKrdZa29y6nj6xHYuVA/fkpL5rg5LDrFDYwS7fV+g02ATmRnEsGefRNu JbjrapAnl6lWO6peRuyLNzf6NNgLLsXAmYOdyJGERKx23TSwqVMGhK6eODYBttiH E9OfFDz3oqbLfVrL6uBlr30T1lnns+WyRWdRvAP36L9wbQ/0o24mGsf5E20wo1T9 rwPNsFelI66Eu2S1v/DQWtGtzeaed5IrWMtQc93x4I1PQIxwMSP4znWEKg/2zDNQ tBVVjs6bIzWHbeYozmKK9xvtqL08F5H6t+cS7BDVWPfb8nAfiXvyrwgCRY36xHfO LJWb125lbDflkPRiIgf81IAE6SZLH/PFLowNXZUSAo0CTALhlGZXmhNr6Oz7Xr2A NIwKvuFNqGav0Rcsk+Qy0ir6jRKOj9854U4y3kAVOAhPSyBVZAoN1Y3wtiOpmdI0 taLNKv9W46ZxQtqQNOm31/py3N4bZl0y2JvS4lvwbDMqCjCqVE7236GjQ0vtYQQi 8thpb268VJTby8Y= =/7Pp -----END PGP SIGNATURE----- Merge tag 'lsm-pr-20220829' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm Pull LSM support for IORING_OP_URING_CMD from Paul Moore: "Add SELinux and Smack controls to the io_uring IORING_OP_URING_CMD. These are necessary as without them the IORING_OP_URING_CMD remains outside the purview of the LSMs (Luis' LSM patch, Casey's Smack patch, and my SELinux patch). They have been discussed at length with the io_uring folks, and Jens has given his thumbs-up on the relevant patches (see the commit descriptions). There is one patch that is not strictly necessary, but it makes testing much easier and is very trivial: the /dev/null IORING_OP_URING_CMD patch." * tag 'lsm-pr-20220829' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm: Smack: Provide read control for io_uring_cmd /dev/null: add IORING_OP_URING_CMD support selinux: implement the security_uring_cmd() LSM hook lsm,io_uring: add LSM hooks for the new uring_cmd file op
This commit is contained in:
commit
9c9d1896fa
9 changed files with 81 additions and 1 deletions
|
|
@ -2660,4 +2660,8 @@ int security_uring_sqpoll(void)
|
|||
{
|
||||
return call_int_hook(uring_sqpoll, 0);
|
||||
}
|
||||
int security_uring_cmd(struct io_uring_cmd *ioucmd)
|
||||
{
|
||||
return call_int_hook(uring_cmd, 0, ioucmd);
|
||||
}
|
||||
#endif /* CONFIG_IO_URING */
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@
|
|||
#include <uapi/linux/mount.h>
|
||||
#include <linux/fsnotify.h>
|
||||
#include <linux/fanotify.h>
|
||||
#include <linux/io_uring.h>
|
||||
|
||||
#include "avc.h"
|
||||
#include "objsec.h"
|
||||
|
|
@ -6987,6 +6988,28 @@ static int selinux_uring_sqpoll(void)
|
|||
return avc_has_perm(&selinux_state, sid, sid,
|
||||
SECCLASS_IO_URING, IO_URING__SQPOLL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* selinux_uring_cmd - check if IORING_OP_URING_CMD is allowed
|
||||
* @ioucmd: the io_uring command structure
|
||||
*
|
||||
* Check to see if the current domain is allowed to execute an
|
||||
* IORING_OP_URING_CMD against the device/file specified in @ioucmd.
|
||||
*
|
||||
*/
|
||||
static int selinux_uring_cmd(struct io_uring_cmd *ioucmd)
|
||||
{
|
||||
struct file *file = ioucmd->file;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct inode_security_struct *isec = selinux_inode(inode);
|
||||
struct common_audit_data ad;
|
||||
|
||||
ad.type = LSM_AUDIT_DATA_FILE;
|
||||
ad.u.file = file;
|
||||
|
||||
return avc_has_perm(&selinux_state, current_sid(), isec->sid,
|
||||
SECCLASS_IO_URING, IO_URING__CMD, &ad);
|
||||
}
|
||||
#endif /* CONFIG_IO_URING */
|
||||
|
||||
/*
|
||||
|
|
@ -7231,6 +7254,7 @@ static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = {
|
|||
#ifdef CONFIG_IO_URING
|
||||
LSM_HOOK_INIT(uring_override_creds, selinux_uring_override_creds),
|
||||
LSM_HOOK_INIT(uring_sqpoll, selinux_uring_sqpoll),
|
||||
LSM_HOOK_INIT(uring_cmd, selinux_uring_cmd),
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ const struct security_class_mapping secclass_map[] = {
|
|||
{ "anon_inode",
|
||||
{ COMMON_FILE_PERMS, NULL } },
|
||||
{ "io_uring",
|
||||
{ "override_creds", "sqpoll", NULL } },
|
||||
{ "override_creds", "sqpoll", "cmd", NULL } },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
#include <linux/fs_context.h>
|
||||
#include <linux/fs_parser.h>
|
||||
#include <linux/watch_queue.h>
|
||||
#include <linux/io_uring.h>
|
||||
#include "smack.h"
|
||||
|
||||
#define TRANS_TRUE "TRUE"
|
||||
|
|
@ -4732,6 +4733,36 @@ static int smack_uring_sqpoll(void)
|
|||
return -EPERM;
|
||||
}
|
||||
|
||||
/**
|
||||
* smack_uring_cmd - check on file operations for io_uring
|
||||
* @ioucmd: the command in question
|
||||
*
|
||||
* Make a best guess about whether a io_uring "command" should
|
||||
* be allowed. Use the same logic used for determining if the
|
||||
* file could be opened for read in the absence of better criteria.
|
||||
*/
|
||||
static int smack_uring_cmd(struct io_uring_cmd *ioucmd)
|
||||
{
|
||||
struct file *file = ioucmd->file;
|
||||
struct smk_audit_info ad;
|
||||
struct task_smack *tsp;
|
||||
struct inode *inode;
|
||||
int rc;
|
||||
|
||||
if (!file)
|
||||
return -EINVAL;
|
||||
|
||||
tsp = smack_cred(file->f_cred);
|
||||
inode = file_inode(file);
|
||||
|
||||
smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH);
|
||||
smk_ad_setfield_u_fs_path(&ad, file->f_path);
|
||||
rc = smk_tskacc(tsp, smk_of_inode(inode), MAY_READ, &ad);
|
||||
rc = smk_bu_credfile(file->f_cred, file, MAY_READ, rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_IO_URING */
|
||||
|
||||
struct lsm_blob_sizes smack_blob_sizes __lsm_ro_after_init = {
|
||||
|
|
@ -4889,6 +4920,7 @@ static struct security_hook_list smack_hooks[] __lsm_ro_after_init = {
|
|||
#ifdef CONFIG_IO_URING
|
||||
LSM_HOOK_INIT(uring_override_creds, smack_uring_override_creds),
|
||||
LSM_HOOK_INIT(uring_sqpoll, smack_uring_sqpoll),
|
||||
LSM_HOOK_INIT(uring_cmd, smack_uring_cmd),
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue