Monthly Research 固定アドレスのポインタによ...

12
1 Monthly Research 固定アドレスのポインタによるASLRバイパスの理解 株式会社FFRI http://www.ffri.jp Ver 2.00.01

Transcript of Monthly Research 固定アドレスのポインタによ...

Page 1: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

1

Monthly Research

固定アドレスのポインタによるASLRバイパスの理解

株式会社FFRIhttp://www.ffri.jp

Ver 2.00.01

Page 2: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

• マイクロソフトが2013年8月に公開したセキュリティパッチ

• ASLRセキュリティ機能のバイパスの脆弱性(CVE-2013-2556)の対策を含む

• 今回は、この脆弱性の問題点と、パッチによる変更点を調査

MS13-063

2

Page 3: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

• CanSecWest2013で発表された脆弱性

– この脆弱性だけで攻撃が成立するわけではない(他の脆弱性と組み合わせる)

– この問題により、特定の脆弱性があった場合に、ASLRをバイパスして攻撃可能

ASLRバイパスの脆弱性(CVE-2013-2556)概要

3

Page 4: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

• この脆弱性は「DEP/ASLR bypass without ROP/JIT」というタイトルでCanSecWest2013にて、Yang Yu氏により発表された

• 大きく二つの問題について発表– 32bit版Windowsにて、KiFastSystemCallへのポインタが固定アドレスに存在する

– 64bit版Windows上の32bitプロセスにて、LdrHotPatchRoutineへのポインタが固定アドレスに存在する

なぜ、これらの固定アドレスが問題なのか

Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトのvtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

vtableポインタが書き換えられるとは?

CanSecWest2013での発表内容

4

Page 5: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

• 一般的なC++の実装による、オブジェクトのレイアウト

• メンバ関数の呼び出し方

前提知識:C++のオブジェクトレイアウト

5

vtableへのポインタ

// メンバ関数が”virtual”であることに注意class MyClass {public:

MyClass();virtual ~MyClass();virtual void doWork();

private:int m_myVariable;

};

インスタンス化

m_myVariable~MyClass()へのポインタ

doWork()へのポインタ

MyClassオブジェクト

// doWork()を呼び出す場合のコード// ecxにMyClassオブジェクトのアドレスがセットされているmov eax,dword ptr [ecx] // eaxにvtableのアドレスpush ecx // 関数呼び出しの引数(*)call dword ptr [eax+4] // doWork()呼び出し(vtableよりアドレス取得)

* 呼び出し規約がcdeclの場合、第一引数にthisポインタを渡す

MyClassクラスのvtable

Page 6: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

• オブジェクトのvtableへのポインタが書き換わるとどうなるか?

vtableの書き換えの問題

6

vtableへのポインタ

m_myVariable ~MyClass()へのポインタ

doWork()へのポインタ

MyClassオブジェクトMyClassクラスのvtable

書き換える

Value in memory 1

Value in memory 2

メモリ上のどこか別の場所

???

//前スライドと同じコード//vtableへのポインタを書き換えると、実行される関数が変わるmov eax,dword ptr [ecx] // eaxにvtableのアドレスpush ecx // 関数呼び出しの引数call dword ptr [eax+4] // Value in memory 2が指す場所を実行する

Page 7: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

• オブジェクトのvtableの位置をKiFastSystemCallを呼び出すように上書き

• KiFastSystemCallはWindowsが利用するシステムコール呼び出しの共通コード

• ASLRは特に意味をなさない

固定アドレスにKiFastSystemCallへのポインタがある場合

7

vtableへのポインタ

m_myVariable~MyClass()へのポインタ

doWork()へのポインタ

MyClassオブジェクトMyClassクラスのvtable脆弱性(use-after-free /

heap overflow)を利用し固定値で書き換える

Value in memory 1

KiFastSystemCallへのポインタ

Fixed address

KiFastSystemCall

KiFastSystemCallが呼び出されるただし、引数を取るシステムコールを攻撃者が意図したとおりに呼び出すのは難しい

mov eax,dword ptr [ecx] // eaxにvtableのアドレスpush ecx // KiFastSystemCallの引数call dword ptr [eax+4] // KiFastSystemCallを呼び出す

Page 8: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

• 64bit WindowsにはKiFastSystemCallへのポインタが固定位置に存在しない

• ただし、64bit Windows上の32bitプロセスには、LdrHotPatchRoutineへのポインタが固定位置に存在する

• LdrHotPatchRoutineは内部で引数に渡されたDLLをロードする

• LdrHotPatchRoutineへのポインタはSharedUserData内のデータとしてすべての64bit Windows上の32bitプロセスプロセスに存在

• SharedUserDataは固定アドレス(0x7ffe0000)に存在

LdrHotPatchRoutineへのポインタをvtableが含むようにC++オブジェクトを上書き

DLLのロードが可能

LdrHotPatchRoutineの利用

8

0x7ffe0000

(固定アドレス)

SharedUserData

LdrHotPatchRoutineへのポインタ

LdrHotPatchRoutine

struct HotPatchBuffer{…USHORT PatcherNameOffset; // ロードするDLL名へのオフセットUSHORT PatcherNameLen; // ロードするDLL名の長さ…

};void LdrHotPatchRoutine( struct *HotPatchBuffer);

Page 9: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

• オブジェクトのvtableの位置をLdrHotPatchRoutineを呼び出すように上書き

固定アドレスにLdrHotPatchRoutineへのポインタがある場合

9

vtableへのポインタ

この部分をHotPatchBuffer構造体として構築

~MyClass()へのポインタ

doWork()へのポインタ

MyClassオブジェクト

mov eax,dword ptr [ecx] // ecxにvtableのアドレスpush ecx // オブジェクトアドレスをLdrHotPatchRoutineの引数とするcall dword ptr [eax+4] // LdrHotPatchRoutineを呼び出す

MyClassクラスのvtable脆弱性を利用し書き換える

Value in memory 1

LdrHotPatchRoutineへのポインタ

Fixed address

LdrHotPatchRoutine

• LdrHotPatchRoutineへの引数(DLL名など)を¥¥192.168.1.100¥share¥hoge.dllなどとすることでサーバー上のDLLをロード可能

• オブジェクトはvtableへのポインタの書き換え時に任意の値に上書き可能であることに注意

Page 10: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

• MS13-063では、LdrHotPatchRoutineのアドレスが固定アドレスに保存されないように修正

– SharedUserData内から、関数テーブルを削除

– ntdll.dllのデータセクションに移し、LdrSystemDllInitBlockとしてエクスポート

• ntdll.dllはASLRが有効なモジュールであるため、この関数テーブルもアドレスが固定されない

ASLRをバイパスし、LdrHotPatchRoutineを利用したDLLのロードはできない

MS13-063による変更点

10

LdrHotPatchRoutineへのポインタ

ランダマイズ

Page 11: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

参考資料

• http://technet.microsoft.com/ja-jp/security/bulletin/ms13-063

• http://cansecwest.com/slides/2013/DEP-ASLR%20bypass%20without%20ROP-JIT.pdf

• http://blogs.technet.com/b/srd/archive/2013/08/12/mitigating-the-ldrhotpatchroutine-dep-aslr-bypass-with-ms13-063.aspx

• http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-2556

11

Page 12: Monthly Research 固定アドレスのポインタによ …...Use-after-freeまたは、ヒープオーバーフローにより、C++オブジェクトの vtableポインタの書き換えが起きる場合にASLRをバイパスして攻撃可能

FFRI,Inc.

Contact Information

E-Mail : [email protected]

Twitter: @FFRI_Research

12