サンドボックス化によるセキュアなプログラミング
TRANSCRIPT
サンドボックス化によるセキュアなプログラミング
2014 年度 システムソフトウェアゼミ 盧 亦愷https://github.com/luyikei/
事前学習● Tcpdump のソースコードを読んだ
・chroot や setuid を使用していた。 ・cap-ng を使用し(できるなら)、特権を禁止していた。
● OpenSSH のソースコードを読んだ ・プロセスを分割し、分割した先で、 ・OS によって違う手法を使っており、 OS別に異なるファイルにサンドボックスのコードがあった。 ・基本は手法が違うだけで目的はTcpdumpとほぼ同じ
● パイプと fork() の修行 プロセス分割をするときに必要だから
Privilege separated tcpdump(1)
● Otto writes: "tcpdump(1) has a bad reputation; quite some vulnerabilities have been found in it. Since tcpdump is run as root when capturing packets from an interface, the impact of these vulnerabilities can be high.
● To reduce the risk of running tcpdump as root, tcpdump has been modified to become privilege separated. The parsing and printing of the network packets takes now place in an unprivileged, chrooted process.
● The work has been done by Can Erkin Acar and Otto Moerbeek.
http://www.undeadly.org/cgi?action=article&sid=20040220120426
(直訳) 特権分離 tcpdump(1)
● Otto が書いた: "tcpdump(1) は評判悪い; 実にいくつかの脆弱性が見つかったのだ. Tcpdump はインターフェース
からパケットキャプチャをする以上 root で実行されなくてはならない, なのでこういった脆弱性の影響が非常に大きくなってしまいます.
● tcpdump が root で実行されるリスクを軽減するために, tcpdump は特権を分離するように改変された. ネットワークのパケットのパースとプリントは非特権で行われます, chroot のプロセスで動いています。
Privilege Separated OpenSSH
We use an unprivileged child process to contain and restrict the effects of programming errors. A bug in the unprivileged child process does not result in a system compromise. In other words,
the goal is complete privilege separation within in OpenSSH.
http://www.citi.umich.edu/u/provos/ssh/privsep.html
(直訳) 特権分離 OpenSSH
● 非特権の子プロセスを使用することでプログラミングの不具合を含まれても影響を小さくできる.
● 非特権の子プロセスにバグがあってもシステムの妥協は許さない.
● つまり, ゴールは OpenSSH の特権分離である.
具体的な手法
● rlimit
プロセスに様々な制限を掛けられるex ) CPU 時間、ファイルの作成, メモリのヒープの上限
● seccomp, capability
システムコールの制限など.....
Privilege separation is a powerful principle to improve cyber security that can also be applied to
other authentication services.
http://www.citi.umich.edu/u/provos/ssh/privsep.html
つまり何故必要なのか
● 脆弱性を突かれて特権を排除して 攻撃者に好き勝手させない
● 他のメリットに Chrome はプロセスを分割することによって、タブの一つがフリーズしても全体はフリーズしない!
子プロセスは計算するだけなので...
● prctlのPR_SET_NO_NEW_PRIVSを使ってexeve()の禁止
● seccomp を利用した子プロセスのシステムコールの制限許可したシステムコール: close(), 親プロセスとの通信に使うパイプ用のread()/write()
● それ以外は禁止
ブラウザの構成
● 親プロセス(SandboxBrowser)が子プロセス(SandboxBrowserChildProcess)を起動する
● 子プロセスは親プロセスのtabWidgetの中に,QX11EmbedWidgetを使って埋め込む
● 子プロセスの起動はQProcessを使う. 要するに完全に外部のプログラムを起動させる.
おこなったこと● ブラウザの設計 / 作成● straceを利用してどのシステムコールが必要かの調査
● seccompを利用したシステムコール制限● rlimitによるリソース制限● 本当に一つの子プロセスが暴走しても大丈夫かテストコードの作成
● 集大成