mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-18 07:46:09 +01:00
chromium: add nixos module security.chromiumSuidSandbox
Closes #17460 Changed the wrapper derivation to produce a second output containing the sandbox. Add a launch wrapper to try and locate the sandbox (either in /var/setuid-wrappers or in /nix/store). This launch wrapper also sheds libredirect.so from LD_PRELOAD as Chromium does not tolerate it. Does not trigger a Chromium rebuild. cc @cleverca22 @joachifm @jasom
This commit is contained in:
parent
41b8c6d5a9
commit
66d5edf654
4 changed files with 64 additions and 3 deletions
|
@ -92,6 +92,7 @@
|
||||||
./security/apparmor-suid.nix
|
./security/apparmor-suid.nix
|
||||||
./security/audit.nix
|
./security/audit.nix
|
||||||
./security/ca.nix
|
./security/ca.nix
|
||||||
|
./security/chromium-suid-sandbox.nix
|
||||||
./security/duosec.nix
|
./security/duosec.nix
|
||||||
./security/grsecurity.nix
|
./security/grsecurity.nix
|
||||||
./security/hidepid.nix
|
./security/hidepid.nix
|
||||||
|
|
28
nixos/modules/security/chromium-suid-sandbox.nix
Normal file
28
nixos/modules/security/chromium-suid-sandbox.nix
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.security.chromiumSuidSandbox;
|
||||||
|
sandbox = pkgs.chromium.sandbox;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.security.chromiumSuidSandbox.enable = mkEnableOption ''
|
||||||
|
Whether to install the Chromium SUID sandbox which is an executable that
|
||||||
|
Chromium may use in order to achieve sandboxing.
|
||||||
|
|
||||||
|
If you get the error "The SUID sandbox helper binary was found, but is not
|
||||||
|
configured correctly.", turning this on might help.
|
||||||
|
|
||||||
|
Also, if the URL chrome://sandbox tells you that "You are not adequately
|
||||||
|
sandboxed!", turning this on might resolve the issue.
|
||||||
|
|
||||||
|
Finally, if you have <option>security.grsecurity</option> enabled and you
|
||||||
|
use Chromium, you probably need this.
|
||||||
|
'';
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
environment.systemPackages = [ sandbox ];
|
||||||
|
security.setuidPrograms = [ sandbox.passthru.sandboxExecutableName ];
|
||||||
|
};
|
||||||
|
}
|
|
@ -96,6 +96,8 @@ let
|
||||||
buildPath = "out/${buildType}";
|
buildPath = "out/${buildType}";
|
||||||
libExecPath = "$out/libexec/${packageName}";
|
libExecPath = "$out/libexec/${packageName}";
|
||||||
|
|
||||||
|
sandboxExecutableName = "__chromium-suid-sandbox";
|
||||||
|
|
||||||
base = rec {
|
base = rec {
|
||||||
name = "${packageName}-${version}";
|
name = "${packageName}-${version}";
|
||||||
inherit (upstream-info) version;
|
inherit (upstream-info) version;
|
||||||
|
@ -221,6 +223,8 @@ let
|
||||||
targets = extraAttrs.buildTargets or [];
|
targets = extraAttrs.buildTargets or [];
|
||||||
commands = map buildCommand targets;
|
commands = map buildCommand targets;
|
||||||
in concatStringsSep "\n" commands;
|
in concatStringsSep "\n" commands;
|
||||||
|
|
||||||
|
passthru = { inherit sandboxExecutableName; };
|
||||||
};
|
};
|
||||||
|
|
||||||
# Remove some extraAttrs we supplied to the base attributes already.
|
# Remove some extraAttrs we supplied to the base attributes already.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{ newScope, stdenv, makeWrapper, makeDesktopItem
|
{ newScope, stdenv, makeWrapper, makeDesktopItem, writeScript
|
||||||
|
|
||||||
# package customization
|
# package customization
|
||||||
, channel ? "stable"
|
, channel ? "stable"
|
||||||
|
@ -61,22 +61,49 @@ let
|
||||||
|
|
||||||
suffix = if channel != "stable" then "-" + channel else "";
|
suffix = if channel != "stable" then "-" + channel else "";
|
||||||
|
|
||||||
|
sandboxExecutableName = chromium.browser.passthru.sandboxExecutableName;
|
||||||
|
|
||||||
in stdenv.mkDerivation {
|
in stdenv.mkDerivation {
|
||||||
name = "chromium${suffix}-${chromium.browser.version}";
|
name = "chromium${suffix}-${chromium.browser.version}";
|
||||||
|
|
||||||
buildInputs = [ makeWrapper ];
|
buildInputs = [ makeWrapper ];
|
||||||
|
|
||||||
|
outputs = ["out" "sandbox"];
|
||||||
|
|
||||||
buildCommand = let
|
buildCommand = let
|
||||||
browserBinary = "${chromium.browser}/libexec/chromium/chromium";
|
browserBinary = "${chromium.browser}/libexec/chromium/chromium";
|
||||||
getWrapperFlags = plugin: "$(< \"${plugin}/nix-support/wrapper-flags\")";
|
getWrapperFlags = plugin: "$(< \"${plugin}/nix-support/wrapper-flags\")";
|
||||||
|
sandboxExecutableSourcePath = "${chromium.browser}/libexec/chromium/chrome-sandbox";
|
||||||
|
launchScript = writeScript "chromium" ''
|
||||||
|
#! ${stdenv.shell}
|
||||||
|
|
||||||
|
if [ -x "/var/setuid-wrappers/${sandboxExecutableName}" ]
|
||||||
|
then
|
||||||
|
export CHROME_DEVEL_SANDBOX="/var/setuid-wrappers/${sandboxExecutableName}"
|
||||||
|
else
|
||||||
|
export CHROME_DEVEL_SANDBOX="@sandbox@/bin/${sandboxExecutableName}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# libredirect causes chromium to deadlock on startup
|
||||||
|
export LD_PRELOAD="$(echo -n "$LD_PRELOAD" | tr ':' '\n' | grep -v /lib/libredirect\\.so$ | tr '\n' ':')"
|
||||||
|
|
||||||
|
exec @out@/bin/.chromium-wrapped "''${extraFlagsArray[@]}" "$@"
|
||||||
|
'';
|
||||||
in with stdenv.lib; ''
|
in with stdenv.lib; ''
|
||||||
mkdir -p "$out/bin" "$out/share/applications"
|
mkdir -p "$out/bin" "$out/share/applications"
|
||||||
|
|
||||||
ln -s "${chromium.browser}/share" "$out/share"
|
ln -s "${chromium.browser}/share" "$out/share"
|
||||||
eval makeWrapper "${browserBinary}" "$out/bin/chromium" \
|
eval makeWrapper "${browserBinary}" "$out/bin/.chromium-wrapped" \
|
||||||
--set CHROME_DEVEL_SANDBOX "${chromium.browser}/libexec/chromium/chrome-sandbox" \
|
|
||||||
${concatMapStringsSep " " getWrapperFlags chromium.plugins.enabled}
|
${concatMapStringsSep " " getWrapperFlags chromium.plugins.enabled}
|
||||||
|
|
||||||
|
cp -v "${launchScript}" "$out/bin/chromium"
|
||||||
|
substituteInPlace $out/bin/chromium --replace @out@ $out --replace @sandbox@ $sandbox
|
||||||
|
chmod 755 "$out/bin/chromium"
|
||||||
|
|
||||||
|
mkdir -p "$sandbox/bin"
|
||||||
|
[ -x "${sandboxExecutableSourcePath}" ] || exit 1
|
||||||
|
ln -sv "${sandboxExecutableSourcePath}" "$sandbox/bin/${sandboxExecutableName}"
|
||||||
|
|
||||||
ln -s "$out/bin/chromium" "$out/bin/chromium-browser"
|
ln -s "$out/bin/chromium" "$out/bin/chromium-browser"
|
||||||
ln -s "${chromium.browser}/share/icons" "$out/share/icons"
|
ln -s "${chromium.browser}/share/icons" "$out/share/icons"
|
||||||
cp -v "${desktopItem}/share/applications/"* "$out/share/applications"
|
cp -v "${desktopItem}/share/applications/"* "$out/share/applications"
|
||||||
|
@ -87,5 +114,6 @@ in stdenv.mkDerivation {
|
||||||
passthru = {
|
passthru = {
|
||||||
inherit (chromium) upstream-info;
|
inherit (chromium) upstream-info;
|
||||||
mkDerivation = chromium.mkChromiumDerivation;
|
mkDerivation = chromium.mkChromiumDerivation;
|
||||||
|
inherit sandboxExecutableName;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue