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

JavaScriptは機械語となる

takesako
August 04, 2012

 JavaScriptは機械語となる

HTML5アプリケーション基盤としてのプログラミング言語JavaScriptとセキュリティ

takesako

August 04, 2012
Tweet

More Decks by takesako

Other Decks in Programming

Transcript

  1. LIGHTWEIGHTLANGUAGEDECADE コンピュータの進化とプログラミング言語 CPUが高速化 Intel x86 (Pentium … Core i7) アウト・オブ・オーダー、投機的実行

    … スーパーパイプライン、スーパースカラー … Lightweight Language スクリプト言語でも高速に動作 Perl, Ruby, Python, PHP, ActionScript … JavaScript 高速化バトル勃発 Chrome の v8 エンジンの公開(2008年)
  2. LIGHTWEIGHTLANGUAGEDECADE Z80 エミュレーター (100% JavaScript) jsMSX  The first MSX

    emulator 100% written in Javascript http://jsmsx.sourceforge.net/ Console: Booting jsMSX Starting RAM slots Starting VDP Starting PSG (No Sound) interrupt=0,ticks=59666 cpu ticks/interrupt, cpu clock=3.58 MHz MSX ready to go. Load ROMs and hit [start].
  3. LIGHTWEIGHTLANGUAGEDECADE Webブラウザの高速化競争が激化 JavaScriptエンジンに JIT Compiler が搭載 ブラウザ JavaScriptエンジン Chrome v8

    Firefox SpiderMonkey Firefox 3.5 TraceMonkey (TraceJIT) Firefox 4 JaegerMonkey (methodJIT) Firefox 9 IronMonkey Opera 9.5 Futhark Opera 10.5 Carakan Safari JavaScriptCore Safari 4 Nitro
  4. LIGHTWEIGHTLANGUAGEDECADE +00: B8 78563412 MOV EAX,0x12345678 +05: 35 78563412 XOR

    EAX,0x12345678 +0A: 35 78563412 XOR EAX,0x12345678 +0F: 35 78563412 XOR EAX,0x12345678 (例)JIT Compiler による論理演算の最適化 JavaScript ソースコード x86 最適化コード(JITで機械語を生成) var a = 0x12345678 ^ 0x12345678 ^ 0x12345678 ^ 0x12345678 // ...
  5. LIGHTWEIGHTLANGUAGEDECADE +00: 35 9090903C XOR EAX,0x3C909090 +05: 35 9090903C XOR

    EAX,0x3C909090 +0A: 35 9090903C XOR EAX,0x3C909090 +0F: 35 9090903C XOR EAX,0x3C909090 JavaScript x86 JIT Compiler の問題点 以下の JavaScript ソースを機械語に変換 JITで生成されるx86実行コードを制御可能 x ^= 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090;
  6. LIGHTWEIGHTLANGUAGEDECADE +00: 35 909090903C XOR EAX,0x3C909090 +05: 35 909090903C XOR

    EAX,0x3C909090 +0A: 35 909090903C XOR EAX,0x3C909090 +0F: 35 909090903C XOR EAX,0x3C909090 XORによるNOPコード生成(80%の確率で実行可) +04: 3C 35 CMP AL,0x35 +06: 90 NOP +07: 90 NOP +08: 90 NOP +09: 3C 35 CMP AL,0x35 +0B: 90 NOP 「5の倍数」以外のアドレスにjumpされた場合
  7. LIGHTWEIGHTLANGUAGEDECADE +00: 35 9090BB7F XOR EAX,0x7FBB9090 +05: 35 2211903C XOR

    EAX,0x3C901122 +0A: 35 B733903C XOR EAX,0x3C9033B7 +0F: 35 B344903C XOR EAX,0x3C9044B3 (例) MOV EBX, 0x11223344 を実行する方法 JavaScriptソースコード JITで生成されるx86実行コード x ^= 0x3c7FBB90 ^ 0x3c901122 ^ 0x3c9033B7 ^ 0x3c9044B3;
  8. LIGHTWEIGHTLANGUAGEDECADE (例) MOV EBX, 0x11223344 を実行する方法 +01番地からのディスアセンブル結果 +01: 90 NOP

    +02: 90 NOP +03: BB 7F352211 MOV EBX,0x1122357F +08: 90 NOP +09: 3C 35 CMP AL,0x35 +0B: B7 33 MOV BH,0x33 +0D: 90 NOP +0E: 3C 35 CMP AL,0x35 +10: B3 44 MOV BL,0x44
  9. LIGHTWEIGHTLANGUAGEDECADE JIT-Spray による任意コード実行の脆弱性 <!DOCTYPE html> <html><head> <title>JIT-Spray</title> <script language="JavaScript"><!-- x

    ^= 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090 ^ 0x3c909090
  10. LIGHTWEIGHTLANGUAGEDECADE JIT-Spray による攻撃メカニズム 35 90 90 90 3C 35 90

    90 90 3C 35 90 90 90 3C 35 90 90 90 3C shellcode 35 90 90 90 3C 35 90 90 90 3C 35 90 90 90 3C 35 90 90 90 3C shellcode 35 90 90 90 3C 35 90 90 90 3C 35 90 90 90 3C 35 90 90 90 3C shellcode 0xdeadbeef XOR EAX, 0x3C909090 NOPと 解釈 GetPC + 自己書換 (任意コード) リターンアドレス JITが生成するコード
  11. LIGHTWEIGHTLANGUAGEDECADE ASLR (Address Space Layout Randomization) 攻撃コード 攻撃コード 攻撃コード Heap領域

    ASLR (Address Space Layout Randomization) アドレス空間配置のランダム化 Return Address の上書き (絶対アドレス指定)
  12. LIGHTWEIGHTLANGUAGEDECADE ASLR (Address Space Layout Randomization) 攻撃コード 攻撃コード 攻撃コード Heap領域

    ASLR (Address Space Layout Randomization) アドレス空間配置のランダム化 Return Address の上書き (絶対アドレス指定) 攻撃コード 攻撃コード 攻撃コード 攻撃コード Heap-Spray攻撃