Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

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

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 44 Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Publicité

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

Plus récents (20)

Publicité

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

  1. 1. サンドボックス化によるセキュアなプログラミン グ 2014年度 システムソフトウェアゼミ 盧 亦愷 https://github.com/luyikei/
  2. 2. Qt アプリケーションをもっとセキュアにした い! 応募した理由
  3. 3. 事前学習 ● Tcpdump のソースコードを読んだ  ・chroot や setuid を使用していた。  ・cap-ng を使用し(できるなら)、特権を禁止していた。 ● OpenSSH のソースコードを読んだ ・プロセスを分割し、分割した先で、  ・OS によって違う手法を使っており、 OS別に 異なるファイルにサンドボックスのコードがあった。  ・基本は手法が違うだけで目的はTcpdumpとほぼ同じ ● パイプと fork() の修行  プロセス分割をするときに必要だから
  4. 4. 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
  5. 5. (直訳) 特権分離 tcpdump(1) ● Otto が書いた: "tcpdump(1) は評判悪い; 実にいくつかの 脆弱性が見つかったのだ. Tcpdump はインターフェース からパケットキャプチャをする以上 root で実行されなく てはならない, なのでこういった脆弱性の影響が非常に 大きくなってしまいます. ● tcpdump が root で実行されるリスクを軽減するために, tcpdump は特権を分離するように改変された. ネット ワークのパケットのパースとプリントは非特権で行われ ます, chroot のプロセスで動いています。
  6. 6. コードを見てみましょう
  7. 7. 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
  8. 8. (直訳) 特権分離 OpenSSH ● 非特権の子プロセスを使用することでプログラ ミングの不具合を含まれても影響を小さくでき る. ● 非特権の子プロセスにバグがあってもシステム の妥協は許さない. ● つまり, ゴールは OpenSSH の特権分離である.
  9. 9. http://www.citi.umich.edu/u/provos/ssh/priv.jpg
  10. 10. 具体的な手法 ●  rlimit プロセスに様々な制限を掛けられる ex ) CPU 時間、ファイルの作成, メモリのヒー プの上限 ●  seccomp, capability システムコールの制限など.....
  11. 11. コードを見てみましょう
  12. 12. 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
  13. 13. 特権分離は他の認証サービスに使用する上での、 サイバーセキュリティを向上する パワフルな原則である。
  14. 14. つまり危険な処理 (リモートのコードを実行する など) をするようなプログラムは 面倒でもサンドボックスをするとよい。
  15. 15. 面倒なのはプラットフォームごとで 手法が異なるためである
  16. 16. つまりサンドボックスとは いいプロセス
  17. 17. つまりサンドボックスとは いいプロセス やられる!
  18. 18. つまりサンドボックスとは 悪いプロセス やられる!
  19. 19. つまりサンドボックスとは 悪いプロセス やる!
  20. 20. つまりサンドボックスとは いいプロセス いい子プロセス
  21. 21. つまりサンドボックスとは いいプロセス いい子プロセス fork()
  22. 22. つまりサンドボックスとは いいプロセス いい子プロセス やられる! パイプ または, Shared memory など
  23. 23. つまりサンドボックスとは いいプロセス 悪い子プロセス やられる!
  24. 24. つまりサンドボックスとは いいプロセス いい子プロセス
  25. 25. つまり何故必要なのか ● 脆弱性を突かれて特権を排除して 攻撃者に好 き勝手させない ● 他のメリットに Chrome はプロセスを分割する ことによって、タブの一つがフリーズしても全 体はフリーズしない!
  26. 26. キャンプでやったこと
  27. 27. まずは Konqueror のプラグイン作 成 ● GenHash プラグイン  MD5 ハッシュを計算するプラグイン ● Pi プラグイン  モンテカルロ法を使用して円周率を計算する  プラグイン
  28. 28. GenHash プラグイン ● 親プロセスがファイルを読みこむ ● 読み込んだデータをパイプで子プロセスに引き 渡す ● 子プロセスは計算するだけ! ● そして計算結果は親プロセスにパイプで渡す
  29. 29. 子プロセスは計算するだけなので... ● prctlのPR_SET_NO_NEW_PRIVSを使って exeve()の禁止 ● seccomp を利用した子プロセスのシステム コールの制限 許可したシステムコール: close(), 親プロセスと の通信に使うパイプ用のread()/write() ● それ以外は禁止
  30. 30. Pi プラグイン ● モンテカルロ法で円周率の計算 ● ループ回数は自由にユーザーが指定できる ● 子プロセスが計算し、結果を親プロセスにパイ プで引き渡す
  31. 31. ループ回数が指定できてしまうので ● rlimit を使用して、子プロセスのCPU 時間を制 限
  32. 32. マルチプロセスアーキテクチャの 独自 webkit ベースのブラウザを作成!
  33. 33. ブラウザの構成 ● 親プロセス(SandboxBrowser)が子プロセス (SandboxBrowserChildProcess)を起動する ● 子プロセスは親プロセスのtabWidgetの中に, QX11EmbedWidgetを使って埋め込む ● 子プロセスの起動はQProcessを使う. 要するに 完全に外部のプログラムを起動させる.
  34. 34. おこなったこと ● ブラウザの設計 / 作成 ● straceを利用してどのシステムコールが必要かの 調査 ● seccompを利用したシステムコール制限 ● rlimitによるリソース制限 ● 本当に一つの子プロセスが暴走しても大丈夫かテ ストコードの作成 ● 集大成
  35. 35. SandboxBadChild プロセス while(true){ if(malloc(1024 * 1024 * 64) == NULL){ break; } }
  36. 36. おまけ ● Qt の闇 文字入力ができない! 救世主の Tab キー!
  37. 37. がしかし直った! (キャンプ後) ● 修正はパッチを Qt に提案 (一昨日)
  38. 38. 謝辞
  39. 39. 物理的におせわになりました ● 講師の忠鉢先生 ● チューターの味噌野さん ● セキュリティ・キャンプに関わったその他の講 師、チューター、事務の方々
  40. 40. 非物理的におせわになりました ● Tcpdump のコード ● OpenSSH のコード ● その他のコード
  41. 41. オープンソースは素晴らしい!
  42. 42. 非物理的におせわになりました Man
  43. 43. $ man man
  44. 44. ありがとうございました

×