From: "Mickaël Salaün" <mic@digikod.net> To: Kees Cook <keescook@chromium.org> Cc: LKML <linux-kernel@vger.kernel.org>, Alexei Starovoitov <ast@kernel.org>, Andy Lutomirski <luto@amacapital.net>, Arnaldo Carvalho de Melo <acme@kernel.org>, Casey Schaufler <casey@schaufler-ca.com>, Daniel Borkmann <daniel@iogearbox.net>, David Drysdale <drysdale@google.com>, "David S . Miller" <davem@davemloft.net>, "Eric W . Biederman" <ebiederm@xmission.com>, James Morris <james.l.morris@oracle.com>, Jann Horn <jann@thejh.net>, Jonathan Corbet <corbet@lwn.net>, Matthew Garrett <mjg59@srcf.ucam.org>, Michael Kerrisk <mtk.manpages@gmail.com>, Paul Moore <paul@paul-moore.com>, Sargun Dhillon <sargun@sargun.me>, "Serge E . Hallyn" <serge@hallyn.com>, Shuah Khan <shuah@kernel.org>, Tejun Heo <tj@kernel.org>, Thomas Graf <tgraf@suug.ch>, Will Drewry <wad@chromium.org>, "kernel-hardening@lists.openwall.com" <kernel-hardening@lists.openwall.com>, Linux API <linux-api@vger.kernel.org>, linux-security-module <linux-security-module@vger.kernel.org>, Network Development <netdev@vger.kernel.org> Subject: Re: [PATCH net-next v6 04/11] landlock: Add LSM hooks related to filesystem Date: Wed, 19 Apr 2017 00:44:07 +0200 [thread overview] Message-ID: <9a69055a-b4cf-00b0-da5e-2e45ff88059c@digikod.net> (raw) In-Reply-To: <CAGXu5jJKNp8R5kZ1U=K7KwgnV=NvH5aoAbftA-05a_Sa4pOg1Q@mail.gmail.com> [-- Attachment #1.1: Type: text/plain, Size: 6054 bytes --] On 19/04/2017 00:17, Kees Cook wrote: > On Tue, Mar 28, 2017 at 4:46 PM, Mickaël Salaün <mic@digikod.net> wrote: >> Handle 33 filesystem-related LSM hooks for the Landlock filesystem >> event: LANDLOCK_SUBTYPE_EVENT_FS. >> >> A Landlock event wrap LSM hooks for similar kernel object types (e.g. >> struct file, struct path...). Multiple LSM hooks can trigger the same >> Landlock event. >> >> Landlock handle nine coarse-grained actions: read, write, execute, new, >> get, remove, ioctl, lock and fcntl. Each of them abstract LSM hook >> access control in a way that can be extended in the future. >> >> The Landlock LSM hook registration is done after other LSM to only run >> actions from user-space, via eBPF programs, if the access was granted by >> major (privileged) LSMs. >> >> Changes since v5: >> * split hooks.[ch] into hooks.[ch] and hooks_fs.[ch] >> * add more documentation >> * cosmetic fixes >> >> Changes since v4: >> * add LSM hook abstraction called Landlock event >> * use the compiler type checking to verify hooks use by an event >> * handle all filesystem related LSM hooks (e.g. file_permission, >> mmap_file, sb_mount...) >> * register BPF programs for Landlock just after LSM hooks registration >> * move hooks registration after other LSMs >> * add failsafes to check if a hook is not used by the kernel >> * allow partial raw value access form the context (needed for programs >> generated by LLVM) >> >> Changes since v3: >> * split commit >> * add hooks dealing with struct inode and struct path pointers: >> inode_permission and inode_getattr >> * add abstraction over eBPF helper arguments thanks to wrapping structs >> >> Signed-off-by: Mickaël Salaün <mic@digikod.net> >> Cc: Alexei Starovoitov <ast@kernel.org> >> Cc: Andy Lutomirski <luto@amacapital.net> >> Cc: Daniel Borkmann <daniel@iogearbox.net> >> Cc: David S. Miller <davem@davemloft.net> >> Cc: James Morris <james.l.morris@oracle.com> >> Cc: Kees Cook <keescook@chromium.org> >> Cc: Serge E. Hallyn <serge@hallyn.com> >> --- >> include/linux/lsm_hooks.h | 5 + >> security/landlock/Makefile | 4 +- >> security/landlock/hooks.c | 115 +++++++++ >> security/landlock/hooks.h | 177 ++++++++++++++ >> security/landlock/hooks_fs.c | 563 +++++++++++++++++++++++++++++++++++++++++++ >> security/landlock/hooks_fs.h | 19 ++ >> security/landlock/init.c | 13 + >> security/security.c | 7 +- >> 8 files changed, 901 insertions(+), 2 deletions(-) >> create mode 100644 security/landlock/hooks.c >> create mode 100644 security/landlock/hooks.h >> create mode 100644 security/landlock/hooks_fs.c >> create mode 100644 security/landlock/hooks_fs.h >> >> diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h >> index e29d4c62a3c8..884289166a0e 100644 >> --- a/include/linux/lsm_hooks.h >> +++ b/include/linux/lsm_hooks.h >> @@ -1920,5 +1920,10 @@ void __init loadpin_add_hooks(void); >> #else >> static inline void loadpin_add_hooks(void) { }; >> #endif >> +#ifdef CONFIG_SECURITY_LANDLOCK >> +extern void __init landlock_add_hooks(void); >> +#else >> +static inline void __init landlock_add_hooks(void) { } >> +#endif /* CONFIG_SECURITY_LANDLOCK */ >> >> #endif /* ! __LINUX_LSM_HOOKS_H */ >> diff --git a/security/landlock/Makefile b/security/landlock/Makefile >> index 7205f9a7a2ee..c0db504a6335 100644 >> --- a/security/landlock/Makefile >> +++ b/security/landlock/Makefile >> @@ -1,3 +1,5 @@ >> +ccflags-$(CONFIG_SECURITY_LANDLOCK) += -Werror=unused-function > > Why is this needed? If it can't be avoided, a comment should exist > here explaining why. This is useful to catch defined but unused hooks: error out if a HOOK_NEW_FS(foo) is not used with a HOOK_INIT_FS(foo) in the struct security_hook_list landlock_hooks. > >> [...] >> @@ -127,3 +132,11 @@ static struct bpf_prog_type_list bpf_landlock_type __ro_after_init = { >> .ops = &bpf_landlock_ops, >> .type = BPF_PROG_TYPE_LANDLOCK, >> }; >> + >> +void __init landlock_add_hooks(void) >> +{ >> + pr_info("landlock: Version %u", LANDLOCK_VERSION); >> + landlock_add_hooks_fs(); >> + security_add_hooks(NULL, 0, "landlock"); >> + bpf_register_prog_type(&bpf_landlock_type); > > I'm confused by the separation of hook registration here. The call to > security_add_hooks is with count=0 is especially weird. Why isn't this > just a single call with security_add_hooks(landlock_hooks, > ARRAY_SIZE(landlock_hooks), "landlock")? Yes, this is ugly with the new security_add_hooks() with three arguments but I wanted to split the hooks definition in multiple files. The current security_add_hooks() use lsm_append(lsm, &lsm_names) which is not exported. Unfortunately, calling multiple security_add_hooks() with the same LSM name would register multiple names for the same LSM… Is it OK if I modify this function to not add duplicated entries? > >> +} >> diff --git a/security/security.c b/security/security.c >> index d0e07f269b2d..a3e9f4625991 100644 >> --- a/security/security.c >> +++ b/security/security.c >> @@ -64,10 +64,15 @@ int __init security_init(void) >> loadpin_add_hooks(); >> >> /* >> - * Load all the remaining security modules. >> + * Load all remaining privileged security modules. >> */ >> do_security_initcalls(); >> >> + /* >> + * Load potentially-unprivileged security modules at the end. >> + */ >> + landlock_add_hooks(); > > Oh, is this to make it last in the list? Is there a reason it has to be last? Right, this is the intend. I'm not sure it is the only way to register hooks, though. For an unprivileged access-control, we don't want to give the ability to any process to do some checks, through an eBPF program, on kernel objects (e.g. files) if they should not be accessible (because of a following LSM hook check). Mickaël [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2017-04-18 22:46 UTC|newest] Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-03-28 23:46 [PATCH net-next v6 00/11] Landlock LSM: Toward unprivileged sandboxing Mickaël Salaün 2017-03-28 23:46 ` [PATCH net-next v6 01/11] bpf: Add eBPF program subtype and is_valid_subtype() verifier Mickaël Salaün 2017-03-29 13:48 ` kbuild test robot 2017-04-18 21:48 ` Kees Cook 2017-03-28 23:46 ` [PATCH net-next v6 02/11] bpf,landlock: Define an eBPF program type for Landlock Mickaël Salaün 2017-04-16 21:57 ` Mickaël Salaün 2017-04-18 21:58 ` Kees Cook 2017-03-28 23:46 ` [PATCH net-next v6 03/11] bpf: Define handle_fs and add a new helper bpf_handle_fs_get_mode() Mickaël Salaün 2017-03-28 23:46 ` [PATCH net-next v6 04/11] landlock: Add LSM hooks related to filesystem Mickaël Salaün 2017-03-29 15:18 ` kbuild test robot 2017-04-18 22:17 ` Kees Cook 2017-04-18 22:44 ` Mickaël Salaün [this message] 2017-04-18 23:16 ` Casey Schaufler 2017-04-18 23:40 ` Kees Cook 2017-04-19 22:03 ` Mickaël Salaün 2017-04-19 23:58 ` [kernel-hardening] " Casey Schaufler 2017-04-20 1:48 ` Kees Cook 2017-04-18 23:39 ` Kees Cook 2017-03-28 23:46 ` [PATCH net-next v6 05/11] seccomp: Split put_seccomp_filter() with put_seccomp() Mickaël Salaün 2017-04-18 22:23 ` Kees Cook 2017-04-18 22:47 ` Mickaël Salaün 2017-04-19 22:18 ` Mickaël Salaün 2017-04-20 1:54 ` Kees Cook 2017-03-28 23:46 ` [PATCH net-next v6 06/11] seccomp,landlock: Handle Landlock events per process hierarchy Mickaël Salaün 2017-03-29 10:35 ` [kernel-hardening] " Djalal Harouni 2017-03-31 21:15 ` Mickaël Salaün 2017-04-18 22:54 ` Kees Cook 2017-04-18 22:53 ` Kees Cook 2017-04-18 23:24 ` Mickaël Salaün 2017-04-18 23:48 ` Kees Cook 2017-03-28 23:46 ` [PATCH net-next v6 07/11] landlock: Add ptrace restrictions Mickaël Salaün 2017-04-10 6:48 ` [kernel-hardening] " Djalal Harouni 2017-04-11 7:19 ` Mickaël Salaün 2017-03-28 23:46 ` [PATCH net-next v6 08/11] bpf: Add a Landlock sandbox example Mickaël Salaün 2017-04-18 23:06 ` Kees Cook 2017-04-18 23:35 ` Mickaël Salaün 2017-03-28 23:46 ` [PATCH net-next v6 09/11] seccomp: Enhance test_harness with an assert step mechanism Mickaël Salaün 2017-04-19 0:02 ` Kees Cook 2017-04-19 21:51 ` Mickaël Salaün 2017-04-19 22:02 ` Kees Cook 2017-04-19 22:05 ` Mickaël Salaün 2017-04-20 1:50 ` Kees Cook 2017-03-28 23:46 ` [PATCH net-next v6 10/11] bpf,landlock: Add tests for Landlock Mickaël Salaün 2017-04-18 23:16 ` Kees Cook 2017-04-18 23:53 ` Mickaël Salaün 2017-04-18 23:59 ` Kees Cook 2017-03-28 23:46 ` [PATCH net-next v6 11/11] landlock: Add user and kernel documentation " Mickaël Salaün 2017-03-29 15:58 ` kbuild test robot 2017-04-18 23:26 ` [PATCH net-next v6 00/11] Landlock LSM: Toward unprivileged sandboxing Kees Cook 2017-04-19 0:12 ` Mickaël Salaün
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=9a69055a-b4cf-00b0-da5e-2e45ff88059c@digikod.net \ --to=mic@digikod.net \ --cc=acme@kernel.org \ --cc=ast@kernel.org \ --cc=casey@schaufler-ca.com \ --cc=corbet@lwn.net \ --cc=daniel@iogearbox.net \ --cc=davem@davemloft.net \ --cc=drysdale@google.com \ --cc=ebiederm@xmission.com \ --cc=james.l.morris@oracle.com \ --cc=jann@thejh.net \ --cc=keescook@chromium.org \ --cc=kernel-hardening@lists.openwall.com \ --cc=linux-api@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-security-module@vger.kernel.org \ --cc=luto@amacapital.net \ --cc=mjg59@srcf.ucam.org \ --cc=mtk.manpages@gmail.com \ --cc=netdev@vger.kernel.org \ --cc=paul@paul-moore.com \ --cc=sargun@sargun.me \ --cc=serge@hallyn.com \ --cc=shuah@kernel.org \ --cc=tgraf@suug.ch \ --cc=tj@kernel.org \ --cc=wad@chromium.org \ --subject='Re: [PATCH net-next v6 04/11] landlock: Add LSM hooks related to filesystem' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).