From c5503601e21d7eea67f07417a680237db238d50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 19 Apr 2022 11:56:23 +0200 Subject: [PATCH 1/2] shared/seccomp: add note about clone2() being unimportant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case anyone else starts wondering whether it should be listed as I did… --- src/shared/seccomp-util.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/shared/seccomp-util.c b/src/shared/seccomp-util.c index c465bf58dd..50ad6bc244 100644 --- a/src/shared/seccomp-util.c +++ b/src/shared/seccomp-util.c @@ -718,6 +718,9 @@ const SyscallFilterSet syscall_filter_sets[_SYSCALL_FILTER_SET_MAX] = { .value = "capget\0" /* Able to query arbitrary processes */ "clone\0" + /* ia64 as the only architecture has clone2, a replacement for clone, but ia64 doesn't + * implement seccomp, so we don't need to list it at all. C.f. + * acce2f71779c54086962fefce3833d886c655f62 in the kernel. */ "clone3\0" "execveat\0" "fork\0" From 30193fe817d262bd64b9a271534792046f19d7f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 19 Apr 2022 12:44:26 +0200 Subject: [PATCH 2/2] manager: prohibit clone3() in seccomp filters RestrictNamespaces should block clone3() like flatpak: https://github.com/flatpak/flatpak/commit/a10f52a7565c549612c92b8e736a6698a53db330 clone3() passes arguments in a structure referenced by a pointer, so we can't filter on the flags as with clone(). Let's disallow the whole function call. --- src/shared/seccomp-util.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/shared/seccomp-util.c b/src/shared/seccomp-util.c index 50ad6bc244..49044a45ae 100644 --- a/src/shared/seccomp-util.c +++ b/src/shared/seccomp-util.c @@ -1230,6 +1230,21 @@ int seccomp_restrict_namespaces(unsigned long retain) { if (r < 0) return r; + /* We cannot filter on individual flags to clone3(), and we need to disable the + * syscall altogether. ENOSYS is used instead of EPERM, so that glibc and other + * users shall fall back to clone(), as if on an older kernel. + * + * C.f. https://github.com/flatpak/flatpak/commit/a10f52a7565c549612c92b8e736a6698a53db330, + * https://github.com/moby/moby/issues/42680. */ + + r = seccomp_rule_add_exact( + seccomp, + SCMP_ACT_ERRNO(ENOSYS), + SCMP_SYS(clone3), + 0); + if (r < 0) + log_debug_errno(r, "Failed to add clone3() rule for architecture %s, ignoring: %m", seccomp_arch_to_string(arch)); + if ((retain & NAMESPACE_FLAGS_ALL) == 0) /* If every single kind of namespace shall be prohibited, then let's block the whole setns() syscall * altogether. */