$30 off During Our Annual Pro Sale. View Details »

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

Ren Kimura
August 10, 2016

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

seccamp16 tutor

Ren Kimura

August 10, 2016
Tweet

More Decks by Ren Kimura

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. Motivation
    ● デバイスドライバのバグ増加
    ● プラットフォームの多様化
    ● 環境依存なコード
    ● プロプライエタリなドライバ
    LDV Project: number of fixed bugs in Linux kernel
    sybsystems

    View Slide

  4. 1. ソフトウェアテストの
    自動化手法と問題点

    View Slide

  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]

    View Slide

  6. F. Yamaguchi et al, “Modeling and discovering vulnerabilities with code property graphs” [IEE14]

    View Slide

  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]

    View Slide

  8. 既存のソフトウェアテスト自動化技術の多くは
    ユーザーアプリケーションを対象としている
    デバイスドライバなどのカーネルソフトウェア開発でも利用したい。
    VMMやコンパイラといった基盤技術をもっとうまく活用できないか?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  13. View Slide

  14. angr meets kernel
    ● カーネルモジュールを読むためのローダーを書く必要がある
    ○ 実際にやった人がいました -> Stanislas Lejay “ANGRY MODULE EXCAVATION” [ LSE16 ]
    ● 長所
    ○ ローダーで読み込んでユーザー空間で動作するため高速
    ● 短所
    ○ エミュレーションしていないためセマンティクギャップが大きい
    ■ 解決できないシンボル
    ■ 実行時まで分からない値 … etc
    それなりに簡単な構造のドライバなら解析できる

    View Slide

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

    View Slide

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

    View Slide

  17. ● ゲストOSをエミュレーションで動かしながらドライバをテストしたい
    ○ これならセマンティックギャップが少なく、必要な値はテスト時に全て分かる
    ○ ただしパフォーマンスが落ちる
    ● パフォーマンス維持のため、ドライバ実行時のみテストを行いたい
    ○ VMI (Virtual Machine Introspection) によりゲストOSからドライバの情報を取得
    ○ ドライバ関数のアドレスを実行している時のみテスト用のフックを実行する

    View Slide

  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

    View Slide

  19. AFL meets kernel
    Triforce AFL (ncc group ‘16)
    ● AFL (American Fuzzy Lop) をLinuxカーネル上で動かせるようにした物
    ● ゲスト内でエージェントサーバーが動作して、ファジングを行う
    ● QEMUに独自の命令を追加してファジング部分の指定などをゲストOSから行う
    ○ アーキテクチャ非依存
    ○ プラットフォーム非依存
    paperはまだ発表されていない

    View Slide

  20. Sum up
    ● カーネルソフトウェアテスト自動化は前途多難
    ● しかしまだ多くの改善点を残している
    ● 今後増え続けるシステムソフトウェア開発の効率化
    ● 多くの基盤技術を動員して対処すべし

    View Slide