JITスプレー英語: JIT spraying)は、JITコンパイラの挙動を利用してアドレス空間配置のランダム化およびデータ実行防止を回避するエクスプロイトの一種[1]PDFフォーマット[2]およびAdobe Flash[3]をエクスプロイトするのに使用されてきた。

JITコンパイラはその性質上、コードをデータとして生成する。JITコンパイラの目的は実行可能なデータを生成することであるため、データが実行不可能な環境では使用できない。このため、JITコンパイラは通常、データ実行防止の保護から除外されている。JITスプレー攻撃は、生成されたコードに対してヒープスプレー英語版を行う。

JITからエクスプロイト可能なコードを得るため、Dion Blazakis[4]が考案した手法を使う。まず、JavaScriptActionScriptなどで書かれた、誤ってコードとして実行される大量の定数を含むプログラムを入力する。例えば、XOR演算などが使われる[5]

var a = (0x11223344^0x44332211^0x44332211^ ...);

JITは、バイトコードを次のx86ネイティブコードに変換する。

0:  b8 44 33 22 11      mov $0x11223344,%eax    mov eax,0x11223344
5:  35 11 22 33 44      xor $0x44332211,%eax    xor eax,0x44332211
a:  35 11 22 33 44      xor $0x44332211,%eax    xor eax,0x44332211

次に、攻撃者はバグを利用して、コード実行を新しく生成したコードにリダイレクトさせる。例えば、バッファオーバーフローバグやuse-after-freeバグを使って、関数ポインタやリターンアドレスを上書きする。

これにより、CPUにJITコンパイラの作者が意図していない命令を実行させることができる。また、意図されたものである命令の途中にジャンプし、CPUに別の命令として解釈させることも可能で、基本的に命令境界による制限を受けない。非JITのreturn-oriented programming攻撃と同様に、コンピュータの制御を奪うのに十分な数の命令を得られる場合がある。例えば、mov命令の2バイト目にジャンプすると、inc命令が実行される。

1:  44                  inc %esp                inc esp
2:  33 22               xor (%edx),%esp         xor esp,DWORD PTR [edx]
4:  11 35 11 22 33 44   adc %esi,0x44332211     adc DWORD PTR ds:0x44332211,esi
a:  35 11 22 33 44      xor $0x44332211,%eax    xor eax,0x44332211

命令の途中にジャンプ可能なハードウェアには、x86x86-64ARMなどがある。JITスプレー攻撃はこれらのハードウェアで特に効果的であるが、他のシステムにも応用可能である[4]

参考文献 編集

  1. ^ Jürgen Schmidt (2011年1月20日). “Return of the sprayer -- JIT Spraying: Exploits to beat DEP and ASLR”. The H. 2011年1月22日閲覧。
  2. ^ Haifei Li (2010年2月10日). “JIT Spraying in PDF”. Fortinet. 2010年4月18日時点のオリジナルよりアーカイブ。2011年1月22日閲覧。
  3. ^ Larry Seltzer (2010年2月4日). “New "JIT Spray" Penetrates Best Windows Defenses”. PCmag. 2011年1月22日閲覧。
  4. ^ a b Dion Blazakis. “Interpreter Exploitation. Pointer Inference and JIT Spraying”. Black Hat & Defcon 2010. 2023年1月7日閲覧。; Slides”. 2023年1月7日閲覧。
  5. ^ Alexey Sintsov. “Writing JIT-Spray Shellcode for fun and profit”. Digital Security Research Group. 2023年1月7日閲覧。