JITスプレー

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 44 mov$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 44 inc%espincespxor(%edx),%espxoresp,DWORDPTR[edx]adc%esi,0x44332211adcDWORDPTRds:0x44332211,esixor$0x44332211,%eaxxoreax,0x44332211

x86およびx86-64 では命令の途中へのジャンプが許可されますが、ARMのような固定長アーキテクチャでは許可されません。

JITスプレー攻撃から保護するために、JITコードを無効化したり、攻撃者が予測しにくいものにしたりすることができます。[ 4 ]

参考文献

  1. ^ユルゲン・シュミット(2011年1月20日)「噴霧器の復活 ― JIT噴霧:DEPとASLRに打ち勝つためのエクスプロイト」 The H. 2011年1月22日閲覧
  2. ^ Haifei Li (2010年2月10日). 「PDFにおけるJITスプレー」 . Fortinetブログ. 2010年4月18日時点のオリジナルよりアーカイブ2011年1月22日閲覧。
  3. ^ Larry Seltzer (2010年2月4日). 「新しい「JITスプレー」がWindowsの最良の防御策を突破」 . PCMag . 2011年1月28日時点のオリジナルよりアーカイブ。 2011年1月22日閲覧
  4. ^ a b Dion Blazakis. 「インタープリタのエクスプロイト、ポインタ推論、JITスプレー」(PDF) . Black Hat & Defcon 2010.; 「スライド」(PDF
  5. ^ Alexey Sintsov (2010年3月5日). 「楽しみと利益のためにJIT-Sprayシェルコードを書く」 . Packet Storm Security . 2012年1月30日閲覧