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:
Родитель
ae271c1b14
Коммит
385975dca5
|
@ -278,11 +278,11 @@ endchoice
|
||||||
|
|
||||||
config LSM
|
config LSM
|
||||||
string "Ordered list of enabled LSMs"
|
string "Ordered list of enabled LSMs"
|
||||||
default "lockdown,yama,loadpin,safesetid,integrity,smack,selinux,tomoyo,apparmor,bpf" if DEFAULT_SECURITY_SMACK
|
default "landlock,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 "landlock,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 "landlock,lockdown,yama,loadpin,safesetid,integrity,tomoyo,bpf" if DEFAULT_SECURITY_TOMOYO
|
||||||
default "lockdown,yama,loadpin,safesetid,integrity,bpf" if DEFAULT_SECURITY_DAC
|
default "landlock,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,selinux,smack,tomoyo,apparmor,bpf"
|
||||||
help
|
help
|
||||||
A comma-separated list of LSMs, in initialization order.
|
A comma-separated list of LSMs, in initialization order.
|
||||||
Any LSMs left off this list will be ignored. This can be
|
Any LSMs left off this list will be ignored. This can be
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
obj-$(CONFIG_SECURITY_LANDLOCK) := landlock.o
|
obj-$(CONFIG_SECURITY_LANDLOCK) := landlock.o
|
||||||
|
|
||||||
landlock-y := object.o ruleset.o
|
landlock-y := setup.o object.o ruleset.o \
|
||||||
|
cred.o
|
||||||
|
|
|
@ -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 */
|
|
@ -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);
|
||||||
|
}
|
|
@ -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 */
|
|
@ -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,
|
||||||
|
};
|
|
@ -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 */
|
Загрузка…
Ссылка в новой задаче