aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authoralois31 <alois1@gmx-topmail.de>2024-05-25 04:21:53 +0000
committerGerrit Code Review <gerrit@lix-systems>2024-05-25 04:21:53 +0000
commitddfe379a6b93c678a9a0845e5c5a85f7e77b1b7d (patch)
treebc99ab3f691eeef509943bdcc83feae60bc39d0e /src/libstore
parent5b4b216facfb8af2f08c25a4b50fba1e197ca06e (diff)
parentf047e4357b4f7ad66c2e476506bf35cab82e441e (diff)
Merge "libstore/build: always enable seccomp filtering and no-new-privileges" into main
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/build/local-derivation-goal.cc18
-rw-r--r--src/libstore/globals.hh23
-rw-r--r--src/libstore/linux/fchmodat2-compat.hh28
-rw-r--r--src/libstore/meson.build1
4 files changed, 21 insertions, 49 deletions
diff --git a/src/libstore/build/local-derivation-goal.cc b/src/libstore/build/local-derivation-goal.cc
index 5c36a3ac2..2a64d7b5c 100644
--- a/src/libstore/build/local-derivation-goal.cc
+++ b/src/libstore/build/local-derivation-goal.cc
@@ -34,7 +34,6 @@
/* Includes required for chroot support. */
#if __linux__
#include <sys/ioctl.h>
-#include "linux/fchmodat2-compat.hh"
#include <net/if.h>
#include <netinet/ip.h>
#include <sys/mman.h>
@@ -44,6 +43,7 @@
#include <sys/prctl.h>
#include <sys/syscall.h>
#if HAVE_SECCOMP
+#include "linux/fchmodat2-compat.hh"
#include <seccomp.h>
#endif
#define pivot_root(new_root, put_old) (syscall(SYS_pivot_root, new_root, put_old))
@@ -1612,7 +1612,6 @@ void LocalDerivationGoal::chownToBuilder(const Path & path)
void setupSeccomp()
{
#if __linux__
- if (!settings.filterSyscalls) return;
#if HAVE_SECCOMP
scmp_filter_ctx ctx;
@@ -1678,15 +1677,18 @@ void setupSeccomp()
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(ENOTSUP), SCMP_SYS(fsetxattr), 0) != 0)
throw SysError("unable to add seccomp rule");
- if (seccomp_attr_set(ctx, SCMP_FLTATR_CTL_NNP, settings.allowNewPrivileges ? 0 : 1) != 0)
+ // Set the NO_NEW_PRIVS prctl flag.
+ // This both makes loading seccomp filters work for unprivileged users,
+ // and is an additional security measure in its own right.
+ if (seccomp_attr_set(ctx, SCMP_FLTATR_CTL_NNP, 1) != 0)
throw SysError("unable to set 'no new privileges' seccomp attribute");
if (seccomp_load(ctx) != 0)
throw SysError("unable to load seccomp BPF program");
#else
- throw Error(
- "seccomp is not supported on this platform; "
- "you can bypass this error by setting the option 'filter-syscalls' to false, but note that untrusted builds can then create setuid binaries!");
+ // Still set the no-new-privileges flag if libseccomp is not available.
+ if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1)
+ throw SysError("PR_SET_NO_NEW_PRIVS failed");
#endif
#endif
}
@@ -1954,10 +1956,6 @@ void LocalDerivationGoal::runChild()
throw SysError("setuid failed");
setUser = false;
-
- // Make sure we can't possibly gain new privileges in the sandbox
- if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1)
- throw SysError("PR_SET_NO_NEW_PRIVS failed");
}
#endif
diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh
index 8856d8fae..85789f6b5 100644
--- a/src/libstore/globals.hh
+++ b/src/libstore/globals.hh
@@ -912,29 +912,6 @@ public:
)"};
#if __linux__
- Setting<bool> filterSyscalls{
- this, true, "filter-syscalls",
- R"(
- Whether to prevent certain dangerous system calls, such as
- creation of setuid/setgid files or adding ACLs or extended
- attributes. Only disable this if you're aware of the
- security implications.
- )"};
-
- Setting<bool> allowNewPrivileges{
- this, false, "allow-new-privileges",
- R"(
- (Linux-specific.) By default, builders on Linux cannot acquire new
- privileges by calling setuid/setgid programs or programs that have
- file capabilities. For example, programs such as `sudo` or `ping`
- will fail. (Note that in sandbox builds, no such programs are
- available unless you bind-mount them into the sandbox via the
- `sandbox-paths` option.) You can allow the use of such programs by
- enabling this option. This is impure and usually undesirable, but
- may be useful in certain scenarios (e.g. to spin up containers or
- set up userspace network interfaces in tests).
- )"};
-
Setting<StringSet> ignoredAcls{
this, {"security.selinux", "system.nfs4_acl", "security.csm"}, "ignored-acls",
R"(
diff --git a/src/libstore/linux/fchmodat2-compat.hh b/src/libstore/linux/fchmodat2-compat.hh
index b05da6786..6ad8a5578 100644
--- a/src/libstore/linux/fchmodat2-compat.hh
+++ b/src/libstore/linux/fchmodat2-compat.hh
@@ -20,18 +20,16 @@
#pragma once
///@file
-#if HAVE_SECCOMP
-# if defined(__alpha__)
-# define NIX_SYSCALL_FCHMODAT2 562
-# elif defined(__x86_64__) && SIZE_MAX == 0xFFFFFFFF // x32
-# define NIX_SYSCALL_FCHMODAT2 1073742276
-# elif defined(__mips__) && defined(__mips64) && defined(_ABIN64) // mips64/n64
-# define NIX_SYSCALL_FCHMODAT2 5452
-# elif defined(__mips__) && defined(__mips64) && defined(_ABIN32) // mips64/n32
-# define NIX_SYSCALL_FCHMODAT2 6452
-# elif defined(__mips__) && defined(_ABIO32) // mips32
-# define NIX_SYSCALL_FCHMODAT2 4452
-# else
-# define NIX_SYSCALL_FCHMODAT2 452
-# endif
-#endif // HAVE_SECCOMP
+#if defined(__alpha__)
+# define NIX_SYSCALL_FCHMODAT2 562
+#elif defined(__x86_64__) && SIZE_MAX == 0xFFFFFFFF // x32
+# define NIX_SYSCALL_FCHMODAT2 1073742276
+#elif defined(__mips__) && defined(__mips64) && defined(_ABIN64) // mips64/n64
+# define NIX_SYSCALL_FCHMODAT2 5452
+#elif defined(__mips__) && defined(__mips64) && defined(_ABIN32) // mips64/n32
+# define NIX_SYSCALL_FCHMODAT2 6452
+#elif defined(__mips__) && defined(_ABIO32) // mips32
+# define NIX_SYSCALL_FCHMODAT2 4452
+#else
+# define NIX_SYSCALL_FCHMODAT2 452
+#endif
diff --git a/src/libstore/meson.build b/src/libstore/meson.build
index 4ccb03df7..98549f6d9 100644
--- a/src/libstore/meson.build
+++ b/src/libstore/meson.build
@@ -210,7 +210,6 @@ libstore = library(
seccomp,
sqlite,
sodium,
- seccomp,
curl,
openssl,
aws_sdk,