Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

ソフトウェアテスト自動化手法 ❏ 静的解析 ( 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]

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

ソフトウェアテスト自動化手法 ❏ 動的解析 ( 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]

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Stanislas Lejay “ANGRY MODULE EXCAVATION” [ LSE16 ]

Slide 16

Slide 16 text

Stanislas Lejay “ANGRY MODULE EXCAVATION” [ LSE16 ]

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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