# 軽い防御付きbashの起動(osx sandbox) ### 概要 ちょっとしたもらいもののスクリプトを動かす時、大変なことになっちゃわないか確認したい。コピペミスっててもやばいことにならないでほしい。って時に使うbash。 また、自分製のスクリプトを他の人のパソコンで動かしてもらう時に、相手の不安感を和らげるためにも使えるでしょう。
気になるものはどんどんdenyしていきましょう!
sandbox-exec -p '
(version 1)
(allow default)
(deny network* )
(deny file-write* (regex #"^(?!/dev/tty|/var/folders/|/tmp/).*$"))
(deny file* (regex #"/id_rsa$"))
(deny file* (regex #"\.pem$"))
' /bin/bash
かっちりしたサンドボックスが作りたければこちら。デフォルト禁止からのスタートです。 起動して予定している操作をしてexitすれば良いだけ。操作を記録する感じ。sbファイルが出来上がっています。 これで出来上がったものをsort | uniq 、基本部分をコピペなどして整形しましょう。(*基本部分とは-pオプション引数内の(trace "/tmp/_trace.sb") 以外の部分のこと) その操作が何にアクセスしてるかを調べる時にも使えるね。
一時フォルダは(regex #"^/private/var/folders/[^/]+/[^/]+/T/")とか
rm /tmp/_trace.sb
sandbox-exec -p '
(version 1)
(debug all)
(import "bsd.sb")
(allow file-read*
(regex #"^/Users/.+/.bashrc$")
(regex #"^/Users/.+/.rnd$"))
(allow file*
(literal "/dev/tty")
(regex #"^/Users/.+/.bash_history$")
)
(allow process-fork)
(allow process-exec* (literal "/bin/bash"))
(trace "/tmp/_trace.sb")
(deny default)
' /bin/bash
pingした場合に得られるもの
cat /tmp/_trace.sb
(version 1) ; Fri Jun 5 11:31:12 2015
(allow process-exec* (literal "/sbin/ping"))
(allow process-exec* (literal "/sbin/ping"))
(allow network-outbound (remote udp4 "*:*"))
(allow network-inbound (local udp4 "*:*"))
(allow network-outbound (remote udp4 "*:*"))
(allow network-inbound (local udp4 "*:*"))
(allow network-outbound (remote udp4 "*:*"))
(allow network-inbound (local udp4 "*:*"))
cat /tmp/_trace.sb| sort | uniq
(allow network-inbound (local udp4 "*:*"))
(allow network-outbound (remote udp4 "*:*"))
(allow process-exec* (literal "/sbin/ping"))
(version 1) ; Fri Jun 5 11:31:12 2015
整形後
sandbox-exec -p '
(version 1)
(import "bsd.sb")
(allow file-read-data (literal "/Users/username/.bashrc"))
(allow file-read-data (literal "/Users/username/.rnd"))
(allow file* (literal "/Users/username/.bash_history"))
(allow file* (literal "/dev/tty"))
(allow process-fork)
(allow process-exec* (literal "/bin/bash"))
(allow network-inbound (local udp4 "*:*"))
(allow network-outbound (remote udp4 "*:*"))
(allow process-exec* (literal "/sbin/ping"))
(deny default)
' /bin/bash
これでping用のサンドボックス定義つきのbash出来上がり。
sandbox-simplify /tmp/_trace.sb
(version 1)
(deny default)
(allow network-inbound
(local udp "*:*"))
(allow network-outbound
(remote udp "*:*"))
(allow process-exec*
(literal "/sbin/ping"))
かぶりが多くなるといい塩梅にまとめてくれそう!どのみちコピペは必要なのかしらね。
全トレースからやってみる
sandbox-exec -p '
(version 1)
(debug all)
(trace "/tmp/_trace_full.sb")
(deny default)
' /bin/bash
実行コマンド
ping 8.8.8.8
sandbox-simplify /tmp/_trace_full.sb
(version 1)
(deny default)
(allow file-ioctl
(literal "/dev/dtracehelper"))
(allow file-read*
(literal "/Users/username/.bash_history")
(literal "/Users/username/.bashrc")
(literal "/dev/dtracehelper")
(literal "/dev/tty")
(subpath "/usr/share"))
(allow file-read-metadata
(literal "/etc")
(literal "/sbin/ping")
(literal "/var")
(subpath "/usr/lib"))
(allow file-write-data
(literal "/Users/username/.bash_history")
(literal "/dev/dtracehelper")
(literal "/dev/tty"))
(allow ipc-posix-shm-read-data
(ipc-posix-name "apple.shm.notification_center"))
(allow mach-lookup
(global-name "com.apple.system.notification_center")
(global-name "com.apple.system.opendirectoryd.libinfo"))
(allow network-inbound
(local udp "*:*"))
(allow network-outbound
(remote udp "*:*"))
(allow process-exec*
(literal "/bin/bash")
(literal "/sbin/ping"))
(allow process-fork)
(allow sysctl-read
(sysctl-name "kern.hostname")
(sysctl-name "kern.ngroups")
(sysctl-name "kern.usrstack64")
(sysctl-name "net.routetable.0.0.3.0"))
ふうむ。まとめてかけるんだねぇ。