From 831c700c5d04c791c9384991d38ac146067daa64 Mon Sep 17 00:00:00 2001 From: Roosembert Palacios Date: Fri, 27 Nov 2020 22:42:03 +0100 Subject: [PATCH] firejail: fix -overlay and -build functionality on NixOS - The `-overlay` flag runs the specified binary inside an OverlayFS, since the /nix store may be in a different mount point than the user home, this patch explicitly bind mounts it so it's available inside the overlay. - profile builder: firejail provides facilities to build a new profiles. To do so, it execute the helper binary `fbuilder`, which in turn will execute firejail back with different options. This patch makes it use the binary available in PATH instead of the one produced at compile time. The compiled firejail binary doesn't have the necessary permissions, so the firejail NixOS module wraps it in a SUID wrapper available on PATH at runtime. Signed-off-by: Roosembert Palacios --- pkgs/os-specific/linux/firejail/default.nix | 9 +++++++ .../fbuilder-call-firejail-on-path.patch | 11 ++++++++ .../firejail/mount-nix-dir-on-overlay.patch | 27 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 pkgs/os-specific/linux/firejail/fbuilder-call-firejail-on-path.patch create mode 100644 pkgs/os-specific/linux/firejail/mount-nix-dir-on-overlay.patch diff --git a/pkgs/os-specific/linux/firejail/default.nix b/pkgs/os-specific/linux/firejail/default.nix index fadf5df7140a..a3be5484a047 100644 --- a/pkgs/os-specific/linux/firejail/default.nix +++ b/pkgs/os-specific/linux/firejail/default.nix @@ -20,6 +20,15 @@ stdenv.mkDerivation { name = "${s.name}.tar.bz2"; }; + patches = [ + # Adds the /nix directory when using an overlay. + # Required to run any programs under this mode. + ./mount-nix-dir-on-overlay.patch + # By default fbuilder hardcodes the firejail binary to the install path. + # On NixOS the firejail binary is a setuid wrapper available in $PATH. + ./fbuilder-call-firejail-on-path.patch + ]; + prePatch = '' # Allow whitelisting ~/.nix-profile substituteInPlace etc/firejail.config --replace \ diff --git a/pkgs/os-specific/linux/firejail/fbuilder-call-firejail-on-path.patch b/pkgs/os-specific/linux/firejail/fbuilder-call-firejail-on-path.patch new file mode 100644 index 000000000000..6016891655b1 --- /dev/null +++ b/pkgs/os-specific/linux/firejail/fbuilder-call-firejail-on-path.patch @@ -0,0 +1,11 @@ +--- a/src/fbuilder/build_profile.c ++++ b/src/fbuilder/build_profile.c +@@ -67,7 +67,7 @@ + errExit("asprintf"); + + char *cmdlist[] = { +- BINDIR "/firejail", ++ "firejail", + "--quiet", + "--noprofile", + "--caps.drop=all", diff --git a/pkgs/os-specific/linux/firejail/mount-nix-dir-on-overlay.patch b/pkgs/os-specific/linux/firejail/mount-nix-dir-on-overlay.patch new file mode 100644 index 000000000000..685314f90758 --- /dev/null +++ b/pkgs/os-specific/linux/firejail/mount-nix-dir-on-overlay.patch @@ -0,0 +1,27 @@ +--- a/src/firejail/fs.c ++++ b/src/firejail/fs.c +@@ -1143,6 +1143,16 @@ + errExit("mounting /dev"); + fs_logger("whitelist /dev"); + ++ // mount-bind /nix ++ if (arg_debug) ++ printf("Mounting /nix\n"); ++ char *nix; ++ if (asprintf(&nix, "%s/nix", oroot) == -1) ++ errExit("asprintf"); ++ if (mount("/nix", nix, NULL, MS_BIND|MS_REC, NULL) < 0) ++ errExit("mounting /nix"); ++ fs_logger("whitelist /nix"); ++ + // mount-bind run directory + if (arg_debug) + printf("Mounting /run\n"); +@@ -1201,6 +1211,7 @@ + free(odiff); + free(owork); + free(dev); ++ free(nix); + free(run); + free(tmp); + }