-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Mickaël Salaün
authored and
James Morris
committed
Apr 22, 2021
1 parent
ae271c1
commit 385975d
Showing
7 changed files
with
178 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 */ |