
Cisco ASA の lina バイナリを体系的にリバースエンジニアリングし、CVE-2025-20333 および CVE-2025-20362 を含むメモリ破損の脆弱性を発見・分析します。リモートコード実行のプリミティブを見つけることに重点を置いています。
lina の全網羅リバースエンジニアリング作成: 2026-08-12
対象: lab_asav9-12-4-67/lina (ASAv 9.12(4)67, ELF x86-64, PIE; Ghidra イメージベース 0x100000; 112,687 関数, 約167 MB マップ済み, 642,707 シンボル)
トラックの目標: lina バイナリに対する体系的かつ 完全な RE カバレッジ — これまで行われてきた仮説駆動型の対象指定 RE を補完し、ラボが見つけられずにいるプリミティブを探す(20362+20333 での未認証 root RCE は実証済みなので、それは存在する)。
これまでの RE はすべて対象指定(fault-PC 逆コンパイル、文字列アンカー xref 探索、バインディング範囲スイープ)でした。それにより、監査対象となった全スコープ(H4-1/2/3/4、tostring(userdata) リフレクション、SSH/SNMP/IKE %p、代替オーバーフローファミリー、survival oracle)はクローズ済みです — ../RCE_BLOCKERS.md、../NEW_ROADS_TO_CODE_EXECUTION.md を参照。これらのクローズはスコープ単位のものです。112k 関数を持つバイナリのにこそ、APT が見つけられずにいる不足プリミティブが存在するはずです。このトラックは「次の攻撃面を推測する」方式をに置き換えます。
クリティカルパス上の位置: 既知のチェーンの主要な関門は依然として P0(ライブリモート情報漏えい) です。CIFS readdir の過剰読み出し(ステップ 19i、4 バイト窓)が唯一の経験的に確認された漏えいであり、前面の実証トラックであり続けます。LINA_FULL_RE は体系的なヘッジです: 未監査コード内でより良い漏えい/プリミティブを見つけるか、存在しないことを証明します。
0x55..(lina)または 0x7f..(libc/heap)の qword を送出できる任意のパス: フォーマット文字列エミッタ(ポインタへの %p/%lx/%x)、過剰読み出し(初期化済みデータによって長さが制限されないもの)、ヒープ残渣のリフレクション、未初期化バッファのエコー。memcpy/memmove/strcpy/strcat/sprintf/vsprintf/gets 系+カスタムコピーループ)、すべてのプロトコル面にわたるもの(すでに使い尽くした WebVPN Lua バインディングだけでなく — ../LINA_ALT_OVERFLOW_FAMILIES_RE.md を参照)。csco_config)からの前方コールグラフにより、トリアージヒットを 実際にワイヤから到達可能な ものとしてランク付けできるようにする。(ユーザーにより延期: CVE-2025-20363 シンク探索 — OSINT によれば、これは 20333 の兄弟である漏えいを 消費する とのこと; ../CVE-2025-20363_OSINT.md を参照。)
| 段階 | 内容 | ツール | 出力 |
|---|---|---|---|
| 1. コーパス | 全 112,687 関数をディスクに一括逆コンパイル。関数ごとに .c ファイル 1 つ、アドレスでシャード化 | Ghidra run_script_inline(Java、DecompInterface)、チャンク分割+再開可能 | corpus/<shard>/<addr>.c |
| 2. 機械的トリアージ | コーパスを ripgrep でシンクパターン(以下の漏えい+オーバーフロークラス)を検索 | ローカルスクリプト、triage/ | ヒットテーブル(CSV/MD) |
| 3. 到達可能性フィルタ | ネットワークエントリポイントから到達可能な関数内のヒットのみ保持 | Ghidra コールグラフ(get_function_call_graph/スクリプト)+エントリポイントシードリスト | ランク付けされたヒットリスト |
| 4. 深掘り | ランク付けされたヒットの対象指定 RE(既存の ghidra-re サブエージェントパターン) | ghidra-mcp | このフォルダ内のファインディング文書 |
段階 1 は純粋に計算(推定数時間〜数日、無人、再開可能)。段階 2〜3 は安価/ローカル。段階 4 のみが人間/LLM ヘビーな段階であり、漏斗によって制限されます。
Research notes/LINA_FULL_RE/
README.md — this file (master plan + status)
TRIAGE.md — sink-pattern catalog + reachability plan (stage 2/3 spec)
scripts/ — decompile + triage + driver scripts
corpus/ — stage-1 output: decompiled functions, sharded (corpus/2c/02c6cc80.c)
_progress.txt — resumable progress marker (done count, last address)
_errors.txt — per-function decompile failures
triage/ — stage-2/3 outputs (hit tables, ranked lists)
findings/ — stage-4 deep-dive writeups (one MD per confirmed candidate)
| 段階 | ステータス | 備考 |
|---|---|---|
| 1. コーパス | 2026-08-12 完了(約 19:03 UTC-4) | 111,997/111,997 関数、エラー 0、corpus/ 内 548 MB; scripts/decompile_all.py により 26,214 秒(約 7.3 時間)、4.3 関数/秒で完了(GhidraMCP batch_decompile、20 関数/呼び出し上限) |
| 2. トリアージ | 2026-08-13 完了 | scripts/triage_stage2.py; クラス別ヒットテーブルは triage/*_hits.csv; ランク結合は triage/RANKED.md |
| 3. 到達可能性 | 2026-08-13 完了(再実行、シード修正済み) | コーパスのコール+参照グラフ(エッジ 427,198); 111,997 中 26,291 が到達可能(23.5%) — preauth 26,278 / admin 13 / post20362 0。シード修正: registrar 0317b4e0、session 0317c0a0(旧 030ab4e0/030ac0a0 は関数開始ではなかった)。依然として下限値(vtable あり)。 |
| 4. 深掘り | 進行中 2026-08-17 | L1 クローズ済み。 L2 C-パス GO(静的): WebVPN UCTE create_type3_message は攻撃者の Type-2 TargetInfo をクランプなしでコピーする; 漏えいは Type-3 Authorization: NTLM に乗って攻撃者の HTTP サーバへ戻る(findings/L2_NTLM_C_PATH_TYPE3.md)。Lua の ntlm.parseType2 は休眠中の双子である。O1/O5 プロトコルパス クローズ済み(静的): IKE/SSH/SNMP/EWS/PDTS のコピーは宛先サイズ指定、送信側、または既知のもの(031af6d0 / 02ff2f30)。O1「その他」725 クローズ済み(静的): スタック/グローバル/param+const フィルタ → 新たな宛先オーバーフロー GO なし; 015a8b30 はクランプなしの addrtype ヘルパーで、呼び出し元は AF サイズ 4/0x10 のみを渡す(findings/O1_OTHER_SWEEP.md)。O2 クローズ済み(静的): 到達可能なコピーループ 605 件; 新たな宛先オーバーフロー GO なし。FUN_02fd7270 = ucte_ntlm_authenticate_connection → L2 C-パス GO と同じ create_type3_message(findings/O2_SWEEP.md)。次: ラボ NTLM プローブ(post-20362)— 0x7f../0x55.. の qword が出てくれば、窓の点で CIFS を上回る。任意の静的解析: O3/O4。 |
再開/制御: ドライバは出力ファイルが既に存在する関数をスキップします — 続行するにはいつでも python3 scripts/decompile_all.py を再実行してください。グレースフルストップ: touch corpus/STOP。Ghidra または MCP プラグインが再起動した場合も、ドライバを再実行するだけです。
発見されたプラグイン制約(2026-08-12): run_script_inline は無効(GHIDRA_MCP_ALLOW_SCRIPTS 未設定)→ コーパスは HTTP バッチエンドポイントのみを使用; batch_decompile は ?functions=0x..,0x..,.. を GET クエリパラメータとして受け取り(JSON ボディではない)、レスポンスを 20 関数で静かに切り詰める → ドライバのチャンクサイズ = 20。
list_functions が返すままの RVA です(確認済み: corpus/02/02c6cc80.c = luaH_get = RVA 0x2c6cc80)。注: GhidraMCP HTTP プラグインは RVA 形式のアドレスを報告します。Ghidra VA = RVA + 0x100000 ではありません。../RCE_BLOCKERS.md / ../TODO.md を引用してください。0x55.. vs 0x7f.. vs heap)、および信頼性において CIFS readdir プリミティブ(ステップ 19i)を上回るかどうかを必ず記載してください。