JITスプレー
JITスプレー(英語: JIT spraying)は、JITコンパイラの挙動を利用してアドレス空間配置のランダム化およびデータ実行防止を回避するエクスプロイトの一種[1]。PDFフォーマット[2]およびAdobe Flash[3]をエクスプロイトするのに使用されてきた。
JITコンパイラはその性質上、コードをデータとして生成する。JITコンパイラの目的は実行可能なデータを生成することであるため、データが実行不可能な環境では使用できない。このため、JITコンパイラは通常、データ実行防止の保護から除外されている。JITスプレー攻撃は、生成されたコードに対してヒープスプレーを行う。
JITからエクスプロイト可能なコードを得るため、Dion Blazakis[4]が考案した手法を使う。まず、JavaScriptやActionScriptなどで書かれた、誤ってコードとして実行される大量の定数を含むプログラムを入力する。例えば、XOR演算などが使われる[5]。
var a = (0x11223344^0x44332211^0x44332211^ ...);
JITは、バイトコードを次のx86ネイティブコードに変換する。
0: b8 44 33 22 11mov $0x11223344,%eax
mov eax,0x11223344
5: 35 11 22 33 44xor $0x44332211,%eax
xor eax,0x44332211
a: 35 11 22 33 44xor $0x44332211,%eax
xor eax,0x44332211
次に、攻撃者はバグを利用して、コード実行を新しく生成したコードにリダイレクトさせる。例えば、バッファオーバーフローバグやuse-after-freeバグを使って、関数ポインタやリターンアドレスを上書きする。
これにより、CPUにJITコンパイラの作者が意図していない命令を実行させることができる。また、意図されたものである命令の途中にジャンプし、CPUに別の命令として解釈させることも可能で、基本的に命令境界による制限を受けない。非JITのreturn-oriented programming攻撃と同様に、コンピュータの制御を奪うのに十分な数の命令を得られる場合がある。例えば、mov命令の2バイト目にジャンプすると、inc命令が実行される。
1: 44inc %esp
inc esp
2: 33 22xor (%edx),%esp
xor esp,DWORD PTR [edx]
4: 11 35 11 22 33 44adc %esi,0x44332211
adc DWORD PTR ds:0x44332211,esi
a: 35 11 22 33 44xor $0x44332211,%eax
xor eax,0x44332211
命令の途中にジャンプ可能なハードウェアには、x86、x86-64、ARMなどがある。JITスプレー攻撃はこれらのハードウェアで特に効果的であるが、他のシステムにも応用可能である[4]。
参考文献
[編集]- ^ Jürgen Schmidt (20 January 2011). “Return of the sprayer -- JIT Spraying: Exploits to beat DEP and ASLR”. The H. 22 January 2011閲覧。
- ^ Haifei Li (10 February 2010). “JIT Spraying in PDF”. Fortinet. 18 April 2010時点のオリジナルよりアーカイブ。22 January 2011閲覧。
- ^ Larry Seltzer (4 February 2010). “New "JIT Spray" Penetrates Best Windows Defenses”. PCmag. 22 January 2011閲覧。
- ^ a b Dion Blazakis. “Interpreter Exploitation. Pointer Inference and JIT Spraying”. Black Hat & Defcon 2010. 2023年1月7日閲覧。; “Slides”. 2023年1月7日閲覧。
- ^ Alexey Sintsov. “Writing JIT-Spray Shellcode for fun and profit”. Digital Security Research Group. 2023年1月7日閲覧。