サンドボックス化によるセキュアなプログラミング

44
サンドボックス化によるセキュアなプログラミン 2014年度 システムソフトウェアゼミ 盧 亦愷 https://github.com/luyikei/

Upload: yikei-lu

Post on 16-Jul-2015

697 views

Category:

Engineering


3 download

TRANSCRIPT

サンドボックス化によるセキュアなプログラミング

2014 年度 システムソフトウェアゼミ 盧 亦愷https://github.com/luyikei/

Qt アプリケーションをもっとセキュアにしたい!

応募した理由

事前学習● 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 の特権分離である.

http://www.citi.umich.edu/u/provos/ssh/priv.jpg

具体的な手法

●  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

特権分離は他の認証サービスに使用する上での、サイバーセキュリティを向上する

パワフルな原則である。

つまり危険な処理 (リモートのコードを実行するなど) をするようなプログラムは

面倒でもサンドボックスをするとよい。

面倒なのはプラットフォームごとで手法が異なるためである

つまりサンドボックスとは

いいプロセス

つまりサンドボックスとは

いいプロセス やられる!

つまりサンドボックスとは

悪いプロセス やられる!

つまりサンドボックスとは

悪いプロセス やる!

つまりサンドボックスとは

いいプロセスいい子プロセス

つまりサンドボックスとは

いいプロセスいい子プロセス

fork()

つまりサンドボックスとは

いいプロセスいい子プロセス やられる!

パイプまたは, Shared memory など

つまりサンドボックスとは

いいプロセス悪い子プロセス やられる!

つまりサンドボックスとは

いいプロセスいい子プロセス

つまり何故必要なのか

● 脆弱性を突かれて特権を排除して 攻撃者に好き勝手させない

● 他のメリットに Chrome はプロセスを分割することによって、タブの一つがフリーズしても全体はフリーズしない!

キャンプでやったこと

まずは Konqueror のプラグイン作成

● GenHash プラグイン MD5 ハッシュを計算するプラグイン

● Pi プラグイン モンテカルロ法を使用して円周率を計算する プラグイン

GenHash プラグイン

● 親プロセスがファイルを読みこむ● 読み込んだデータをパイプで子プロセスに引き渡す

● 子プロセスは計算するだけ!● そして計算結果は親プロセスにパイプで渡す

子プロセスは計算するだけなので...

● prctlのPR_SET_NO_NEW_PRIVSを使ってexeve()の禁止

● seccomp を利用した子プロセスのシステムコールの制限許可したシステムコール: close(), 親プロセスとの通信に使うパイプ用のread()/write()

● それ以外は禁止

Pi プラグイン

● モンテカルロ法で円周率の計算● ループ回数は自由にユーザーが指定できる● 子プロセスが計算し、結果を親プロセスにパイプで引き渡す

ループ回数が指定できてしまうので

● rlimit を使用して、子プロセスのCPU 時間を制限

マルチプロセスアーキテクチャの 独自 webkit ベースのブラウザを作成!

ブラウザの構成

● 親プロセス(SandboxBrowser)が子プロセス(SandboxBrowserChildProcess)を起動する

● 子プロセスは親プロセスのtabWidgetの中に,QX11EmbedWidgetを使って埋め込む

● 子プロセスの起動はQProcessを使う. 要するに完全に外部のプログラムを起動させる.

おこなったこと● ブラウザの設計 / 作成● straceを利用してどのシステムコールが必要かの調査

● seccompを利用したシステムコール制限● rlimitによるリソース制限● 本当に一つの子プロセスが暴走しても大丈夫かテストコードの作成

● 集大成

SandboxBadChild プロセス

while(true){

if(malloc(1024 * 1024 * 64) == NULL){

break;

}

}

おまけ

● Qt の闇文字入力ができない!

救世主の Tab キー!

がしかし直った! (キャンプ後)

● 修正はパッチを Qt に提案 (一昨日)

謝辞

物理的におせわになりました

● 講師の忠鉢先生● チューターの味噌野さん● セキュリティ・キャンプに関わったその他の講師、チューター、事務の方々

非物理的におせわになりました

● Tcpdump のコード● OpenSSH のコード● その他のコード

オープンソースは素晴らしい!

非物理的におせわになりました

Man

$ man man

ありがとうございました