LLVM meets kernel

LLVM meets kernel

第九回 カーネル/VM探検隊 発表資料 http://peatix.com/event/22490 #kernelvm

5c6358240ec94522f70cf7b0e657f58f?s=128

Yuma Kurogome

December 08, 2013
Tweet

Transcript

  1. 2.

    whoami • Yuma Kurogome(@ntddk) • 慶應義塾大学 SFC B1, 武田研 •

    留年の危機 • Synclogue Inc. • Windows kernel, RCE, LLVM ← new!
  2. 5.
  3. 9.

    Frontend • 字句解析 • 構文解析 • 意味解析 • コード生成 –

    LLVM IR • Frontendを実装するだけで任意の言語のコンパ イラが作れる – MiddlendとBackendはLLVMデフォルトでも十分
  4. 11.

    Backend • アセンブリ生成 • 実行オブジェクト生成 • LLVM IRの実行(JIT) • コード生成(トランスレータ)

    • 独自の言語のソースコードを生成したい場合は Backendを実装する必要がある
  5. 13.

    ROP

  6. 15.

    脆弱性対策技術 • StackGuard – リターンアドレス付近に乱数を配置 • StackSheild – リターンアドレスを離れた位置に保存 •

    ASLR – アドレスのランダマイズ – 攻撃の成功率を下げる • Exec Shield – データ実行防止
  7. 16.

    ROP • 脆弱性攻略のための一技術 – Exec Shieldを突破する • Return-oriented programming •

    短いコードブロックを組み合わせてシェルコー ドとする – ROP gadgets – シェルコードとして使える命令とリターンのセット – 命令をずらして解釈することも – ASLRがかかっていないファイルを利用
  8. 17.

    ROP gadgets 684a0f4e: pop eax ret 684a2367: pop ecx ret

    684a123a: mov[ecx], eax ret 0x684a123a 0xfeedface 0xdeadbeef 0x684a2367 0x684a0f4e
  9. 18.
  10. 19.

    Return-oriented rootkit • Rootkit – カーネル構造体などを書き換える – 悪意のあるプログラムを隠蔽 • Return-oriented

    rootkit – Return-Oriented Rootkits: Bypassing Kenrel Code Integrity Protection Mechanism – ROPを利用したrootkit – ROPでカーネルの整合性検証をバイパスする
  11. 25.

    Return-less kernel • 3つの手法でカーネルからreturnを除去 – Return indirection – Register allocation

    – Peephole optimization • LLVM backendを中心に実装 – マシン語の最適化 – 1命令を減らす最適化はバックエンドでのみ可能
  12. 29.

    Register allocation • llvm::Spiller • LLVMのレジスタ割り当てアルゴリズム – Simple scan –

    Local scan • これら2つは仮想レジスタから直接マッピング – Linear scan • より高度な割り当て
  13. 30.

    Register allocation • Linear scanを利用 • X86RegisterInfo.tdを拡張 – x86におけるレジスタ記述ファイル •

    危険なレジスタ割り当てにアノテーション • 再割り当て • ご安全に!
  14. 32.
  15. 34.
  16. 35.

    +

  17. 36.
  18. 38.

    gcc拡張の闇 • Variable length arrays in structs (VLAIS) – Variable

    length arrayの拡張 – 構造体内で配列の長さを実行時指定 – iptablesやHMACなどで利用されている struct foo_t { char a[n];/* Explicitly not allowed by C99/C11 */ } foo;
  19. 39.

    gcc拡張の闇 • __builtin_constant_pによる定数検出の回避 – LLVM Bug 4898 • Inline syntax

    handling – GNU89 • __initと__exit • レジスタ変数 – x86 register unsigned long current_stack_pointer asm("esp") __used; – ARM register unsigned long current_sp asm ("sp");