スライド 1

Similar documents
bhj_2008_FFR_EXCALOC.pdf

PowerPoint プレゼンテーション

スライド 1

スライド 1

10-vm1.ppt

Microsoft PowerPoint - OS07.pptx

NetworkVantage 9

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

24th Embarcadero Developer Camp

MMUなしプロセッサ用Linuxの共有ライブラリ機構

Microsoft PowerPoint - 09.pptx

PowerPoint プレゼンテーション

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Prog1_10th

memo

Microsoft Word - 中間試験 その1_解答例.doc

slide5.pptx

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft PowerPoint - kougi7.ppt

プログラミングI第10回

スライド 1

21 章のお話

Microsoft PowerPoint - 11.pptx

DT-900/910/930 アプリケーション作成上の注意点

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - C++_第1回.pptx

スライド 1

02: 変数と標準入出力

04-process_thread_2.ppt

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

本論文では,32bit の Linux OS における C 言語で書かれたプログラムかつ GCC (GNU Compiler Collection) でコンパイルされた Linux ELF (Executable and Linkable Format) 形式 [6] のバイナリに焦点を絞る. 1

PowerPoint プレゼンテーション

第1回 プログラミング演習3 センサーアプリケーション

memo

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

Microsoft PowerPoint ppt

Insert your Title here

情報処理Ⅰ演習

第2回

02: 変数と標準入出力

02: 変数と標準入出力

AquesTalk for WinCE プログラミングガイド

プログラミングI第6回

未知コンピュータウイルスを駆除するUSBフラッシュメモリの開発

AquesTalk プログラミングガイド

ex05_2012.pptx

Microsoft PowerPoint - 6.pptx

Microsoft PowerPoint - lec10.ppt

CプログラミングI

<4D F736F F D20B6BCB5D7B2CCDED7D8CFC6ADB1D9315F43532E444F43>

PowerPoint プレゼンテーション

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

02: 変数と標準入出力

AquesTalk Win Manual

マニュアル訂正連絡票

Microsoft PowerPoint ppt

ユーティリティ 管理番号 内容 対象バージョン 157 管理情報バッチ登録コマンド (utliupdt) のメッセージ出力に対し リダイレクトまたはパイプを使用すると メッセージが途中までしか出 力されないことがある 267 転送集計コマンド (utllogcnt) でファイル ID とホスト名の組

02: 変数と標準入出力

02: 変数と標準入出力

TFTP serverの実装

プログラミング実習I

02: 変数と標準入出力

