解析基盤技術を用いた効率的なソフトウェアテスト

194b192123e0671dc9f81647d61411a6?s=47 Ren Kimura
August 10, 2016

 解析基盤技術を用いた効率的なソフトウェアテスト

seccamp16 tutor

194b192123e0671dc9f81647d61411a6?s=128

Ren Kimura

August 10, 2016
Tweet

Transcript

  1. 解析基盤技術を用いた 効率的なソフトウェアテスト @RKX1209 セキュリティキャンプ全国大会 2016

  2. Program 1. ソフトウェアテストの自動化手法と問題点 自動ソフトウェアテストの各手法に対する問題点を、 コードカバレッジ、 再現性、セマンティック問題 といった観点から見ていく。 2. カーネルソフトウェアテスト自動化の課題 デバイスドライバやファイルシステムといった

    カーネルソフトウェア に対するテスト自動化の課題と 実現可能性について見ていく。
  3. Motivation • デバイスドライバのバグ増加 • プラットフォームの多様化 • 環境依存なコード • プロプライエタリなドライバ LDV

    Project: number of fixed bugs in Linux kernel sybsystems
  4. 1. ソフトウェアテストの 自動化手法と問題点

  5. ソフトウェアテスト自動化手法 ❏ 静的解析 ( Static Analysis ) 対象プログラムを動作させずに解析、テストを行う ❏ Control-flow

    Recovery バイナリの命令列から basic blockとflowを復元する技術。 L. Xu et al, “Constructing Precise Control Flow Graphs from Binaries.” [Davis09] ❏ Flow, Data Modeling Detection 復元されたflowの特徴からバグ、脆弱性を検出する技術。既知の脆弱性のみ検出可能。 F. Yamaguchi et al, “Modeling and discovering vulnerabilities with code property graphs” [IEE14]
  6. F. Yamaguchi et al, “Modeling and discovering vulnerabilities with code

    property graphs” [IEE14]
  7. ソフトウェアテスト自動化手法 ❏ 動的解析 ( Dynamic Analysis ) 対象プログラムに入力データを与え、実際に動作させながら解析、テストを行う ❏ Coverage-based

    Fuzzing コードカバレッジの高い入力データを生成、利用する Fuzzing。 AFLやsyzkallerなどがある。 Charlie Miller, “Fuzzing with Code Coverage By Example” [ToorCon07] ❏ Conclic testing, Under-constrained symbolic execution コードの分岐条件制約とした 充足可能性問題を解き実行経路を検出する。 この際、一部を実行して具体的な値を利用する事で計算量爆発に対処する。 Koushik Sen et al, “CUTE: A Concolic Unit Testing Engine for C” [ESEC13] D.A. Ramos et al, “Under-Constrained Symbolic Execution: Correctness...” [USENIX15]
  8. 既存のソフトウェアテスト自動化技術の多くは ユーザーアプリケーションを対象としている デバイスドライバなどのカーネルソフトウェア開発でも利用したい。 VMMやコンパイラといった基盤技術をもっとうまく活用できないか?

  9. 2. カーネルソフトウェアテスト 自動化の課題

  10. ANGR Shellphishによって開発されてい るバイナリ解析フレームワーク

  11. ANGR Shellphishによって開発されてい るバイナリ解析フレームワーク

  12. angrをドライバ解析に使用する事はできるか? “Apparently it doesn't like kernel modules, you need to

    write a custom loader” --Gaby Stanislas Lejay “ANGRY MODULE EXCAVATION” [ LSE16 ] angr meets kernel
  13. None
  14. angr meets kernel • カーネルモジュールを読むためのローダーを書く必要がある ◦ 実際にやった人がいました -> Stanislas Lejay

    “ANGRY MODULE EXCAVATION” [ LSE16 ] • 長所 ◦ ローダーで読み込んでユーザー空間で動作するため高速 • 短所 ◦ エミュレーションしていないためセマンティクギャップが大きい ▪ 解決できないシンボル ▪ 実行時まで分からない値 … etc それなりに簡単な構造のドライバなら解析できる
  15. Stanislas Lejay “ANGRY MODULE EXCAVATION” [ LSE16 ]

  16. Stanislas Lejay “ANGRY MODULE EXCAVATION” [ LSE16 ]

  17. • ゲストOSをエミュレーションで動かしながらドライバをテストしたい ◦ これならセマンティックギャップが少なく、必要な値はテスト時に全て分かる ◦ ただしパフォーマンスが落ちる • パフォーマンス維持のため、ドライバ実行時のみテストを行いたい ◦ VMI

    (Virtual Machine Introspection) によりゲストOSからドライバの情報を取得 ◦ ドライバ関数のアドレスを実行している時のみテスト用のフックを実行する
  18. Valgrind meets kernel kValgrind(+ debugger)の開発(未踏’16 後藤PM, 木村PJ) • Valgrindというソフトウェアテストツールをカーネルモジュールに対応させる •

    QEMUによりゲストOSをエミュレーション ◦ TCGという中間表現にフックコードを挿入 • ゲスト内にエージェントを配置して VMIを行うことで情報取得 ◦ Qemu guest agentを改造してゲストカーネルモジュールの情報取得を行う QMPを追加 ◦ ゲストはvirtioを通してホストに情報を送信 デバイスドライバのUAF (Use After Free)検知まではできるようになりました https://www.ipa.go.jp/jinzai/mitou/2016/gaiyou_g-1.html
  19. AFL meets kernel Triforce AFL (ncc group ‘16) • AFL

    (American Fuzzy Lop) をLinuxカーネル上で動かせるようにした物 • ゲスト内でエージェントサーバーが動作して、ファジングを行う • QEMUに独自の命令を追加してファジング部分の指定などをゲストOSから行う ◦ アーキテクチャ非依存 ◦ プラットフォーム非依存 paperはまだ発表されていない
  20. Sum up • カーネルソフトウェアテスト自動化は前途多難 • しかしまだ多くの改善点を残している • 今後増え続けるシステムソフトウェア開発の効率化 • 多くの基盤技術を動員して対処すべし