使用 Claude 减少代码攻击面
摘要
Anthropic 研究主管 Chris Rohlf 总结了 Claude 如何自动分析并减少大型开源代码库的攻击面。该团队在 25 个项目上运行模型,发现了 493 个问题,展示了 AI 驱动的软件安全改进在实践中的可行性与经济性。
暂无内容
查看缓存全文
缓存时间: 2026/10/21 09:18
# 使用 Claude 减少代码的攻击面
来源:https://www.anthropic.com/research/attack-surface-reduction
*Chris Rohlf*
过去一年,我们发布了大量数据,表明前沿 AI 模型完全有能力发现(https://www.anthropic.com/research/mythos-preview)和利用(https://www.anthropic.com/research/exploit-evals)安全漏洞。然而,展示此前未知漏洞可能如何被利用,只是前沿 AI 模型在网络安全防御中能力的起点。在本文中,我们总结了我们在自动化攻击面分析与缩减方面的初步研究:即利用 AI 模型映射代码中可达的部分,然后移除或限制访问某个特定部署不需要暴露的所有内容。
自动化攻击面分析与缩减在短期内就能切实提升已部署软件的安全性。仅靠发现和修复单个漏洞来保障软件安全,这种方式难以扩展——修复一个关键漏洞并不能告诉你剩余漏洞的状况。相比之下,缩减代码的可达性可以降低未知漏洞的严重程度,包括那些可能正在被积极利用的漏洞。这些技术并不能移除代码中的未知漏洞,但它们使漏洞更难被触达,从而降低其严重程度。最小化代码库的攻击面可以在无需发现或修复任何单个漏洞的情况下,实现更好的安全效果。
下文预览了我们使用 Claude 对大型开源代码库应用攻击面缩减技术所收集的部分数据。我们这样做的目的是展示 Claude 能够通过我们所概述的方法,切实且经济地提升软件安全。具体而言,我们在 25 个项目(涉及多种语言)上运行了 Claude,共发现了 493 个问题。基于这些结果,我们讨论开发者如何将类似技术应用于自己的代码。
### 缩减代码库攻击面的方法
随着时间推移,软件往往会变得越来越复杂,新的抽象层、新的依赖和新的功能不断堆叠。这常常导致软件的实际行为与原始开发者的意图大相径庭。这也是攻击者往往如此成功的重要原因之一:他们研究的是代码在实际运行中的行为,而非其开发者预期或设计的运行方式。
自动化攻击面分析与缩减技术旨在发现不必要的攻击面,然后将相关代码移至适当的防护门槛之后。这可能涉及将代码从认证前移至认证后、从零点击移至一次点击、从默认开启改为显式选择启用,或者从协议的第一条消息移至会话状态机的更深处。有些代码本应在这些阶段之前可达,但大量代码并非如此。鉴于代码在数千甚至数百万行范围内的频繁变更所带来的复杂性,不必要的功能暴露往往无人察觉。
减少代码攻击面的方式有很多。在我们的研究工作中,我们特别聚焦于三种方法:
- **默认配置。** 我们发现了一些在出厂默认配置中可达、但并非任何默认功能所需的代码。
- **配置交互。** 我们发现了一些单独看起来合理的选项,但在组合配置时会产生问题(例如,静默禁用某个安全控制,或使某个功能的行为处于未定义状态,但其代码仍可访问)。
- **过早可达。** 我们发现了一些安全敏感且复杂的代码,它们在适当的安全控制(如认证)之前运行、在无需用户交互的情况下运行,或在协议状态转换之前运行。
我们希望了解 Claude 在多大程度上能够根据这三种攻击面描述,在大型复杂代码库中发现真实问题。我们分析了 25 个开源项目(涵盖超过五百万行代码),使用了包括 C、C++、Java、PHP 和 Python 在内的多种语言编写。Claude 在这些项目中建立了超过 17,000 个配置选项的清单。其中,3,842 个与安全相关的控制或功能配置有关。
为了研究需要,我们将这些开源项目分为三大类:
- **Public(公开)。** 这些项目旨在服务任何能访问到它们的用户,或消费来自无法识别身份的第三方所创建的数据。(例如,DNS 解析器解析上游应答,或代理解析源站响应。)
- **Gated(受控)。** 这些项目旨在服务已认证用户(如持有密码、密钥或证书的用户,或已注册的设备)。软件仍然允许任意客户端请求,但在用户完成认证之前不提供任何功能。
- **Private(私有)。** 这些项目为运营者自身的私有环境而构建和部署。在这种情况下,添加认证层等控制是可选的,但不在软件本身的范围内。
这些分类有助于为我们的结果提供背景。例如,我们预计 Public 类项目的相当大比例代码在默认配置中是可达的(因为其设计目的就是服务任何用户),而 Gated 类项目则恰恰相反。
### Claude 的发现
Claude 使用上述三种方法共发现了 493 个问题。其中有几个主题格外引人注目。
首先,Claude 发现全部 11 个 Gated 项目都存在非预期可达的代码(尽管这些代码在任何项目的总代码行数中占比不大)。具体而言,Claude 在 Gated 类项目的默认配置中发现了 93 个不必要的认证前攻击面、37 处在认证之前执行代码或记录状态的位置,以及 61 种静默削弱管理员所配置的认证前安全控制的配置组合。这些问题单独来看都不具备直接可利用性,但它们创造了远超必要的攻击面。
*各技术按项目类别划分的问题分布。在我们评估的 25 个项目中,10 个为 Public,11 个为 Gated,4 个为 Private。Gated 类项目的结果最为令人意外,"过早可达"类发现数量很高。*
其次,Claude 在处理配置交互问题时的工作产出了最有趣且最具影响力的发现(跨所有项目类型)。Claude 发现了 162 个安全敏感的配置组合,这些组合被系统接受时既不报错也不发出警告,同时也没有任何文档说明其交互时的预期行为。其中 94 例中,该组合静默关闭了一个安全控制。其余 68 例是同一安全机制中的不一致(例如,监听器或登录路径即使配置显示已禁用仍保持可达;两项设置冲突,且哪一项优先取决于它们在配置文件中的顺序;管理员配置的防护措施形同虚设,但其代码仍可访问)。尽管其中一些配置组合可能非标准或不常使用,但没有任何机制能阻止这些项目的管理员以这种方式配置和部署代码。
Claude 还发现了一种在四个互不相关的项目中独立出现的特定模式。其工作原理如下:管理员使用主机名或通配符模式(而非 IP 地址)编写远程客户端访问规则。当客户端连接时,服务器将该规则与客户端的主机名进行比对。服务器能否获知该主机名取决于控制反向 DNS 查询的单独选项(大多数项目默认将其关闭)。查询关闭时,服务器只有客户端的 IP 地址。服务器会将规则与该地址进行纯文本比对。但主机名模式永远无法匹配 IP 地址。这意味着拒绝规则永远不会生效,整个列表将处于 fail-open(失败放行)状态。一些受影响的项目在文档中提到主机名规则依赖于 DNS 查询已启用,但没有任何一个说明以这种方式编写的拒绝列表会产生 fail-open 行为。
第三,Claude 经常发现两个配置选项会以静默丢弃安全检查的方式发生冲突。在一个案例中,管理员可以要求每个连接的客户端用证书证明其身份。而在另一个选项中,代码本意只是延迟这项检查直到需要时执行,但实际上完全禁用了该检查。因此,一台配置为仅接受可信客户端的服务器会接受来自任何人的连接。这使大量请求处理代码(本应位于证书检查之后)暴露给了未认证客户端。在默认设置下,软件对这两个配置选项的组合照单全收且不发任何警告;文档中从未提及证书要求已被丢弃。这种冲突的配置组合在软件中存在了 21 年。
最后,Claude 在一个项目中发现了一个问题:该项目默认关闭认证(并期望管理员手动开启)。要求 TLS 客户端证书的选项在项目的大多数网络端点上得到了执行,但在少数其他端点上被静默忽略(那些端点通过不同命名空间的路径加载其 TLS 设置)。这意味着没有证书的客户端可以在受影响的端点上完成 TLS 握手并建立会话。被忽略的设置不会记录任何日志。该选项是否生效取决于管理员在配置中使用的命名空间。设置名称的完整形式在所有端点上都有效,但更短的形式——大多数示例中使用的那种——在受影响的端点上会被丢弃。
### 案例研究:OpenSSH
令人惊讶的是,按总代码行数的百分比衡量,Claude 实现最大攻击面缩减的项目是 OpenSSH。OpenSSH 是一个高质量的 C 代码库,提供安全的远程访问。Claude 追踪了 10.4 版本中 SSH 守护进程的输入路径,发现约 4,500 行用于 ML-DSA-44(一种后量子签名算法)的新实验性代码在默认配置下可被未认证客户端访问。ML-DSA 默认未启用,但无论管理员是否明确排除该算法,代码始终可达。守护进程会解析客户端发送的任何密钥类型(对于证书,还会验证内嵌的 CA 签名)。直到之后才会检查该密钥类型是否被允许。在配置未启用的情况下,让这段复杂且内存不安全的代码可达,没有任何合理理由。ML-DSA-44 中那 4,500 行代码约占默认 sshd 中 OpenSSH 自身认证前代码的 16%。我们连同补丁将此问题报告给了 OpenSSH 开发者。10.5 版本将检查移到了解析之前。
随后 Claude 发现了 10.5 版本检查中的两个缺口。第一个是客户端声称的内容与实际发送的内容不匹配。该检查查看客户端声明的算法名称,但解析器的选择是根据密钥数据块内嵌的类型字符串决定的。客户端可以声明 ssh-ed25519 以通过检查,但仍发送一个会被解析的 ML-DSA 密钥。
第二个缺口在于 10.5 版本检查对证书的处理。证书密钥类型默认启用。给定一个攻击者提供的证书,sshd 会在查阅配置之前,反序列化内嵌的 CA 公钥并用其执行完整的签名验证,支持任何算法。用户密钥签名路径被正确地置于允许连接到服务器的公钥列表之后进行管控,但 CA 签名路径没有。这使得二进制文件中每一个公钥签名验证器都可以被任何能完成密钥交换的客户端访问。我们构建了概念验证,并与维护者合作迭代了数轮修复。最终的修改将检查移到了解析器内部。编码密钥类型和证书的 CA 签名算法现在会在相应的反序列化或签名验证*之前*与配置的允许列表进行比对。
这一修复移除了大约五分之一的 OpenSSH 代码——这些代码是未认证客户端在默认构建中此前可以触达的。其中几乎全部是新的 ML-DSA 代码,现在即使客户端谎报其密钥类型或在其他可接受的证书中隐藏 ML-DSA CA 密钥,也无法触达。使用允许的 CA 算法签名的证书仍然会被解析和验证,但检查现在在*解析之前*运行。维护者在 10.6 版本(https://www.openssh.org/releasenotes.html#10.6)中发布了上述变更。
OpenSSH 是世界上被审计最多的代码之一。如果不必要的可达性能在那里存活下来,它就可能在任何地方存活。这表明减少代码库的攻击面很可能在众多重要代码库中带来丰厚的回报。
### 结论
要衡量任何给定代码库中存在多少未知漏洞,也许是不可能的。而且有大量数据表明,攻击者只要有足够的时间,就能且将会发现这些漏洞(尤其是配备了前沿 AI 模型时)。但是,一个减少了代码中不必要攻击面的防御者,可以一次性降低该代码中所有未知漏洞带来的风险——包括那些已被悄然利用的漏洞。OpenSSH 是世界上被审计最多的 C 代码之一。然而它仍然发布过约 4,500 行实验性签名解析代码,攻击者可以在任何配置检查之前触达。
我们将上述攻击面缩减技术整合为一个可复用的 Claude 技能(skill),并正在将其集成到 OSS-Scanner(https://www.anthropic.com/research/launching-opt-in-vuln-finding-service-for-open-source)中。该技能对代码库执行三轮扫描。每轮都从零开始(使用空的上下文窗口),仅接收上一轮传递的一小段上下文。
在第一轮中,技能检查是否存在默认配置允许可达但不被任何预期功能使用的代码。第二轮中,它检查在任何配置下,在任何硬性门槛(如认证)之前运行、或在协议状态机入口点之前运行的代码。最后,第三轮中,技能评估哪些配置组合会静默关闭安全控制或降低其效能。在每一轮中,Claude 都会从代码中建立入口点清单,并通过程序的动态追踪确认每项发现。对于默认配置的发现,它会设计并实现一个防护门槛,并确保这不会改变程序的默认行为。具体做法是将项目自身的测试套件(以及一个黑盒回归套件)与基线进行比对;修改后的构建必须产生完全相同的结果。任何会改变非默认配置的门槛都会被搁置,交由人工判断。对于另外两轮扫描,它会提出诸如重新排序配置检查之类的修改建议。
相似文章
Claude Code 在大型代码库中的工作原理
Anthropic 的博文详细介绍了在大型复杂代码库中使用 Claude Code 的最佳实践,阐述了代理搜索以及如 CLAUDE.md 文件等扩展的“利用”如何在大规模下提升导航和性能。
研究人员使用Claude入侵OpenAI
研究人员使用Anthropic的Claude利用OpenAI社区论坛中的一个漏洞,获得了对内部系统和一名员工ChatGPT账户的访问权限。Anthropic还报告称,其26%的AI开发工作现在由其Claude模型主导,这引发了关于递归自我改进的担忧。
安全研究人员利用Claude帮助入侵OpenAI
安全研究人员利用Anthropic的Claude AI通过利用Discourse中的漏洞入侵OpenAI,获得内部系统访问权限,并因披露漏洞获得漏洞赏金。
@_mattata: Anthropic 发布了一个相当简洁的代码审计工具,用于识别具有潜在安全影响的漏洞。它…
Anthropic 发布了一个开源代码审计参考工具,用于使用 Claude 进行自主漏洞发现和修复,涵盖了 recon→find→triage→report→patch 流程,主要针对 C/C++ 内存漏洞。它是一个模板/参考实现,而非生产就绪产品,同时还提供名为 Claude Security 的托管选项。
Anthropic 将 Claude Security 推出公开测试版:它扫描你的代码,发现漏洞并提出修补方案。
Anthropic 已面向企业客户推出 Claude Security 的公开测试版,这是一款 AI 驱动工具,通过理解业务逻辑和数据流来扫描代码库,识别漏洞并提出修补方案。