mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
lsm,selinux: Add LSM blob support for BPF objects
This patch introduces LSM blob support for BPF maps, programs, and tokens to enable LSM stacking and multiplexing of LSM modules that govern BPF objects. Additionally, the existing BPF hooks used by SELinux have been updated to utilize the new blob infrastructure, removing the assumption of exclusive ownership of the security pointer. Signed-off-by: Blaise Boscaccy <bboscaccy@linux.microsoft.com> [PM: dropped local variable init, style fixes] Signed-off-by: Paul Moore <paul@paul-moore.com>
This commit is contained in:
committed by
Paul Moore
parent
e5bc887413
commit
5816bf4273
@@ -7062,14 +7062,14 @@ static int bpf_fd_pass(const struct file *file, u32 sid)
|
||||
|
||||
if (file->f_op == &bpf_map_fops) {
|
||||
map = file->private_data;
|
||||
bpfsec = map->security;
|
||||
bpfsec = selinux_bpf_map_security(map);
|
||||
ret = avc_has_perm(sid, bpfsec->sid, SECCLASS_BPF,
|
||||
bpf_map_fmode_to_av(file->f_mode), NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else if (file->f_op == &bpf_prog_fops) {
|
||||
prog = file->private_data;
|
||||
bpfsec = prog->aux->security;
|
||||
bpfsec = selinux_bpf_prog_security(prog);
|
||||
ret = avc_has_perm(sid, bpfsec->sid, SECCLASS_BPF,
|
||||
BPF__PROG_RUN, NULL);
|
||||
if (ret)
|
||||
@@ -7083,7 +7083,7 @@ static int selinux_bpf_map(struct bpf_map *map, fmode_t fmode)
|
||||
u32 sid = current_sid();
|
||||
struct bpf_security_struct *bpfsec;
|
||||
|
||||
bpfsec = map->security;
|
||||
bpfsec = selinux_bpf_map_security(map);
|
||||
return avc_has_perm(sid, bpfsec->sid, SECCLASS_BPF,
|
||||
bpf_map_fmode_to_av(fmode), NULL);
|
||||
}
|
||||
@@ -7093,7 +7093,7 @@ static int selinux_bpf_prog(struct bpf_prog *prog)
|
||||
u32 sid = current_sid();
|
||||
struct bpf_security_struct *bpfsec;
|
||||
|
||||
bpfsec = prog->aux->security;
|
||||
bpfsec = selinux_bpf_prog_security(prog);
|
||||
return avc_has_perm(sid, bpfsec->sid, SECCLASS_BPF,
|
||||
BPF__PROG_RUN, NULL);
|
||||
}
|
||||
@@ -7103,69 +7103,33 @@ static int selinux_bpf_map_create(struct bpf_map *map, union bpf_attr *attr,
|
||||
{
|
||||
struct bpf_security_struct *bpfsec;
|
||||
|
||||
bpfsec = kzalloc(sizeof(*bpfsec), GFP_KERNEL);
|
||||
if (!bpfsec)
|
||||
return -ENOMEM;
|
||||
|
||||
bpfsec = selinux_bpf_map_security(map);
|
||||
bpfsec->sid = current_sid();
|
||||
map->security = bpfsec;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void selinux_bpf_map_free(struct bpf_map *map)
|
||||
{
|
||||
struct bpf_security_struct *bpfsec = map->security;
|
||||
|
||||
map->security = NULL;
|
||||
kfree(bpfsec);
|
||||
}
|
||||
|
||||
static int selinux_bpf_prog_load(struct bpf_prog *prog, union bpf_attr *attr,
|
||||
struct bpf_token *token, bool kernel)
|
||||
{
|
||||
struct bpf_security_struct *bpfsec;
|
||||
|
||||
bpfsec = kzalloc(sizeof(*bpfsec), GFP_KERNEL);
|
||||
if (!bpfsec)
|
||||
return -ENOMEM;
|
||||
|
||||
bpfsec = selinux_bpf_prog_security(prog);
|
||||
bpfsec->sid = current_sid();
|
||||
prog->aux->security = bpfsec;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void selinux_bpf_prog_free(struct bpf_prog *prog)
|
||||
{
|
||||
struct bpf_security_struct *bpfsec = prog->aux->security;
|
||||
|
||||
prog->aux->security = NULL;
|
||||
kfree(bpfsec);
|
||||
}
|
||||
|
||||
static int selinux_bpf_token_create(struct bpf_token *token, union bpf_attr *attr,
|
||||
const struct path *path)
|
||||
{
|
||||
struct bpf_security_struct *bpfsec;
|
||||
|
||||
bpfsec = kzalloc(sizeof(*bpfsec), GFP_KERNEL);
|
||||
if (!bpfsec)
|
||||
return -ENOMEM;
|
||||
|
||||
bpfsec = selinux_bpf_token_security(token);
|
||||
bpfsec->sid = current_sid();
|
||||
token->security = bpfsec;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void selinux_bpf_token_free(struct bpf_token *token)
|
||||
{
|
||||
struct bpf_security_struct *bpfsec = token->security;
|
||||
|
||||
token->security = NULL;
|
||||
kfree(bpfsec);
|
||||
}
|
||||
#endif
|
||||
|
||||
struct lsm_blob_sizes selinux_blob_sizes __ro_after_init = {
|
||||
@@ -7183,6 +7147,9 @@ struct lsm_blob_sizes selinux_blob_sizes __ro_after_init = {
|
||||
.lbs_xattr_count = SELINUX_INODE_INIT_XATTRS,
|
||||
.lbs_tun_dev = sizeof(struct tun_security_struct),
|
||||
.lbs_ib = sizeof(struct ib_security_struct),
|
||||
.lbs_bpf_map = sizeof(struct bpf_security_struct),
|
||||
.lbs_bpf_prog = sizeof(struct bpf_security_struct),
|
||||
.lbs_bpf_token = sizeof(struct bpf_security_struct),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PERF_EVENTS
|
||||
@@ -7536,9 +7503,6 @@ static struct security_hook_list selinux_hooks[] __ro_after_init = {
|
||||
LSM_HOOK_INIT(bpf, selinux_bpf),
|
||||
LSM_HOOK_INIT(bpf_map, selinux_bpf_map),
|
||||
LSM_HOOK_INIT(bpf_prog, selinux_bpf_prog),
|
||||
LSM_HOOK_INIT(bpf_map_free, selinux_bpf_map_free),
|
||||
LSM_HOOK_INIT(bpf_prog_free, selinux_bpf_prog_free),
|
||||
LSM_HOOK_INIT(bpf_token_free, selinux_bpf_token_free),
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PERF_EVENTS
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <linux/lsm_hooks.h>
|
||||
#include <linux/msg.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <linux/bpf.h>
|
||||
#include "flask.h"
|
||||
#include "avc.h"
|
||||
|
||||
@@ -245,4 +246,23 @@ selinux_perf_event(void *perf_event)
|
||||
return perf_event + selinux_blob_sizes.lbs_perf_event;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BPF_SYSCALL
|
||||
static inline struct bpf_security_struct *
|
||||
selinux_bpf_map_security(struct bpf_map *map)
|
||||
{
|
||||
return map->security + selinux_blob_sizes.lbs_bpf_map;
|
||||
}
|
||||
|
||||
static inline struct bpf_security_struct *
|
||||
selinux_bpf_prog_security(struct bpf_prog *prog)
|
||||
{
|
||||
return prog->aux->security + selinux_blob_sizes.lbs_bpf_prog;
|
||||
}
|
||||
|
||||
static inline struct bpf_security_struct *
|
||||
selinux_bpf_token_security(struct bpf_token *token)
|
||||
{
|
||||
return token->security + selinux_blob_sizes.lbs_bpf_token;
|
||||
}
|
||||
#endif /* CONFIG_BPF_SYSCALL */
|
||||
#endif /* _SELINUX_OBJSEC_H_ */
|
||||
|
||||
Reference in New Issue
Block a user