对 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 二进制文件进行系统性、完整的逆向工程覆盖——以补充迄今已完成的假设驱动型定向逆向工程——从而猎取实验室尚未找到的原语(20362+20333 上现实世界中未认证 root RCE 已被证实,因此它必然存在)。
此前所有逆向工程均为定向(故障 PC 反编译、字符串锚点交叉引用遍历、绑定范围扫描)。它已关闭每一个经审计的范围(H4-1/2/3/4、tostring(userdata) 反射、SSH/SNMP/IKE %p、备选溢出家族、生存预言机)——参见 ../RCE_BLOCKERS.md、../NEW_ROADS_TO_CODE_EXECUTION.md。这些关闭结论均按范围逐一成立;一个 112k 函数二进制文件中,正是 APT 缺失原语的必然藏身之处。此轨道以取代“猜测下一个攻击面”。
与关键路径的关系: 已知利用链的硬性关口仍是 P0(实时远程信息泄露);CIFS readdir 越界读取(步骤 19i,4 字节窗口)是唯一经实证确认的泄露,并仍是当前的实证主轨道。LINA_FULL_RE 是系统性的对冲手段:在未审计代码中找到更优的泄露/原语,或证明其不存在。
0x55..(lina)或 0x7f..(libc/堆)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 文件,按地址分片 | Ghidra run_script_inline(Java,DecompInterface),分块 + 可断点续跑 | corpus/<shard>/<addr>.c |
| 2. 机械式分流 | 用 ripgrep 在语料库中搜索汇聚点模式(下述泄露 + 溢出类别) | 本地脚本、triage/ | 命中表(CSV/MD) |
| 3. 可达性过滤 | 保留可从网络入口点到达的函数中的命中 | Ghidra 调用图(get_function_call_graph/脚本)+ 入口点种子列表 | 排序后的命中列表 |
| 4. 深度挖掘 | 对排序命中进行定向逆向工程(沿用现有 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(GhidraMCP batch_decompile,每次调用 20 个函数上限)耗时 26,214 秒(约 7.3 小时),平均 4.3 个函数/秒 |
| 2. 分流 | 已完成 2026-08-13 | scripts/triage_stage2.py;各类别命中表位于 triage/*_hits.csv;排序合并结果位于 triage/RANKED.md |
| 3. 可达性 | 已完成 2026-08-13(重跑,已修正种子) | 语料库调用+引用图(427,198 条边);26,291/111,997 可达(23.5%)——预认证 26,278 / 管理 13 / post20362 0。种子已修正:注册器 0317b4e0、会话 0317c0a0(旧的 030ab4e0/030ac0a0 并非函数起始地址)。仍为下界(vtables 未计入)。 |
| 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.. 对比 0x7f.. 对比堆),以及在可靠性上是否胜过 CIFS readdir 原语(步骤 19i)。