Skip to content

Instantly share code, notes, and snippets.

@shgeta
Last active August 18, 2016 04:25
Show Gist options
  • Save shgeta/25d2124eb9c45419e841 to your computer and use it in GitHub Desktop.
Save shgeta/25d2124eb9c45419e841 to your computer and use it in GitHub Desktop.
軽い防御付きbashの起動(osx)

# 軽い防御付きbashの起動(osx sandbox) ### 概要 ちょっとしたもらいもののスクリプトを動かす時、大変なことになっちゃわないか確認したい。コピペミスっててもやばいことにならないでほしい。って時に使うbash。 また、自分製のスクリプトを他の人のパソコンで動かしてもらう時に、相手の不安感を和らげるためにも使えるでしょう。

基本何でも許可、ネットワーク禁止、ファイル書き込み禁止(除外:/dev/tty /tmp/ /var/folders/ ) ファイルアクセス禁止(/id_rsaで終わるもの。.pemで終わるもの)

気になるものはどんどん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 を使ってみよう。
 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"))

ふうむ。まとめてかけるんだねぇ。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment