Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015

1,516 views

Published on

Stack Smashing Protection(SSP)はエクスプロイトに対する古くからある根本的な防御機構の1つであり、現在多くのコンパイラやオペレーティングシステムがこの機能を提供している。
SSPの提供する機能の1つであるスタックカナリアはスタックバッファの直後に配置された番兵の値が変化していないかを調べることでスタックバッファがオーバーフローしているかどうかを確認することができる。
今まで、スタックカナリアの回避方法としては、番兵の値の確認処理が行われる前にエクスプロイト処理を終わらせてしまうか、番兵の値を漏洩させてからオーバーフローさせるものが主流であったが、本講演では、これらの回避方法とは違うアプローチを取った回避手法を紹介する。

Published in: Software
  • Be the first to comment

Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015

  1. 1. Master Canary Forging 新しいスタックカナリア回避手法の提案
  2. 2. 自己紹介 ● 小池 悠生(こいけ ゆうき) ○ 16歳、学生 ● CTFにハマっていた ○ DEF CON 2014 Finalist ○ CODEGATE Junior 2015 Winner ○ 引退視野
  3. 3. 概要 ● 動機 ● Stack Canary ● これまでの回避手法 ● Master Canary Forging ● 手法の評価と対策
  4. 4. 概要 ● 動機 ● Stack Canary ● これまでの回避手法 ● Master Canary Forging ● 手法の評価と対策
  5. 5. 動機 ● 僕はROPが好き ○ だからStack Based Buffer Overflowが好き ○ だからStack Canaryは嫌い ● Stack Canaryは強い ○ 回避出来る条件を考えるのは価値がある ○ 良い回避方法はないか?
  6. 6. 概要 ● 動機 ● Stack Canary ● これまでの回避手法 ● Master Canary Forging ● 手法の評価と対策
  7. 7. Stack Canary ● BOFによる攻撃を阻止したい ○ return addressが書き換えられたか判定したい ■ されていたらプロセスを殺す ○ 指標を作ればいい ■ BOFの前後で値が変わるようにする
  8. 8. Stack Canary return address frame pointer local variables
  9. 9. ● 指標を追加する Stack Canary return address frame pointer canary 0xdeadbeef local variables
  10. 10. ● BOFが起こると... Stack Canary canary overwritten
  11. 11. ● canaryの値が変わるので、攻撃を検知出来る Stack Canary modified 0x41414141
  12. 12. ● canaryの値が変わるので、攻撃を検知出来る Stack Canary modified 0x41414141 Not 0xdeadbeef Attack Detected
  13. 13. Stack Canary ● BOFによる攻撃を阻止したい ○ return addressが書き換えられたか判定したい ■ されていたらプロセスを殺す ○ 指標を作ればいい ■ BOFの前後で値が変わるようにする
  14. 14. Stack Canary ● BOFによる攻撃を阻止したい ○ return addressが書き換えられたか判定したい ■ されていたらプロセスを殺す ○ 指標を作ればいい ■ BOFの前後で値が変わるようにする ● これ、保証できる??
  15. 15. ● canaryの値が変わらないと検知できない Stack Canary modified 0xdeadbeef
  16. 16. ● canaryの値が変わらないと検知できない Stack Canary modified 0xdeadbeef return address 任意の値に出来る
  17. 17. ● canaryの値が変わらないと検知できない Stack Canary ⇒ACE(任意のコード実行)
  18. 18. Stack Canary ● Stack Canaryの種類 ○ Random ■ 元となる値が分からないようにする ■ プロセスの起動時に値をランダムに決める ○ Terminator ■ ’0’ 等が含まれるようにする ■ 元の値にしづらい
  19. 19. Stack Canary ● master canaryとstack上のcanaryの比較
  20. 20. 概要 ● 動機 ● Stack Canary ● これまでの回避手法 ● Master Canary Forging ● 手法の評価と対策
  21. 21. ● ex1.c 回避手法1: __stack_chk_failを避ける #include <stdio.h> void bof(int (*print)(const char *)) { char buf[16]; scanf("%s", buf); print(buf); } int main(void) { bof(puts); }
  22. 22. ● ex1.c #include <stdio.h> void bof(int (*print)(const char *)) { char buf[16]; scanf("%s", buf); print(buf); } int main(void) { bof(puts); } 回避手法1: __stack_chk_failを避ける return address frame pointer canary local variables arguments
  23. 23. ● ex1.c 回避手法1: __stack_chk_failを避ける overwritten arguments #include <stdio.h> void bof(int (*print)(const char *)) { char buf[16]; scanf("%s", buf); print(buf); } int main(void) { bof(puts); }
  24. 24. ● ex1.c 回避手法1: __stack_chk_failを避ける overwritten arguments #include <stdio.h> void bof(int (*print)(const char *)) { char buf[16]; scanf("%s", buf); print(buf); } int main(void) { bof(puts); } 関数ポインタかつ引数
  25. 25. ● ex2.c 回避手法2: canaryをリークする #include <stdio.h> int main(void) { char buf[16]; scanf("%s", buf); printf(buf); fread(buf, sizeof(char), 32, stdin); }
  26. 26. ● ex2.c 回避手法2: canaryをリークする #include <stdio.h> int main(void) { char buf[16]; scanf("%s", buf); printf(buf); fread(buf, sizeof(char), 32, stdin); } 書式指定子攻撃
  27. 27. 回避手法2: canaryをリークする $ gdb ./ex2 -q (gdb) b 4 Breakpoint 1 at 0x8048532: file ex2.c, line 4. (gdb) r Breakpoint 1, main () at ex2.c:4 4 scanf("%s", buf); (gdb) x/12xw $esp 0xffffce60: 0xffffd129 0x0000002f 0x0804a000 0x080485e2 0xffffce70: 0x00000001 0xffffcf34 0xffffcf3c 0xf7e3539d 0xffffce80: 0xf7faa3c4 0xf7ffd000 0x0804859b 0x48d09200 (gdb) c %11$x 48d09200
  28. 28. ● stack canaryのどこを突破口にしているか? ○ 回避手法1: __stack_chk_failの回避 ■ 検知、強制終了を行うところ ○ 回避手法2: canaryをリークする ■ stackに入ったcanary 回避手法の本質
  29. 29. ● stack canaryのどこを突破口にしているか? ○ 回避手法1: __stack_chk_failの回避 ■ 検知、強制終了を行うところ ○ 回避手法2: canaryをリークする ■ stackに入ったcanary ○ 回避手法3: master canaryを書き換える ■ stack canaryの元の値 回避手法の本質
  30. 30. 概要 ● 動機 ● Stack Canary ● これまでの回避手法 ● Master Canary Forging ● 手法の評価と対策
  31. 31. ● 以下を仮定 ■ Linux Kernel 3.19 ■ glibc 2.21 ■ ASLRは有効 Master Canary Forging
  32. 32. ● master canaryはどこにある? ○ glibcを読む Master Canary Forging static void security_init (void) { /* Set up the stack checker's canary. */ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); #ifdef THREAD_SET_STACK_GUARD THREAD_SET_STACK_GUARD (stack_chk_guard); #else __stack_chk_guard = stack_chk_guard; #endif
  33. 33. ● master canaryはどこにある? ○ glibcを読む Master Canary Forging static void security_init (void) { /* Set up the stack checker's canary. */ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); #ifdef THREAD_SET_STACK_GUARD THREAD_SET_STACK_GUARD (stack_chk_guard); #else __stack_chk_guard = stack_chk_guard; #endif 実体への代入
  34. 34. ● master canaryはどこにある? ○ glibcを読む Master Canary Forging static void security_init (void) { /* Set up the stack checker's canary. */ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); #ifdef THREAD_SET_STACK_GUARD THREAD_SET_STACK_GUARD (stack_chk_guard); #else __stack_chk_guard = stack_chk_guard; #endif
  35. 35. ● master canaryはどこにある? ○ THREAD_SET_STACK_GUARD ■ 7アーキテクチャにて定義 ■ canaryがTLS(thread local storage)に入る ■ 定義されていないならmaster canaryは.bssへ Master Canary Forging
  36. 36. ● master canaryを書き換えるには ○ .bssにある時 ■ 任意のアドレス書き換えができればいいだけ Master Canary Forging
  37. 37. ● master canaryを書き換えるには ○ .bssにある時 ■ 任意のアドレス書き換えができればいいだけ ○ TLSにある時? Master Canary Forging
  38. 38. ● master canaryを書き換えるには ○ .bssにある時 ■ 任意のアドレス書き換えができればいいだけ ○ TLSにある時? ■ そもそもTLS領域はどこに確保されるのか? Master Canary Forging
  39. 39. ● TLS領域はどこにある? ○ glibcを読む Master Canary Forging void * internal_function _dl_allocate_tls_storage (void) { void *result; size_t size = GL(dl_tls_static_size); #if TLS_DTV_AT_TP size += (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1) & ~(GL(dl_tls_static_align) - 1); #endif /* Allocate a correctly aligned chunk of memory. */ result = __libc_memalign (GL(dl_tls_static_align), size);
  40. 40. ● TLS領域はどこにある? ○ _dl_allocate_tls_storageが確保を行う関数 ■ 内部で__libc_memalignが呼ばれる ● __libc_memalignは内部でmmapを呼ぶ ○ 結局はmmapによって確保されたどこか ■ ASLRの影響を受けるため書き換えが難しい Master Canary Forging
  41. 41. ● mmapで確保された領域の特徴: ○ 常にどこかの領域と隣接している Master Canary Forging
  42. 42. ● Mapped Area Based Buffer Overflow Master Canary Forging target area
  43. 43. ● Mapped Area Based Buffer Overflow ○ まずmmapを使って領域を確保する ○ 確保した領域が目的の領域の上に来るようにする Master Canary Forging mapped area target area
  44. 44. ● Mapped Area Based Buffer Overflow ○ まずmmapを使って領域を確保する ○ 確保した領域が目的の領域の上に来るようにする ○ 確保した領域でBOFを起こす ○ 十分なサイズなら、隣接した領域も上書き出る Master Canary Forging overwritten
  45. 45. ● Mapped Area Based Buffer Overflow ○ これでmaster canaryを書き換えられそう! ○ でも、攻撃者はmmapを呼べるの? Master Canary Forging
  46. 46. ● Mapped Area Based Buffer Overflow ○ これでmaster canaryを書き換えられそう! ○ でも、攻撃者はmmapを呼べるの? ■ はい Master Canary Forging
  47. 47. ● Mapped Area Based Buffer Overflow ○ これでmaster canaryを書き換えられそう! ○ でも、攻撃者はmmapを呼べるの? ■ はい ■ malloc Master Canary Forging
  48. 48. ● Mapped Area Based Buffer Overflow ○ これでmaster canaryを書き換えられそう! ○ でも、攻撃者はmmapを呼べるの? ■ はい ■ malloc ■ “When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2).” Master Canary Forging
  49. 49. ● Mapped Area Based Buffer Overflow ○ 使える条件は以下の2つ ■ heapのallocateを自由に行える ■ Heap Based BOFが起こる Master Canary Forging
  50. 50. 1. master canaryの書き換え a. .bssにある時 i. 任意のアドレス書き換えで書き換える b. TLSにある時 i. Mapped Area Based BOFを使う 2. Stack Based BOFを起こす Master Canary Forging
  51. 51. 概要 ● 動機 ● Stack Canary ● これまでの回避手法 ● Master Canary Forging ● 手法の評価と対策
  52. 52. ● 評価 ○ 使いづらい ■ 2種類の脆弱性が必要 ■ 普通Heap Based Buffer Overflowだけで十分 ○ Mapped Area Based BOF単体は使いやすい ■ TLSには関数ポインタテーブルがある場合あり 手法の評価と対策
  53. 53. ● 対策 ○ Random XOR Canaryを使う ■ canary = master canary ^ stack pointer ○ ガードページを設ける 手法の評価と対策
  54. 54. https://github.com/potetisensei/ MasterCanaryForging-PoC/ PoC
  55. 55. 御静聴ありがとうございました なんでも質問してください。

×