想象一下你正在尝试解开一个拼图。现在,想象有人把那个拼图拿走,并对它做了两件事:
- 重命名碎片: 不再是“国王”、“皇后”和“兵”,而是将这些国际象棋棋子标记为“X”、“Y”和“Z”。或者更糟,为了欺骗你,把“国王”标记成了“兵”。
- 打乱指令: 指令不再是清晰的路径,如“向前走,然后左转”,而是被拆分成细碎、脱节的步骤,需要一张复杂的地图才能理清顺序。
这就是**代码混淆(code obfuscation)**对计算机程序所做的事情。它让程序运行方式完全保持不变,但却让其变得极难被人类阅读和理解。
这篇论文提出了一个简单但深刻的问题:人工智能模型(大语言模型)是否也会像人类一样,在这些被打乱的拼图中感到困惑? 还是说,它们的失败方式完全不同,且充满神秘感?
以下是研究结果的解读,使用了日常类比:
1. “聪明型”AI vs. “训练型”AI
研究人员测试了不同类型的 AI 模型。把它们想象成不同类型的学生:
- “编码/指令型”模型(Coder/Instruct Models): 这些像是背诵了大量代码教材的学生。它们擅长识别模式(比如看到“print”这个词就知道该做什么)。但当你打乱拼图时,它们会感到困惑,因为它们的“模式匹配”失效了。它们并不真正理解代码为什么能工作,它们只是知道代码通常长什么样。
- “推理型”模型(Reasoning Models): 这些像是被教导过如何思考的学生。它们不只是死记硬背,而是尝试一步步推导逻辑。
重大发现: “推理型”模型在面对打乱的拼图时,表现出了与人类完全相同的困惑。当拼图变得更难(混淆程度更高)时,人类和推理型 AI 都会变得更慢且更容易出错。然而,“编码型”模型并不怎么在意难度,它们要么随机失败,要么并没有表现出难度增加,这表明它们并不是像人类那样在进行真正的“思考”。
2. “自信的错误”陷阱
研究中最有趣的部分之一涉及一种被称为**对抗性重命名(Adversarial Renaming)**的特定技巧。
- 场景: 假设一个计算税率的函数名为
calculate_tax。混淆器将其名称改为 calculate_bonus(计算奖金)。
- 人类的反应: 程序猿看到“奖金”时会想:“等等,这对于税收来说不太合理”,但如果代码逻辑很混乱,他们仍可能感到困惑。
- AI 的反应: “推理型”AI 有时会掉入这个陷阱。它们看到了“奖金”这个词,便假定代码是关于发钱的,从而自信地给出了错误的答案。
研究发现,这种“自信的错误”只有在两种情况同时发生时才会出现:名称具有误导性,并且代码结构令人困惑。这就像有人给了你一张城市地图,但把“医院”标注成了“披萨店”,而且街道全是单行循环路。你会自信地开车前往“披萨店”(实际是医院),然后迷失方向。
3. “思考时间”计量器
研究人员观察了 AI 在回答之前“思考”了多久。他们通过计算 AI 在其“思维链”(内部独白)中生成的单词数量来衡量这一点。
- 人类的平行类比: 当人类面对难题时,解决问题需要更长时间。
- AI 的平行类比: 当谜题变得更难时,AI 生成的内部独白也变得越来越长。
- 反转之处: 有趣的是,AI 并没有仅仅通过延长思考时间就变得更擅长解决难题。事实上,AI 思考得越久,它出错的可能性就越大。这就像一个学生对着一道数学题盯着看了一个小时,写了满页的笔记,但由于题目本身太难,最终还是算错了答案。思考的长度是难度的信号,而不是成功的信号。
4. “专家”的区别
研究还观察了人类专家与初学者的区别。
- 初学者: 当代码被打乱时,初学者的表现变得差得多。
- 专家: 出人意料的是,专家在面对轻微打乱的代码时,有时反而表现得更好了。为什么?因为他们不再依赖变量的名称(那些“国王”或“兵”的标签),而是开始严格观察逻辑和结构。
- AI 的差距: 没有一种 AI 模型,即使是最聪明的,也无法复制这种“专家”行为。它们在面对轻微打乱的代码时并没有变得更好,反而变得更差了。这表明,尽管 AI 在推理方面取得了进步,但尚未达到人类那种可以忽略误导性标签并专注于底层结构的直觉水平。
总结:这意味着什么?
- AI 理解代码的方式像人类吗? “推理型”AI 正在开始向这个方向靠拢。它们会在人类会感到困惑的难题上卡住。“编码型”AI 则只是模式匹配机器,其失败方式截然不同。
- 我们可以盲目信任处理复杂代码的 AI 吗? 不可以。如果代码有奇怪的名称或混乱的结构,AI 可能会给你一个非常自信、但完全错误的答案。
- “思考”信号: 如果一个 AI 开始针对一个简单的任务写出非常冗长、散乱的解释,这并不代表它有天赋,而是说明它正在挣扎,并且可能即将犯错。
简而言之,这篇论文表明,我们正在构建开始像人类一样“思考”的 AI,但在它们能够处理现实世界开发者每天遇到的那些混乱、模糊且棘手的代码之前,还有很长的路要走。
技术摘要:机器是否在人类感到困惑的地方同样挣扎?LLM 与人类对混淆代码的理解能力研究
问题陈述
代码混淆被广泛用于保护软件免受逆向工程,其原理是通过刻意损害人类的代码理解能力,同时保留程序的语义。虽然先前的研究(特别是 Nguyen 等人 [1])已经证实,混淆会破坏人类的推理模式——迫使思维从直觉性的“系统 1”处理转向审慎的“系统 2”推理——但目前尚不清楚大语言模型(LLM)是否也表现出类似的失效模式。本文探讨的核心问题是:LLM 对混淆代码的理解是与人类理解方式一致,还是通过不同的机制发生失效。如果模型的失效机制不同,那么在标准任务上的高基准性能可能会掩盖一种脆弱的能力,这种能力在人类仍能应对的变换面前会迅速崩溃。
研究方法
作者进行了一项混合实证研究,将 LLM 的性能与由 Nguyen 等人 [1] 建立的人类基准进行了对比。
- 数据集: 本研究使用了两个数据集。数据集 A(来自 HumanEval-X 的 20 个 Python 和 JavaScript 代码片段)用于直接比较 LLM 与人类参与者在五个混淆层级下的表现。数据集 B(来自 HumanEval-X、CruxEval-X 和 LeetCode 的 250 个代码片段)用于对模型的推理轨迹进行仅限模型的分析。
- 混淆层级: 测试了五个等级:
- L0: 原始代码。
- L1: 标识符重命名(将具有意义的名字替换为无意义的名字)。
- L1b: 对抗性重命名(将标识符替换为具有语义意义但具有误导性的名字)。
- L2: 控制流平坦化(使用调度器使逻辑与语法脱节)。
- L3: L1 与 L2 的结合。
- 模型: 研究评估了多种 LLM,包括推理增强型模型(如 DeepSeek-R1、SmolLM3)、指令微调模型以及代码微调模型,参数规模从 0.5B 到 8B 不等。
- 评估框架:
- 主要指标: 输出预测准确率(与标准答案完全匹配)。
- 理论视角: 使用 Schulte 的块模型(Block Model)[2] 在四个层面定位失效情况:原子层(词法元素)、块层(语义区域)、关系层(依赖关系)以及 宏观结构层(整体算法)。
- 推理分析: 将思维链(CoT)轨迹长度作为心理努力程度的代理指标。通过置信度指标(z-score 标准化的对数概率)和“标识符峰值分数”(Token 级不确定性)来检测自信的错误解释。
- 实验设计: 实验通过改变提示条件(基准、系统 2 提示、认知干扰、Token 预算)来隔离推理行为。
核心贡献
- 构建人类-机器对齐框架: 本文建立了一个衡量人类与机器在理解混淆代码方面是否对齐的框架,并以人类的难度模式作为基准。
- 系统性评估: 通过对多种 Python 和 JavaScript 混淆层级的 LLM 进行全面研究,将模型行为与报告的人类难度模式进行了对比。
- 失效模式定位: 利用块模型和推理轨迹,作者识别了对齐发生的环节以及机器理解与人类理解产生分歧之处。
- 实证发现: 研究表明,推理增强型模型能够模拟人类对代码复杂度的敏感性,而指令微调和代码微调模型则不能。
结果
1. 与人类难度的对齐情况 (RQ1 & RQ2)
- 推理模型: 推理增强型模型(如 DeepSeek-R1-Qwen-7B、SmolLM3-3B)在不同混淆层级下与人类准确率表现出显著的正相关性(ρ≈0.30–0.47)。它们在人类感到困难的任务上也同样表现挣扎。
- 代码/指令模型: 指令微调和代码微调模型与人类表现几乎没有相关性,这表明它们的失效机制有着本质的不同。
- 专业水平: 推理模型在所有经验水平(初学者、中级、专家)下都表现出与人类难度模式的一致性。然而,没有任何模型能复现那种“专家反转”现象,即人类专家在面对中度对抗性重命名(L1b)时表现得比初学者更好。
- 架构 vs. 规模: 无论规模大小,推理模型始终优于代码和指令模型。值得注意的是,尽管 Phi-4 Mini (4B) 的原始准确率较低,但它在人类任务级行为方面的对齐度最高。
2. 思维链 (CoT) 与努力程度 (RQ3)
- 轨迹长度作为难度代理: CoT 轨迹长度与准确率之间存在显著的负相关性 (ρ=−0.52)。较长的轨迹往往对应着错误的答案,这表明轨迹长度追踪的是任务难度,而非混乱程度或有效推导的信号。
- 努力程度的缩放: 随着混淆程度的增加(从 L0 到 L2),模型的 CoT 长度呈现单调递增趋势;相比之下,人类的反应时间在 L0 到 L1 阶段跳跃后趋于平缓。这表明模型的计算努力程度呈线性增长,而人类则是切换了认知模式。
- Token 限制: 强大的推理模型在严格的 Token 限制下会表现崩溃,这证实了其性能依赖于“系统 2”的审慎思考。
3. 对抗性重命名与置信度 (RQ4)
- 自信的错误: 只有当语义位移(误导性名称)与标识符级扰动(高 Token 不确定性/峰值)同时发生时,对抗性重命名(L1b)才会触发高置信度的错误答案(HCI)。
- 原子级失效: 这种失效模式被定位在块模型的“原子层”。误导性的标识符破坏了表面线索与计算之间的映射,但并未必然破坏结构化推理。
- 模型差异: 在对抗性重命名下,置信度的变化方向(增加或减少)取决于具体的任务和模型。代码专用模型倾向于抑制置信度,而推理蒸馏模型则表现出相反的情况。
意义与启示
对软件工程的影响
- 模型选择: 对于需要代码理解、调试或审查的任务,推理增强型模型更具优势,不仅是因为其准确性,还因为其失效模式与人类开发者相符。这使得它们的推理过程更容易被检查、校准和监督。
- 过度依赖的风险: 本研究警告不要将冗长的推理过程(长 CoT)视为可靠性的标志;在强混淆环境下,长轨迹往往意味着挣扎。同样,当标识符语义可疑时(例如在混淆代码或遗留代码中),不应信任自信的解释,因为这可能导致高置信度的错误。
对软件安全的影响
- 混淆的有效性: 当前的 LLM 并未使传统的混淆技术失效。诸如控制流平坦化和对抗性重命名等变换仍然为模型制造了实质性的理解障碍,从而保留了混淆在抵御 LLM 辅助逆向工程方面的保护价值。
- 对抗性漏洞: 对手可以利用“原子级”漏洞,通过使用看似无害但具有误导性的标识符,诱导 LLM 自信地推断出安全行为,从而忽略恶意功能。这凸显了人类与机器之间共同存在的盲点。
- 分析助手: 推理增强型模型可以作为有效的恶意软件分析助手,因为它们的失效方式更具可预测性(以人类可理解的方式失效),这使得它们在对错误解释后果极其严重的安全性工作流中更容易受到监督。
本文结论指出,虽然 LLM 功能强大,但其对混淆代码的“理解”并不统一。推理增强型模型提供了对人类认知局限性的更接近的模拟,使其在需要人类监督的协作式软件工程和安全任务中更为适用。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。