OS X sandbox: Improve builtin sandbox profile

Also, add rules to allow fixed-output derivations to access the
network.

These rules are sufficient to build stdenvDarwin without any
__sandboxProfile magic.
This commit is contained in:
Eelco Dolstra 2017-05-31 17:23:27 +02:00
parent 5ea8161b55
commit c96e8cd097
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
5 changed files with 85 additions and 67 deletions

1
.gitignore vendored
View file

@ -50,6 +50,7 @@ perl/Makefile.config
# /src/libstore/ # /src/libstore/
/src/libstore/schema.sql.gen.hh /src/libstore/schema.sql.gen.hh
/src/libstore/sandbox-defaults.sb.gen.hh /src/libstore/sandbox-defaults.sb.gen.hh
/src/libstore/sandbox-network.sb.gen.hh
/src/nix/nix /src/nix/nix

View file

@ -2614,8 +2614,9 @@ void DerivationGoal::runChild()
string sandboxProfile; string sandboxProfile;
if (drv->isBuiltin()) { if (drv->isBuiltin()) {
; ;
}
#if __APPLE__ #if __APPLE__
} else if (useChroot) { else if (useChroot) {
/* Lots and lots and lots of file functions freak out if they can't stat their full ancestry */ /* Lots and lots and lots of file functions freak out if they can't stat their full ancestry */
PathSet ancestry; PathSet ancestry;
@ -2656,6 +2657,11 @@ void DerivationGoal::runChild()
#include "sandbox-defaults.sb.gen.hh" #include "sandbox-defaults.sb.gen.hh"
; ;
if (fixedOutput)
sandboxProfile +=
#include "sandbox-network.sb.gen.hh"
;
/* The tmpDir in scope points at the temporary build directory for our derivation. Some packages try different mechanisms /* The tmpDir in scope points at the temporary build directory for our derivation. Some packages try different mechanisms
to find temporary directories, so we want to open up a broader place for them to dump their files, if needed. */ to find temporary directories, so we want to open up a broader place for them to dump their files, if needed. */
Path globalTmpDir = canonPath(getEnv("TMPDIR", "/tmp"), true); Path globalTmpDir = canonPath(getEnv("TMPDIR", "/tmp"), true);
@ -2718,8 +2724,9 @@ void DerivationGoal::runChild()
args.push_back("-D"); args.push_back("-D");
args.push_back("_GLOBAL_TMP_DIR=" + globalTmpDir); args.push_back("_GLOBAL_TMP_DIR=" + globalTmpDir);
args.push_back(drv->builder); args.push_back(drv->builder);
}
#endif #endif
} else { else {
builder = drv->builder.c_str(); builder = drv->builder.c_str();
string builderBasename = baseNameOf(drv->builder); string builderBasename = baseNameOf(drv->builder);
args.push_back(builderBasename); args.push_back(builderBasename);

View file

@ -36,14 +36,14 @@ libstore_CXXFLAGS = \
$(d)/local-store.cc: $(d)/schema.sql.gen.hh $(d)/local-store.cc: $(d)/schema.sql.gen.hh
$(d)/build.cc: $(d)/sandbox-defaults.sb.gen.hh $(d)/build.cc: $(d)/sandbox-defaults.sb.gen.hh $(d)/sandbox-network.sb.gen.hh
%.gen.hh: % %.gen.hh: %
echo 'R"foo(' >> $@.tmp @echo 'R"foo(' >> $@.tmp
cat $< >> $@.tmp $(trace-gen) cat $< >> $@.tmp
echo ')foo"' >> $@.tmp @echo ')foo"' >> $@.tmp
mv $@.tmp $@ @mv $@.tmp $@
clean-files += $(d)/schema.sql.gen.hh $(d)/sandbox-defaults.sb.gen.hh clean-files += $(d)/schema.sql.gen.hh $(d)/sandbox-defaults.sb.gen.hh $(d)/sandbox-network.sb.gen.hh
$(eval $(call install-file-in, $(d)/nix-store.pc, $(prefix)/lib/pkgconfig, 0644)) $(eval $(call install-file-in, $(d)/nix-store.pc, $(prefix)/lib/pkgconfig, 0644))

View file

@ -1,62 +1,56 @@
(allow file-read* file-write-data (literal "/dev/null")) (define TMPDIR (param "_GLOBAL_TMP_DIR"))
(allow ipc-posix*)
(allow mach-lookup (global-name "com.apple.SecurityServer"))
(allow file-read*
(literal "/dev/dtracehelper")
(literal "/dev/tty")
(literal "/dev/autofs_nowait")
(literal "/System/Library/CoreServices/SystemVersion.plist")
(literal "/private/var/run/systemkeychaincheck.done")
(literal "/private/etc/protocols")
(literal "/private/var/tmp")
(literal "/private/var/db")
(subpath "/private/var/db/mds"))
(allow file-read*
(subpath "/usr/share/icu")
(subpath "/usr/share/locale")
(subpath "/usr/share/zoneinfo"))
(allow file-write*
(literal "/dev/tty")
(literal "/dev/dtracehelper")
(literal "/mds"))
(allow file-ioctl (literal "/dev/dtracehelper"))
(allow file-read-metadata
(literal "/var")
(literal "/tmp")
(literal "/etc/resolv.conf")
(literal "/private/etc/resolv.conf"))
(allow file-read*
(literal "/private/var/run/resolv.conf"))
; some builders use filehandles other than stdin/stdout
(allow file*
(subpath "/dev/fd")
(literal "/dev/ptmx")
(regex #"^/dev/[pt]ty.*$"))
; allow everything inside TMP
(allow file* process-exec
(subpath (param "_GLOBAL_TMP_DIR"))
(subpath "/private/tmp"))
(allow process-fork)
(allow sysctl-read)
(allow signal (target same-sandbox))
; allow getpwuid (for git and other packages)
(allow mach-lookup
(global-name "com.apple.system.notification_center")
(global-name "com.apple.system.opendirectoryd.libinfo"))
; allow local networking
(allow network* (local ip) (remote unix-socket))
; Disallow creating setuid/setgid binaries, since that ; Disallow creating setuid/setgid binaries, since that
; would allow breaking build user isolation. ; would allow breaking build user isolation.
(deny file-write-setugid) (deny file-write-setugid)
; Allow forking.
(allow process-fork)
; Allow reading system information like #CPUs, etc.
(allow sysctl-read)
; Allow POSIX semaphores and shared memory.
(allow ipc-posix*)
; Allow socket creation.
(allow system-socket)
; Allow sending signals within the sandbox.
(allow signal (target same-sandbox))
; Access to /tmp.
(allow file* process-exec (literal "/tmp") (subpath TMPDIR))
; Some packages like to read the system version.
(allow file-read* (literal "/System/Library/CoreServices/SystemVersion.plist"))
; Without this line clang cannot write to /dev/null, breaking some configure tests.
(allow file-read-metadata (literal "/dev"))
; Standard devices.
(allow file*
(literal "/dev/null")
(literal "/dev/random")
(literal "/dev/stdin")
(literal "/dev/stdout")
(literal "/dev/tty")
(literal "/dev/urandom")
(literal "/dev/zero")
(subpath "/dev/fd"))
; Does nothing, but reduces build noise.
(allow file* (literal "/dev/dtracehelper"))
; Allow access to zoneinfo since libSystem needs it.
(allow file-read* (subpath "/usr/share/zoneinfo"))
(allow file-read* (subpath "/usr/share/locale"))
; This is mostly to get more specific log messages when builds try to
; access something in /etc or /var.
(allow file-read-metadata
(literal "/etc")
(literal "/var")
(literal "/private/var/tmp")
)

View file

@ -0,0 +1,16 @@
; Allow local and remote network traffic.
(allow network* (local ip) (remote ip))
; Allow access to /etc/resolv.conf (which is a symlink to
; /private/var/run/resolv.conf).
(allow file-read-metadata
(literal "/var")
(literal "/etc")
(literal "/etc/resolv.conf")
(literal "/private/etc/resolv.conf"))
(allow file-read*
(literal "/private/var/run/resolv.conf"))
; Allow DNS lookups.
(allow network-outbound (remote unix-socket (path-literal "/private/var/run/mDNSResponder")))