Skip to content

LLM 反编译器的行为等价与漏洞保真审计 ​

摘要 ​

《When LLM Decompilers Recompile More and Preserve Less》指出,反编译输出能够重新编译并通过随附测试,不代表它与原二进制行为等价。作者提出 Decompile-Diverge:为每个函数生成驱动,以原函数扩展模糊测试语料,再让原函数与反编译结果处理完全相同的输入,通过差分 oracle 查找行为偏离。

在八个系统、九种配置中,即使候选通过全部随附测试,仍有 4.9% 在扩展输入上偏离,单一系统最高为 13%。在 300 个真实 GitHub 函数和 287 个 CVE 函数上,最强 LLM refinement 将 Ghidra 构建率从 75% 提至 90%,但 Matched 比例从 74% 降至 62%;已披露漏洞中最多约十分之一出现 Crash Absence,即原二进制会崩溃而重编译输出不再暴露该行为。

方法的独特价值 ​

原研究贡献。 Decompile-Diverge 用同输入差分执行替代固定测试,分别测量可构建性、随附测试通过、一般行为一致和漏洞崩溃保真。它揭示 LLM 可能用表面合理的字段、类型、被调函数或保护条件填补传统反编译器保留的未知项。

本站分析。 既有代码安全评测关注生成、编辑或修补;本研究的独立差分是逆向工程工具可能提高“可读、可编译”指标,却降低漏洞分析所需的语义保真。主要修复责任在安全 Agent 的验收与 oracle 设计,因此归 C7。

适用范围 ​

方法适用于把反编译结果用于漏洞检测、恶意软件分析和程序理解的 LLM 系统。它评估函数级行为,不证明整程序、并发、系统调用或环境依赖完全等价,也不把 Crash Absence 自动解释为漏洞被安全修复。

方法与实施流程 ​

  1. 为原始函数与候选反编译函数生成隔离驱动。
  2. 从原始实现出发扩展输入语料,避免只复用随附测试。
  3. 在相同输入、超时和资源限制下分别执行两个版本。
  4. 比较返回值、输出、副作用、崩溃和超时,记录 Matched 或 Diverged。
  5. 对 CVE 样本单独检查原始崩溃是否在候选中保留。

以下去武器化工件只使用无网络的合成函数与随机整数,不包含 CVE 触发输入:

text
reference = fixture.binary("toy-parser-safe")
candidate = fixture.source("toy-decompile.c")
corpus = grow_inputs(reference, seed="public-toy", max_cases=1000)
for input in corpus:
    a = sandbox.run(reference, input, network="off")
    b = sandbox.run(candidate, input, network="off")
    if normalize(a) != normalize(b): record("DIVERGED", input.hash_only)
assert no_real_cve_trigger_saved()

质量控制 ​

研究同时保留构建率、随附测试通过率和 Matched 率,避免用单一指标覆盖冲突结果;300 个 GitHub 函数用于现实代码行为比较,287 个 CVE 函数用于漏洞保真。相同输入差分减少两个运行语料不一致造成的混淆,源代码分析再把偏离定位到引入字段、类型、调用和保护条件。

局限与待验证问题 ​

证据来自单篇论文,无专属公开代码直链和独立复现,因此为 moderate。模糊测试只能证明已探索输入上的差异,未发现偏离不等于行为等价;驱动生成、未定义行为、编译器选项和系统调用建模也会影响 oracle。后续应加入符号执行、覆盖率、不同优化级别和人工逆向专家基线。

参考链接 ​