Apple Sandbox(Seatbelt)を・・・強いられているんだ!
この記事はカーネル/VM Advent Calendar 2011の記事です.
前書き
どうも,サンドボックス萌えなid:yuzuharaです.
今年はみんな大好きMacに標準搭載されているApple Sandboxの話をしてみようと思います
サンドボックスっていうと,コンテキストによっていろいろ意味が変わります.
この記事でいうサンドボックスは,”OSレベルの実行時アプリケーションの隔離を行う機構”のことをいいます.隔離というのは,プログラムを実行するとOSが管理するリソースのすべてが利用不可能な状態で起動するという感じです.この状態から,セキュリティポリシーにより最低限のリソースの利用を許可していくのがサンドボックスの基本的な利用方法となります.
こんな感じ.
サンドボックスは,サンドボックス上で実行したアプリケーションを,あらかじめセキュリティポリシーに書かれたリソースにしかアクセス出来なくします.アプリケーションに脆弱性があり,その権限が乗っ取られたときでも,あらかじめ記述したセキュリティポリシーの範囲にしか変更する事が出来ません.
・・・まぁ,このセキュリティポリシーを書くのが難しいんですけどね.
OSレベルのアプリケーションの隔離といえば, Daniel Walshさんが作ったSELinux SandboxがFedora14から利用可能になっています.その中身は,sandbox用のtype と,labelの管理(状況によってlabelを変更)を行うツールです.ベースになっている強制アクセス制御は,皆さんがいつもいつも真っ先にDisabledにしてしまうSELinuxです.
まぁどうせ皆さん,SELinux Sandboxもオフっちゃうんでしょうけど・・・
Apple Sandboxとは
Mac OSX 10.6(Snow Leopard)から搭載されている,アプリケーション用サンドボックスです."Seatbelt”という名前で開発が進められており,こちらの名前を知っている人も多いかと思います.
そのベースになっているのは,Trusted BSD Projectで開発されたMAC Frameworkです.Trusted BSDはアメリカ国防総省のセキュリティに関するコンピューター導入基準(Common Criteria)にBSDを適応するためのセキュリティ機能群ですね.
Apple Sandboxの簡単な使い方
とりあえず使ってみましょう.
皆さんのMac(Lion)には,既にこのApple Sandboxは組み込まれています.ついでにいうとiOSデバイスにも.サンドボックスを使ってアプリケーションをlaunchするには,/usr/bin/sandbox-execというコマンドを利用します,
sandbox-execでは,セキュリティポリシーのことをprofileと読んでいます.デフォルトで用意されているprofileを指定するときは,"-n"で指定します.自分自身でprofileを用意する場合は,ファイルに記述し,.sbという拡張子で保存しておくとよさそうです.ファイルを指定するときは-f hoge.sb.
%sandbox-exec -n no-internet curl http://www.gentoo.org/
curl: (7) Failed to connect to 89.16.167.134: Operation not permitted
とまぁ,インターネットに繋げずにエラーとなります.
オプションについては,man sandbox-execやman sandbox_initで確認できます.
さらっと紹介.
- no-internet
TCP/IPが利用不可
- no-networking
ソケットベースの全ての通信が利用不可
- no-write
アプリケーションはいかなるファイルにも書き込みができない
- no-write-except-temporary
アプリケーションは一部(/var/tmpや_CS_DAR-WIN_USER_TEMP_DIRに設定されたディレクトリ)のディレクトリ以外に書き込みができない
- pure-computation
アプリケーションは一切OSのリソース・サービスを利用することができない
ためしに,書き込み禁止プロファイルを使って,gentooのトップページをダウンロードしてみました.
% sandbox-exec -n no-write curl -o /var/tmp/gentoo http://www.gentoo.org/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0Warning: Failed to create the file /var/tmp/gentoo: Operation not permitted
5 47502 5 2598 0 0 2062 0 0:00:23 0:00:01 0:00:22 5575
curl: (23) Failed writing body (0 != 2598)
アアアッ,書き込めないって怒られました.
今度は,/var/tmpに書き込みを許可したポリシーを用いて,/var/tmp/gentooというファイルに書き込みを試みます.
% sandbox-exec -n no-write-except-temporary curl -o /var/tmp/gentoo http://www.gentoo.org/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 47502 100 47502 0 0 32532 0 0:00:01 0:00:01 --:--:-- 46938
[bachi@lucchini] % head /var/tmp/gentoo
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
お,保存できましたね.
簡単な使い方はこうです.
プロファイルの書き方
プロファイルはこんな方に書いていきます.どこかS式っぽい・・・
(version 1)
(allow default)
(deny file-write* (regex #"/var/tmp/*$") )
ポリシー記述の基本は,いわゆるパス名ベースとなってます.
これ,カーネルモジュールの中に正規表現エンジンが入っていて,カーネルの中でそのまま評価されるみたいです.
セ,セキュリティ的に大丈夫なんだろうか・・・
(TOMOYOも正規表現にバグがあったときがありましたよね・・)
このプロファイルは,/var/tmp/以下にファイルを作成できなくするようにポリシーを書いてみました.
ホントは,デフォルトで禁止と書きたいのですが・・・このためには,プログラムの正常な動作をすべて記述しなければなりません.
この作業はとても大変・・・・
と,この大変な作業を簡単にする方法があるようです.
sandbox-simplify というコマンドは,traceコマンドで取ったプロセスのトレースログを使って,プロファイルの下地を作ってくれます.
※traceについては時間が無かったので今度再度まとめます・・・
既存のプロファイルを見てみよう
Lion では,/System/Library/Sandbox/Profiles や/usr/share/sandboxの中にプロファイルがたくさんあります.興味がある人はのぞいてみると良いと思います.
プロセスの基本的な振る舞い(ライブラリやログ周り)については,/System/Library/Sandbox/Profiles/bsd.sbというファイルがあります.
自分でカスタムプロファイルを作るときは,まずこのbsd.sbをimportするとよいと思われます.
どんなプログラムがサンドボックス化されているの?
activity monitorで確認することが出来ます(デフォルトでは表示されていないので,項目を右クリック→表示).
有名なのはGoogle Chromeですね.
あとはAppleのデフォルトインストールアプリは割とサンドボックス化されているようです.
まとめ
ざっとですが,Apple Sandboxについて紹介しました!
余裕があれば,今度はkernel内部を読んでみようと思います.
それでは,皆さん良いお年を!
参考文献