JITスプレー()は、JITコンパイラの挙動を利用してアドレス空間配置のランダム化およびデータ実行防止を回避するエクスプロイトの一種。PDFフォーマットおよびAdobe Flashをエクスプロイトするのに使用されてきた。
JITコンパイラはその性質上、コードをデータとして生成する。JITコンパイラの目的は実行可能なデータを生成することであるため、データが実行不可能な環境では使用できない。このため、JITコンパイラは通常、データ実行防止の保護から除外されている。JITスプレー攻撃は、生成されたコードに対してを行う。
JITからエクスプロイト可能なコードを得るため、Dion Blazakis; が考案した手法を使う。まず、JavaScriptやActionScriptなどで書かれた、誤ってコードとして実行される大量の定数を含むプログラムを入力する。例えば、XOR演算などが使われる。
var a = (0x11223344^0x44332211^0x44332211^ ...);
JITは、バイトコードを次のx86ネイティブコードに変換する。
0: b8 44 33 22 11 5: 35 11 22 33 44 a: 35 11 22 33 44
次に、攻撃者はバグを利用して、コード実行を新しく生成したコードにリダイレクトさせる。例えば、バッファオーバーフローバグやuse-after-freeバグを使って、関数ポインタやリターンアドレスを上書きする。
これにより、CPUにJITコンパイラの作者が意図していない命令を実行させることができる。また、意図されたものである命令の途中にジャンプし、CPUに別の命令として解釈させることも可能で、基本的に命令境界による制限を受けない。非JITのreturn-oriented programming攻撃と同様に、コンピュータの制御を奪うのに十分な数の命令を得られる場合がある。例えば、mov命令の2バイト目にジャンプすると、inc命令が実行される。
1: 44 2: 33 22 4: 11 35 11 22 33 44 a: 35 11 22 33 44
命令の途中にジャンプ可能なハードウェアには、x86、x86-64、ARMなどがある。JITスプレー攻撃はこれらのハードウェアで特に効果的であるが、他のシステムにも応用可能である。
参考文献