XIMERA(Ver1

02: 変数と標準入出力

Intel Memory Protection Extensions(Intel MPX) x86, x CPU skylake 2015 Intel Software Development Emulator 本資料に登場する Intel は Intel Corp. の登録

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

メモリ管理

AquesTalk Mac マニュアル

Microsoft PowerPoint pptx

02: 変数と標準入出力

Taro-ポインタ変数Ⅰ(公開版).j

<4D F736F F D208D C8FEE95F18DEC90AC A B D836A B2E646F63>

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

Microsoft PowerPoint ppt

PowerPoint Template

< F2D837C E95CF CF68A4A94C5816A2E6A>

Microsoft PowerPoint - kougi9.ppt

memo

gengo1-11

Microsoft PowerPoint - PLT3.ppt

PowerPoint プレゼンテーション

インテル(R) Visual Fortran コンパイラ 10.0

ファイル操作-バイナリファイル

テスト

講習No.12

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

Microsoft PowerPoint - ep_cpp04.ppt

Microsoft Word - Cプログラミング演習(12)

Microsoft PowerPoint - 06.pptx

POSIXプログラミング Pthreads編

Microsoft Word - Cプログラミング演習(10)

CodeRecorderでカバレッジ

演算増幅器

Microsoft PowerPoint ppt

スライド 1

AquesTalk2 Mac マニュアル

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

スライド 1

デジタル表現論・第6回

Transcription:

1 FFR EXCALOC - コンパイラのセキュリティ機能に基づいた Exploitability の数値化 - 株式会社フォティーンフォティ技術研究所 http://www.fourteenforty.jp シニアソフトウェアエンジニア石山智祥

2 はじめに 最近のコンパイラには セキュリティを強化する機能が追加されている しかし 市場に流通しているソフトウェアには コンパイラのセキュリティ機能が利用されていないケースが多い そのため 従来の手法で Exploit 可能となる脆弱性が多く発見されている 今回 実行ファイルを解析し適用されているセキュリティ機能を検出し Exploitability を数値化することに挑戦

3 Agenda 1. コンパイラ, OS の提供するセキュリティ機能と実装 2. Exploitability 計算のための特徴パラメータ検出 3. FFR EXCALOC を用いた Exploitability の数値化 4. 今後の課題

4 1. コンパイラ, OS の提供するセキュリティ機能と実装

Visual C++ (2005 以降 ) /GS オプション - Canary を使用したローカルバッファのオーバーフロー検出 - Visual Studio.NET では回避方法が存在したが 2005 で改良された 最適化によるセキュリティを考慮したスタックレイアウト - ポインタ変数やポインタ引数をレジスタを使用するように最適化 - これにより ポインタを経由したメモリ上へのデータ書き込みを防ぐ 5

Visual C++ /GS 関数リターン時に Canary が書き換えられているか確認し オーバーフローを検出 スタックの成長方向 引数リターンアドレス Saved EBP 書き換え! ローカル変数 (int a, char c) ローカルバッファ (char buf[]) 引数リターンアドレス Saved EBP Canary 書き換え検出! ローカル変数 (int a, char c) ローカルバッファ (char buf[]) ローカルバッファの書き込み方向 6

7 Visual C++ /GS int vuln(char *arg) { char buf[128]; Canary(cookie) を設定 } strcpy(buf, arg); printf("buf = %s n", buf); return 0; Canary(cookie) を確認

Visual C++ 最適化による Stack Layout ローカルバッファの後ろに存在するローカルポインタをレジスタを使用し スタック上に領域を設けない ポインタを渡す引数をレジスタでの引数として渡す スタックの成長方向引数 (char *arg2) 引数 (int arg1) リターンアドレス Saved EBP ローカル変数 (int a, char c) 引数 (int arg1) リターンアドレス Saved EBP ローカル変数 (int a, char c) ローカルバッファ (char buf[]) ローカルポインタ (char *p) ローカルバッファ (char buf[]) ローカルバッファの書き込み方向 8

9 Visual C++ 最適化による Stack Layout void vuln(char *s, int l) { char *a; char buf[32]; a = buf; while (*s!= ' 0') { *a++ = *s++ + 1; } printf("buf = %s n", buf); ポインタ引数がレジスタ渡し ローカル変数をレジスタで使用 return ; }

SSP (Stack Smashing Protector) スタックオーバーフローを検出し 任意コードの実行を抑制 - IBM 江藤氏が考案したProPolice(*1) の再実装 - GCC 4.1より正式に組み込まれている - Canaryを使用したオーバーフローチェック - Ideal Stack Layoutによるポインタ変数 ポインタ引数の保護 *1 http://www.trl.ibm.com/projects/security/ssp/main.html 10

11 SSP - Canary - void vuln(char *s, int l) { int len; char buf[32]; len = strlen(s); printf("length = %d, %d n", len, l); Canary を設定 } strcpy(buf, s); return ; Canary を確認

SSP - Ideal Stack Layout - ローカルバッファの後ろにローカルポインタが存在しないようにレイアウト ポインタを渡す引数は 一度ローカル変数にコピーしてから使用する スタックの成長方向引数 (char *arg2) 引数 (int arg1) リターンアドレス Saved EBP ローカル変数 (int a, char c) ローカルポインタ (char *p) ローカルバッファ (char buf[]) 引数 (char* arg2) Not use 引数 (int arg1) リターンアドレス Saved EBP ローカル変数 (int a, char c) ローカルバッファ (char buf[]) ローカルポインタ (char *p) コピーした引数 (char *arg2) ローカルバッファの書き込み方向 12

13 SSP - Ideal Stack Layout - void vuln(char *s, int l) { int len; char buf[32]; len = strlen(s); printf("length = %d, %d n", len, l); strcpy(buf, s); 引数 arg_0 を src に代入 return ; }

SafeSEH 実行可能な例外ハンドラをあらかじめテーブルに設定しておくことで 例外ハンドラを経由した任意コードの実行を防ぐ - Windows XP SP2 から実装 - 例外が発生した際に KiUserExceptionDispatcher(ntdll.dll) 内で 例外ハンドラテーブルをチェック - 例外ハンドラテーブルに含まれているハンドラであれば実行 14

15 例外ハンドラテーブル (SEHandlerTable) 実行ファイルの LOAD_CONFIG データディレクトリに存在 LOAD_CONFIGデータディレクトリ 0x00 0x48( サイズ ). 0x40 SEHandlerTableへのアドレス 0x44 SEHandlerCount( エントリ数 ) SEHandlerTable 0x0000XXXX...

16 例外ハンドラテーブル (SEHandlerTable) SEHandlerTable のチェック SEHandlerTable を確認 例外ハンドラ実行

Heap Management (Windows(HeapAlloc/HeapFree)) Windows の提供する Heap Manager - HeapCreate を使用することで Heap Manager を分けることが可能 - 実装は ntdll.dll 内の RtlAllocateHeap/RtlFreeHeap - FreeList で DoubleLinkedList を使用 - Windows XP SP2 以降では バウンダリチェックや Safe Unlink といったセキュリティ機能が実装されている 17

18 Heap Management (Windows(HeapAlloc/HeapFree)) HEAP Segments[] FreeList[] HEAP_ENTRY サイズ前領域のサイズ ユーザ使用領域 HEAP_SEGMENT Signature(0xFFEEFFEE) HEAPへのアドレス FirstEntryへのアドレス

19 Heap Management (Windows(HeapAlloc/HeapFree)) HEAP_SEGMENT Signature(0xFFEEFFEE) HEAPへのアドレス FirstEntryへのアドレス HEAP_ENTRY サイズ前領域のサイズ ユーザ使用領域サイズ前領域のサイズ ユーザ使用領域

20 Heap Management (Windows(HeapAlloc/HeapFree)) HEAP FreeList Segments[] FreeList[0] FreeBlockの先頭 FreeBlockの最後 FreeBlock FreeBlock FreeList[] FreeList[n] FreeBlockの先頭 FreeBlockの最後 FreeBlock FreeBlock サイズ 前領域のサイズ 次の FreeBlock のアドレス前の FreeBlock のアドレス ユーザが使用していた領域

Heap Management (Borland Compiler (malloc/free)) Borland C++ Compiler(BCC32) での Heap Manager - VirtualAllocで確保した領域を独自のHeap Managerで管理 - 要求サイズが0x100000 以上の場合はVirtualAllocでメモリ確保 - FreeListでDoubleLinkedListを使用 - バウンダリチェック等のセキュリティ機能は実装されていない 21

22 Heap Management (Borland Compiler (malloc/free)) Heap Manager Heapヘッダへのアドレス FreeListのサイズ FreeListのアドレス確保領域のアドレス未使用領域のアドレス Heap Heapヘッダ FreeList 確保領域 未使用領域

23 Heap Management (Borland Compiler (malloc/free)) HeapHeaderへのアドレス FreeListのサイズ FreeListのアドレス確保領域のアドレス未使用領域のアドレス 割り当てサイズ (4byte) ユーザ使用領域割り当てサイズ (4byte) ユーザ使用領域 Heapヘッダ FreeList 確保領域未使用領域 残割り当て可能サイズ HeapManager へのアドレス HeapManager へのアドレス

24 Heap Management (Borland Compiler (malloc/free)) Heap ヘッダ FreeList[0] FreeBlock の先頭 FreeBlock FreeBlock FreeList FreeList[1] FreeBlockの最後 FreeBlockの先頭 FreeBlock FreeBlock FreeBlock の最後 確保領域 未使用領域 ユーザが使用していた領域 割り当てサイズ (4byte) FreeBlock のアドレス FreeBlock のアドレス 領域サイズ

25 Heap Management (Borland Compiler (malloc/free)) malloc 実行時 (FreeList から確保 ) FreeList のつなぎ換え

26 Heap Management (Borland Compiler (malloc/free)) malloc 実行時 ( 未使用領域から確保 ) 未使用領域から確保

27 Heap Management (Borland Compiler (malloc/free)) free 実行時 FreeList への追加

Heap Management (Delphi (GetMem/FreeMem)) Borland Delphi の GetMem, FreeMem にて使用する Heap Manager - 要求サイズごとに確保されたメモリブロックから割り当てる - 要求サイズごとに メモリブロックの管理を行うHeap Headerが存在 - FreeListではSingle Linked Listを使用 - セキュリティ機能は実装されていない 28

29 Heap Management (Delphi (GetMem/FreeMem)) Heap Header オフセットテーブル Heap Header[0] のオフセット Heap Header[1] のオフセット 要求サイズを元に 対応するオフセットを取得 Heap Header HeapHeader[0] HeapHeader[1] HeapHeader[2]

30 Heap Management (Delphi (GetMem/FreeMem)) HeapHeader[0] HeapHeader[1] HeapHeader[2] HeapHeader 要求サイズ 未使用領域のアドレス Heap 領域のアドレス Heap 領域のサイズ Heap HeapHeaderのアドレス FreeList 確保数ユーザ使用領域 未使用領域

31 Heap Management (Delphi (GetMem/FreeMem)) Heap HeapHeaderのアドレス FreeList 確保数ユーザ使用領域 Heapの先頭アドレスユーザ使用領域 Heapの先頭アドレスユーザ使用領域 未使用領域 Heap の先頭アドレス ユーザ使用領域

32 Heap Management (Delphi (GetMem/FreeMem)) Heap HeapHeaderのアドレス FreeList 確保数ユーザ使用領域 FreeBlockへのアドレスユーザ使用領域 FreeBlockへのアドレスユーザ使用領域 未使用領域 0x00000000 ユーザ使用領域

33 Heap Management (Delphi (GetMem/FreeMem)) GetMem 実行時 (FreeList から確保 ) オフセットテーブルから HeapHeader を取得 FreeList から確保メモリを取得

34 Heap Management (Delphi (GetMem/FreeMem)) GetMem 実行時 ( 未使用領域から確保 ) 未使用領域からメモリ確保

35 Heap Management (Delphi (GetMem/FreeMem)) FreeMem 実行時 FreeList の先端に開放アドレスを追加

36 2. Exploitability 計算のための特徴パラメータ検出

任意コード実行が可能となりえる要素 ローカルバッファ ( スタックオーバーフロー ) - スタック上に確保されたバッファ領域がオーバーフロー - オーバーフローにより リターンアドレス等が書き換えられ任意コード実行が行われる ヒープバッファ ( ヒープオーバーフロー ) - ヒープに確保されたバッファがオーバーフロー - オーバーフローにより ヒープを管理するリスト構造が破壊され任意のアドレス上のコードが実行される 37

スタック上のローカル変数 ローカル変数の特徴 - EBP 経由で参照されるローカル変数は [EBP-X] というオフセットでアクセスされる (EBP より下位の位置に配置される ) - ローカル変数を最初に使用する箇所では ローカル変数に値を設定する処理が多い (Dst operand に指定される ) 38

39 スタック上のローカル変数 [EBP-X] の形式でアクセス はじめに値の設定が行われる

ローカルバッファの検出 アセンブラコード上でのローカルバッファの特徴 - 通常の変数とは異なり 最初のアクセス時に Src operand になっている場合がある - LEA 命令にてスタック上のアドレスをレジスタに取得 アドレッシングアクセスを行う - ベースレジスタ + インデックスレジスタの組み合わせで アドレッシングアクセスを行う 40

41 ローカルバッファの検出 [EBP+ インデックスレジスタ ] の形式でアクセス LEA 命令でアドレスを取得 アドレッシングアクセス

ポインタの検出 アセンブラコード上でのポインタの特徴 - 配列のアクセス方法と似ている - アドレッシングアクセスを行っている - 配列との違いは レジスタにアドレスを設定する際に LEA ではなく MOV 命令を使用している - 特定のアドレス領域の値を設定しアクセスを行う場合がある 42

43 ポインタの検出 MOV 命令でアドレスを設定 アドレッシングアクセスを行う

例外ハンドラの検出 アセンブラコード上での例外ハンドラを使用している関数の特徴 - fs:0 の読み込みと書き込みを行っている - fs:0 の値をスタックに PUSH している - fs:0 を PUSH するひとつ前の PUSH 命令のオペランドが例外ハンドラ - コンパイラの種類や 最適化のオプションによっては例外ハンドラ設定関数を使用している場合がある 44

45 例外ハンドラの検出 関数内で例外ハンドラの設定 (VC) 関数内で例外ハンドラの設定 (Delphi) fs:0 を EAX に格納してから PUSH 例外ハンドラ設定関数 (VC) fs のオフセット指定にレジスタを使用 例外ハンドラ設定関数 (BCC) fs:0 の値を更新してリターン fs:0 の値を更新してリターン

Canary の検出 アセンブラコード上での Canary の特徴 - コンパイラによって実装が異なるが大きな流れは同じ - 関数のはじめで 特定の値を設定している - 関数の最後で 値のチェック処理を行っている - 関数の最後のチェック処理は別関数の可能性がある - コンパイラごとに検出処理を分ける必要もある 46

SafeSEH の検出 SafeSEH が有効になっているバイナリファイルの特徴 - PE ヘッダの DataDirectory に LOAD_CONFIG ディレクトリが存在する - LOAD_CONFIG ディレクトリのフォーマットが特定のフォーマットになっている 47

Heap Manager の検出 使用している Heap Manager を検出 - 独自実装の Heap Manager を検出するのは困難 - Import Table から使用している API を列挙し メモリ確保系の API の使用頻度から利用している Heap Manager を判断 48

使用しているコンパイラの検出 DOS ヘッダから PE ヘッダへのオフセットの値 - DOS ヘッダから PE ヘッダのオフセットの値は コンパイラによって異なる - DOS ヘッダから PE ヘッダのオフセット値は コンパイラが同じであれば同じになる可能性が高い DOS プログラムとして起動した際に実行されるコード - DOS プログラムとして起動した際に実行されるコードでは コンパイラによって実行コードに違いがある これ以外にもいくつか検出方法が存在 49

50 使用しているコンパイラの検出 Visual C++ BCC32 GCC Delphi

51 3. FFR EXCALOC を用いた Exploitability の数値化

FFR EXCALOC 動作環境 - IDA Pro Version 5.2 のプラグイン - 対象フォーマットはPEファイル - 現時点では 静的解析のみで特徴パラメータの抽出を行う 開発環境 - Windows XP SP2 - Visual Studio 2008 52

特徴パラメータの検出 PE ファイル全体に影響するパラメータ - 使用しているコンパイラ - Heap Manager - SafeSEHの有効 / 無効 - 適用されているセキュリティ機能 関数単位で影響するパラメータ - 関数内のローカルバッファの検出 - 関数内のポインタの検出 - 関数内の例外ハンドラの検出 53

54 特徴パラメータの抽出例 (1) ブラウザソフト I Compiler Type Stack Protection Safe SEH Heap Manager Visual C++ /GS あり Windows Heap Manager アドレス サイズ 参照数 配列 ポインタ 例外ハンドラ 0x00401609 0x88 0x02 なし あり なし 0x00401887 0x14D 0x01 あり あり あり 0x00401DE4 0x2AB 0x01 あり あり なし

55 特徴パラメータの抽出例 (2) グラフィックソフト H Compiler Type Stack Protection Safe SEH Heap Manager Visual C++ なしなしなし アドレス サイズ 参照数 配列 ポインタ 例外ハンドラ 0x00401000 0xDC 0x01 あり なし あり 0x004010DC 0x08 0x01 なし なし なし 0x004010F0 0x59 0x01 なし なし あり

56 特徴パラメータの抽出例 (3) サーバソフト T Compiler Type Stack Protection Safe SEH Heap Manager Borland Delphi なしなし Delphi Heap Manager アドレス サイズ 参照数 配列 ポインタ 例外ハンドラ 0x0040114D 0x1CF 0x01 あり なし なし 0x00403AEA 0x105 0x06 あり なし なし 0x00403EEC 0x62 0x03 なし なし なし

57 Exploitability 計算 基準値 ( 関数単位で計算 ) 基準値 = 関数のサイズ 関数の参照数 抽出したパラメータを考慮した値 基準値 A B C A B C 配列の有無によるパラメータ Canary の有無により重み付けを変化 ( 配列なし = 1, 配列ありかつ Canary あり = 1, その他 = 2) ポインタの有無によるパラメータ Heap Manager の種類により重み付けを変化 (Windows = 1, Borland C++ = 2, Delphi = 2) 例外ハンドラの有無によるパラメータ SafeSEH の有無により変化 ( 例外なし = 1, 例外あり SafeSEH あり = 1, 例外あり SafeSEH なし = 2)

Exploitability 計算 実行ファイルの Exploitability 計算 Exploitability = パラメータ考慮値の和 / 基準値の和 - 関数単位に計算した値をすべて合計 - それぞれの合計値を割り算 - 数値が大きいほど Exploitability が高い 58

59 Exploitability 計算結果 先ほどの特徴パラメータを抽出したアプリケーション (+α ) の計算結果

60 4. 今後の課題

より正確な Exploitability を計算するために より正確な要素の検出 - 配列と構造体の区別 - 関数ポインタの検出 - 動的解析を併用した Exploitability の計算 - 対象アプリケーションをデバッガで起動させ 実行コードの流れから Exploitability 計算に必要な要素を検出する 関数のパラメータ ヒープバッファ 61

ありがとうございました 株式会社フォティーンフォティ技術研究所 http://www.fourteenforty.jp シニアソフトウェアエンジニア石山智祥 <ishiyama@fourteenforty.jp> 62