スマートフォン解析 top

TOP > タイガーチームセキュリティレポート > Sandboxについて - Part 1

タイガーチームセキュリティレポート

Sandboxについて - Part 1

以後、何回かにわけてUnix系OSのsandbox機能に関するコラムを進めていきます。


-Sandboxとは-

Wikipediaによれば

"サンドボックス(sandbox)とは、外部から受け取ったプログラムを保護された領域で動作させることによってシステムが不正に操作されるのを防ぐセキュリティモデルのこと。"

...らしいです。
Unix系OSでのSandboxの具体的な実装を見ていくのが今回のコラムのテーマです。


-chroot(2)-

古典的なシステムコールの話からはじめたいと思います。

chroot()は簡易的なsandboxを実現するためのシステムコールとみなすことができます。
このsandboxはchroot jailなどと呼ばれることもありますが、FreeBSDのjail()とは全くの別物です。
また特権プロセスだけがchroot()をコールできます。

chroot()は、代表的にはDNSサーバのBINDなどで利用されてきたことで知られていますが、
同時にある種のloopholeがあることでも有名です。
chroot jail(以下jail)内で、chroot()をコールできるプロセスはjailから脱出することが可能です。

manを読めば、親切なことに脱出の仕方が書いてあります。

実際に、Debian wheezy上で試してみます。
まずjail環境を作りましょう。jail内でbashを実行するための最低限のセットアップをします。


これで/jail以下にjail環境を構築して、実際にbashを実行することができました。
当然ですが、この状態ではjail内でbashのbuilt-inコマンド以外を実行することはできません。
つぎにjailを脱出するためのプログラム(jailbreak.c)を作成します(エラー処理は省略)。


ここでやっていることはcwdの下のディレクトリfooにchrootした後に../..すなわち
chroot()する前のrootにchrootしなおして、bashを起動しているだけです。
これをコンパイルしてjail内で実行してみましょう。コンパイルしたらjailにコピーします。


jail内で起動したbashから、コピーしたプログラムを実行します。


脱出成功です。

manに書いてありますがchroot()はコールしたプロセスのcwdを変えません。
wheezyでLinux Kernelのソースをチェックしてみましょう。Kernelのバージョンは3.2です。

fs/open.cより抜粋

権限のチェックをした後に、set_fs_root()でrootを切り替えています。
set_fs_root()の中でやっていることは、ほぼfs->rootにpathを代入することだけです。

fs/fs_struct.cより抜粋

chroot()はcwdが引数で指定したディレクトリの下(枝)にあるかどうかをチェックしないので
chroot("foo")がuser spaceに戻った時点でcwdはrootの親になっています。
そのつぎのchroot("../..")ですが、親ディレクトリ .. を辿るための関数はfollow_dotdot()です。

fs/namei.cより抜粋

1153行目のチェックにより、
chroot()していない状態ではfs->rootを横断して親ディレクトリを辿れなくなっていますが
cwdがfs->rootより上にある場合は、このチェックにかかることはありません。
結果、 ../.. はchrootする前のrootを参照します(この場合は ../.. ではなく .. で十分です)。

以上が、jailbreak.cの裏側(kernel space)での動作の概要です。

この動作はchroot()の脆弱性というよりはchroot()の仕様ですが、セキュリティに関してchroot()はあくまで簡易的な装置でしかありません。
chroot()にはjailの外のプロセスに対してシグナルを送れることができるなど、セキュリティの観点から見て不十分な点がほかにもあります。

jailのセキュリティを強化するいくつかの方法については回を改めて検討することにします。


参考情報:
[1] サンドボックス (セキュリティ)
http://ja.wikipedia.org/wiki/...
[2] What chroot() is really for
http://lwn.net/Articles/252794/


次回は、Linuxのコンテナ実装であるLXCについて書いてみたいと思います。


タイガーチームメンバー 塚本 泰三