JITスプレーは、ジャストインタイムコンパイルの動作を悪用することで、アドレス空間レイアウトのランダム化とデータ実行防止の保護を回避するコンピュータセキュリティエクスプロイトの一種です。[ 1 ] PDF形式[ 2 ]やAdobe Flash [ 3 ]のエクスプロイトに使用されています
ジャストインタイムコンパイラ(JIT)は、定義上、コードをデータとして生成します。実行可能データを生成することが目的であるため、JITコンパイラは実行データがない環境では実行できない数少ないプログラムの一つです。そのため、JITコンパイラは通常、データ実行防止(DEP)の対象外となります。JITスプレー攻撃は、生成されたコードを用いて ヒープスプレーを実行します。
JITからエクスプロイトコードを生成するには、Dion Blazakis [ 4 ]のアイデアが用いられます。入力プログラム(通常はJavaScriptまたはActionScript)には、コードとして誤って実行される可能性のある多数の定数値が含まれています。例えば、XOR演算が用いられます。[ 5 ]
var a = ( 0x11223344 ^ 0x44332211 ^ 0x44332211 ^ ...);JIT は次のようにバイトコードをネイティブ x86 コードに変換します。
0: b8 44 33 22 11 5: 35 11 22 33 44 a: 35 11 22 33 44mov$0x11223344,%eaxmoveax,0x11223344xor$0x44332211,%eaxxoreax,0x44332211xor$0x44332211,%eaxxoreax,0x44332211
攻撃者は適切なバグを利用して、コード実行を新しく生成されたコードにリダイレクトします。例えば、バッファオーバーフローや解放後使用バグを利用することで、関数ポインタや戻りアドレスを改変することが可能になります。
これにより、CPUはJIT開発者が意図していなかった方法で命令を実行します。攻撃者は通常、想定される命令の境界にさえ限定されません。意図された命令の途中にジャンプして、CPUに別の命令として解釈させることも可能です。非JIT ROP攻撃と同様に、これはコンピューターを効果的に制御するのに十分な操作となる可能性があります。上記の例を続けると、「mov」命令の2番目のバイトにジャンプすると、「inc」命令になります。
1: 44 2: 33 22 4: 11 35 11 22 33 44 a: 35 11 22 33 44inc%espincespxor(%edx),%espxoresp,DWORDPTR[edx]adc%esi,0x44332211adcDWORDPTRds:0x44332211,esixor$0x44332211,%eaxxoreax,0x44332211
x86およびx86-64 では命令の途中へのジャンプが許可されますが、ARMのような固定長アーキテクチャでは許可されません。
JITスプレー攻撃から保護するために、JITコードを無効化したり、攻撃者が予測しにくいものにしたりすることができます。[ 4 ]