mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 04:34:08 +08:00
landlock: Set up the security framework and manage credentials
Process's credentials point to a Landlock domain, which is underneath implemented with a ruleset. In the following commits, this domain is used to check and enforce the ptrace and filesystem security policies. A domain is inherited from a parent to its child the same way a thread inherits a seccomp policy. Cc: James Morris <jmorris@namei.org> Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com> Reviewed-by: Jann Horn <jannh@google.com> Acked-by: Serge Hallyn <serge@hallyn.com> Reviewed-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20210422154123.13086-4-mic@digikod.net Signed-off-by: James Morris <jamorris@linux.microsoft.com>
This commit is contained in:
parent
ae271c1b14
commit
385975dca5
@ -278,11 +278,11 @@ endchoice
|
||||
|
||||
config LSM
|
||||
string "Ordered list of enabled LSMs"
|
||||
default "lockdown,yama,loadpin,safesetid,integrity,smack,selinux,tomoyo,apparmor,bpf" if DEFAULT_SECURITY_SMACK
|
||||
default "lockdown,yama,loadpin,safesetid,integrity,apparmor,selinux,smack,tomoyo,bpf" if DEFAULT_SECURITY_APPARMOR
|
||||
default "lockdown,yama,loadpin,safesetid,integrity,tomoyo,bpf" if DEFAULT_SECURITY_TOMOYO
|
||||
default "lockdown,yama,loadpin,safesetid,integrity,bpf" if DEFAULT_SECURITY_DAC
|
||||
default "lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf"
|
||||
default "landlock,lockdown,yama,loadpin,safesetid,integrity,smack,selinux,tomoyo,apparmor,bpf" if DEFAULT_SECURITY_SMACK
|
||||
default "landlock,lockdown,yama,loadpin,safesetid,integrity,apparmor,selinux,smack,tomoyo,bpf" if DEFAULT_SECURITY_APPARMOR
|
||||
default "landlock,lockdown,yama,loadpin,safesetid,integrity,tomoyo,bpf" if DEFAULT_SECURITY_TOMOYO
|
||||
default "landlock,lockdown,yama,loadpin,safesetid,integrity,bpf" if DEFAULT_SECURITY_DAC
|
||||
default "landlock,lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf"
|
||||
help
|
||||
A comma-separated list of LSMs, in initialization order.
|
||||
Any LSMs left off this list will be ignored. This can be
|
||||
|
@ -1,3 +1,4 @@
|
||||
obj-$(CONFIG_SECURITY_LANDLOCK) := landlock.o
|
||||
|
||||
landlock-y := object.o ruleset.o
|
||||
landlock-y := setup.o object.o ruleset.o \
|
||||
cred.o
|
||||
|
20
security/landlock/common.h
Normal file
20
security/landlock/common.h
Normal file
@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Landlock LSM - Common constants and helpers
|
||||
*
|
||||
* Copyright © 2016-2020 Mickaël Salaün <mic@digikod.net>
|
||||
* Copyright © 2018-2020 ANSSI
|
||||
*/
|
||||
|
||||
#ifndef _SECURITY_LANDLOCK_COMMON_H
|
||||
#define _SECURITY_LANDLOCK_COMMON_H
|
||||
|
||||
#define LANDLOCK_NAME "landlock"
|
||||
|
||||
#ifdef pr_fmt
|
||||
#undef pr_fmt
|
||||
#endif
|
||||
|
||||
#define pr_fmt(fmt) LANDLOCK_NAME ": " fmt
|
||||
|
||||
#endif /* _SECURITY_LANDLOCK_COMMON_H */
|
46
security/landlock/cred.c
Normal file
46
security/landlock/cred.c
Normal file
@ -0,0 +1,46 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Landlock LSM - Credential hooks
|
||||
*
|
||||
* Copyright © 2017-2020 Mickaël Salaün <mic@digikod.net>
|
||||
* Copyright © 2018-2020 ANSSI
|
||||
*/
|
||||
|
||||
#include <linux/cred.h>
|
||||
#include <linux/lsm_hooks.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "cred.h"
|
||||
#include "ruleset.h"
|
||||
#include "setup.h"
|
||||
|
||||
static int hook_cred_prepare(struct cred *const new,
|
||||
const struct cred *const old, const gfp_t gfp)
|
||||
{
|
||||
struct landlock_ruleset *const old_dom = landlock_cred(old)->domain;
|
||||
|
||||
if (old_dom) {
|
||||
landlock_get_ruleset(old_dom);
|
||||
landlock_cred(new)->domain = old_dom;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hook_cred_free(struct cred *const cred)
|
||||
{
|
||||
struct landlock_ruleset *const dom = landlock_cred(cred)->domain;
|
||||
|
||||
if (dom)
|
||||
landlock_put_ruleset_deferred(dom);
|
||||
}
|
||||
|
||||
static struct security_hook_list landlock_hooks[] __lsm_ro_after_init = {
|
||||
LSM_HOOK_INIT(cred_prepare, hook_cred_prepare),
|
||||
LSM_HOOK_INIT(cred_free, hook_cred_free),
|
||||
};
|
||||
|
||||
__init void landlock_add_cred_hooks(void)
|
||||
{
|
||||
security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks),
|
||||
LANDLOCK_NAME);
|
||||
}
|
58
security/landlock/cred.h
Normal file
58
security/landlock/cred.h
Normal file
@ -0,0 +1,58 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Landlock LSM - Credential hooks
|
||||
*
|
||||
* Copyright © 2019-2020 Mickaël Salaün <mic@digikod.net>
|
||||
* Copyright © 2019-2020 ANSSI
|
||||
*/
|
||||
|
||||
#ifndef _SECURITY_LANDLOCK_CRED_H
|
||||
#define _SECURITY_LANDLOCK_CRED_H
|
||||
|
||||
#include <linux/cred.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/rcupdate.h>
|
||||
|
||||
#include "ruleset.h"
|
||||
#include "setup.h"
|
||||
|
||||
struct landlock_cred_security {
|
||||
struct landlock_ruleset *domain;
|
||||
};
|
||||
|
||||
static inline struct landlock_cred_security *landlock_cred(
|
||||
const struct cred *cred)
|
||||
{
|
||||
return cred->security + landlock_blob_sizes.lbs_cred;
|
||||
}
|
||||
|
||||
static inline const struct landlock_ruleset *landlock_get_current_domain(void)
|
||||
{
|
||||
return landlock_cred(current_cred())->domain;
|
||||
}
|
||||
|
||||
/*
|
||||
* The call needs to come from an RCU read-side critical section.
|
||||
*/
|
||||
static inline const struct landlock_ruleset *landlock_get_task_domain(
|
||||
const struct task_struct *const task)
|
||||
{
|
||||
return landlock_cred(__task_cred(task))->domain;
|
||||
}
|
||||
|
||||
static inline bool landlocked(const struct task_struct *const task)
|
||||
{
|
||||
bool has_dom;
|
||||
|
||||
if (task == current)
|
||||
return !!landlock_get_current_domain();
|
||||
|
||||
rcu_read_lock();
|
||||
has_dom = !!landlock_get_task_domain(task);
|
||||
rcu_read_unlock();
|
||||
return has_dom;
|
||||
}
|
||||
|
||||
__init void landlock_add_cred_hooks(void);
|
||||
|
||||
#endif /* _SECURITY_LANDLOCK_CRED_H */
|
31
security/landlock/setup.c
Normal file
31
security/landlock/setup.c
Normal file
@ -0,0 +1,31 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Landlock LSM - Security framework setup
|
||||
*
|
||||
* Copyright © 2016-2020 Mickaël Salaün <mic@digikod.net>
|
||||
* Copyright © 2018-2020 ANSSI
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/lsm_hooks.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "cred.h"
|
||||
#include "setup.h"
|
||||
|
||||
struct lsm_blob_sizes landlock_blob_sizes __lsm_ro_after_init = {
|
||||
.lbs_cred = sizeof(struct landlock_cred_security),
|
||||
};
|
||||
|
||||
static int __init landlock_init(void)
|
||||
{
|
||||
landlock_add_cred_hooks();
|
||||
pr_info("Up and running.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_LSM(LANDLOCK_NAME) = {
|
||||
.name = LANDLOCK_NAME,
|
||||
.init = landlock_init,
|
||||
.blobs = &landlock_blob_sizes,
|
||||
};
|
16
security/landlock/setup.h
Normal file
16
security/landlock/setup.h
Normal file
@ -0,0 +1,16 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Landlock LSM - Security framework setup
|
||||
*
|
||||
* Copyright © 2016-2020 Mickaël Salaün <mic@digikod.net>
|
||||
* Copyright © 2018-2020 ANSSI
|
||||
*/
|
||||
|
||||
#ifndef _SECURITY_LANDLOCK_SETUP_H
|
||||
#define _SECURITY_LANDLOCK_SETUP_H
|
||||
|
||||
#include <linux/lsm_hooks.h>
|
||||
|
||||
extern struct lsm_blob_sizes landlock_blob_sizes;
|
||||
|
||||
#endif /* _SECURITY_LANDLOCK_SETUP_H */
|
Loading…
Reference in New Issue
Block a user