Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LLVM meets kernel

Yuma Kurogome
December 08, 2013

LLVM meets kernel

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

Yuma Kurogome

December 08, 2013
Tweet

More Decks by Yuma Kurogome

Other Decks in Programming

Transcript

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

    留年の危機 • Synclogue Inc. • Windows kernel, RCE, LLVM ← new!
  2. Frontend • 字句解析 • 構文解析 • 意味解析 • コード生成 –

    LLVM IR • Frontendを実装するだけで任意の言語のコンパ イラが作れる – MiddlendとBackendはLLVMデフォルトでも十分
  3. Backend • アセンブリ生成 • 実行オブジェクト生成 • LLVM IRの実行(JIT) • コード生成(トランスレータ)

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

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

    ASLR – アドレスのランダマイズ – 攻撃の成功率を下げる • Exec Shield – データ実行防止
  6. ROP • 脆弱性攻略のための一技術 – Exec Shieldを突破する • Return-oriented programming •

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

    684a123a: mov[ecx], eax ret 0x684a123a 0xfeedface 0xdeadbeef 0x684a2367 0x684a0f4e
  8. Return-oriented rootkit • Rootkit – カーネル構造体などを書き換える – 悪意のあるプログラムを隠蔽 • Return-oriented

    rootkit – Return-Oriented Rootkits: Bypassing Kenrel Code Integrity Protection Mechanism – ROPを利用したrootkit – ROPでカーネルの整合性検証をバイパスする
  9. Return-less kernel • 3つの手法でカーネルからreturnを除去 – Return indirection – Register allocation

    – Peephole optimization • LLVM backendを中心に実装 – マシン語の最適化 – 1命令を減らす最適化はバックエンドでのみ可能
  10. Register allocation • llvm::Spiller • LLVMのレジスタ割り当てアルゴリズム – Simple scan –

    Local scan • これら2つは仮想レジスタから直接マッピング – Linear scan • より高度な割り当て
  11. Register allocation • Linear scanを利用 • X86RegisterInfo.tdを拡張 – x86におけるレジスタ記述ファイル •

    危険なレジスタ割り当てにアノテーション • 再割り当て • ご安全に!
  12. +

  13. 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;
  14. 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");