Prozesse in einer Sandbox laufen lassen

Mit Mac OS 10.5 (Leopard) hat Apple das Sandbox System in Mac OS eingeführt. Sandboxing heisst, dass einem Prozess bestimmte Aktionen verweigert werden. Dazu gehört der Dateizugriff oder der Netzwerkzugriff bzw. die Möglichkeit, andere Programme zu starten. Zuständig für das Sandboxing ist die Kernel Erweiterung Sandbox.kext. Es gibt mehrere Profile, die den Zugriff auf bestimmte Resourcen verweigern:

  • kSBXProfileNoInternet: Verbietet den Zugriff auf das netzwerk mit TCP/IP
  • kSBXProfileNoNetwork: Verbietet den Zugriff auf die Netzwerk Sockets
  • kSBXProfileNoWrite: Verbietet den Schreibzugriff auf das Dateisystem
  • kSBXProfileNoWriteExceptTemporary: Lässt den Schreibzugriff nur in /var/tmp und anderen definierten temp-Verzeichnissen zu
  • kSBXProfilePureComputation: Es sind nur Berechnungen erlaubt, jede Betriebsystem Funktion ist untersagt

Es gibt bereits mehrere System Programme, die in einer Sandbox laufen. Dazu gehören zB quicklookd, named, ntpd, sshd, syslogd etc. In /usr/share/sandbox findet man einige Konfigurationsprofile für die og Sandbox Prozesse. Wird ein Prozess in einer Sandbox gestartet, werden alle seine Kindprozesse ebenfalls in der selben Sandbox gestartet. Mit dem Kommando sandbox-exec kann man einen Prozess in einer Sandfbox starten, mit der Option -f kann eine Konfigurationsdatei als Grundlage verwendet werden. Man kann sich aber auch selber Konfigurationsdateien erstellen. Meine Konfigurationsdatei ist erstmal recht simpel aber zum demonstrieren reicht es:

/usr/share/sandbox/org.prontosystems.nonetwork.sb

 (version 1)
 
;; Erlaube zunächst alles
(allow default) 
 
;; Verbiete Netzwerkzugriff
(deny network*) 

Mit dieser Konfigurationsdatei kann ich jetzt eine Shell starten, die keinen Zugriff auf das Netzwerk hat.

$ sandbox-exec -f /usr/share/sandbox/org.prontosystems.nonetwork.sb /bin/bash
bash-3.2$ ping -c 1 localhost
PING localhost (127.0.0.1): 56 data bytes
ping: sendto: Operation not permitted
--- localhost ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss

Aber Achtung: Der Zugriff auf bereits eingehängte Netzwerkvolumes ist nach wie vor möglich, da der Zugriff drauf auf den lokalen Mountpoint erfolgt:

bash-3.2$ cd /Volumes/orgfiles/
bash-3.2$ ls (cr)
CompatibilityPack_Office2007	Office				Streams.zip			streams.exe
Icons				ScreenShot.png			Sun_ODF-Plugin_for_MS_Office	windows.txt
MacData				Streams				fproxy3.png

Mit einer weiteren Modifikation unseres Profils lässt sich aber auch das verhindern:

/usr/share/sandbox/org.prontosystems.nonetwork.sb

 (version 1)
 
;; Erlaube zunächst alles
(allow default)
 
;; Verbiete Netzwerkzugriff
(deny network*)
 
;; Verbiete das lesen und Schreiben in /Volumes
(deny file-read* file-write*
      (subpath "/Volumes"))

$ sandbox-exec -f /usr/share/sandbox/org.prontosystems.nonetwork.sb /bin/bash (cr)
bash-3.2$ cd /Volumes/orgfiles (cr)
cd: error retrieving current directory: getcwd: cannot access parent directories: Operation not permitted

Natürlich ist eine "allow default" Regel unbefriedigend, zu gross ist die Gefahr, dass beim Schliessen bzw. Verbieten der gewünschten Aktionen etwas übersehen wird. Demnach stellt eine "deny default" Regel, gefolgt durch diverse allow Regeln, welche den Zugriff auf das System Stück für Stück erlauben, eine wesentlich höhere Sicherheit dar. Hier ein Beispielprofil, welche einer Shell zwar erlaubt im gesamten Filesystem zu lesen aber schreibenden Zugriff nur im tmp-Verzeichnis erlaubt:

/usr/share/sandbox/org.prontosystems.allowtmp.sb

(version 1)
 
;; Verbiete erstmal alles
(deny default)
(debug deny)
 
;; Erlaube Programme zu starten
(allow process-exec)
 
;; Erlaube Kindprozesse zu starten
(allow process-fork)
 
;; Erlaube das Lesen im gesamten Filesystem
(allow file-read*)
 
;; Erlaube das Schreiben nur in /tmp
(allow file-write*
	(regex #"^/private/tmp($|/)"))

$ sandbox-exec -f /usr/share/sandbox/org.prontosystems.allowtmp.sb /bin/bash
bash-3.2$ ping -c 1 wiki.prontosystems.org
could not lookup DNS configuration info service: (ipc/send) invalid destination port
ping: cannot resolve wiki.prontosystems.org: Unknown host

bash-3.2$ touch /tmp/test.txt
bash-3.2$ rm /tmp/test.txt
bash-3.2$ touch ~/Desktop/test.txt
touch: /Users/pronto/Desktop/test.txt: Operation not permitted

Man sieht, es ist kein Netzwerkzugriff möglich; das Anlegen und Löschen einer Datei in /tmp ist möglich; das Anlegen einer Datei auf dem Desktop hingegen nicht.

pronto 2010/05/27 20:57

mac/sandbox.txt (8996 views) · Zuletzt geändert: 2011/04/16 20:39 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0