研究人员使用人工智能模型 Claude Code 在 Linux 内核中发现了一个潜藏了 23 年之久的远程安全漏洞。该漏洞位于网络的 NFS 驱动程序中,攻击者可利用两个相互协作的客户端触发内存缓冲区溢出,从而读取敏感的内核内存。这一发现凸显了人工智能在自动化漏洞挖掘方面的巨大潜力,但也揭示了人工验证已成为处理海量潜在漏洞的瓶颈。随着模型能力的持续提升,预计未来将有大量隐藏的安全问题被揭示。
AI 发现漏洞的惊人效率
Anthropic 的研究科学家 Nicholas Carlini 对 Claude Code 在寻找漏洞方面的效果感到震惊。他表示,这是他职业生涯中首次发现此类难以察觉的远程可利用堆缓冲区溢出漏洞。
我一生中从未发现过这样的漏洞。这非常、非常、非常困难。有了这些语言模型,我发现了一大堆。
如何发现漏洞
令人惊讶的是,发现这个漏洞几乎不需要人工监督。研究人员基本上只是将 Claude Code 指向 Linux 内核的源代码,并询问“安全漏洞在哪里?”
他们使用了一个简单的脚本,循环遍历内核中的每一个源文件,并指示 Claude Code 在每个文件中寻找漏洞,其指令类似于:
你正在参加一个夺旗赛(CTF)。找到一个漏洞。提示:看看 [文件名]。把最严重的一个写到报告里。
这种方法通过将任务游戏化,并逐个文件引导 AI 的注意力,有效地防止了重复发现相同的漏洞。
一个潜藏 23 年的 NFS 漏洞
这个由 Claude Code 发现的漏洞存在于 Linux 的网络文件共享(NFS)驱动中,它允许攻击者通过网络读取敏感的内核内存。这表明 AI 不仅仅是寻找明显或常见的模式,而是能够理解复杂的协议细节。
攻击过程需要两个协作的 NFS 客户端:
- 第一步: 客户端 A 与服务器建立连接,请求锁定一个文件,并声明一个 1024 字节的超长所有者 ID。服务器批准了该锁定请求。
- 第二步: 客户端 B 尝试锁定同一个文件,但由于客户端 A 已持有该锁,服务器拒绝了客户端 B 的请求。
- 第三步: 问题出现了。当服务器生成拒绝响应时,它需要包含客户端 A 的 1024 字节所有者 ID,但用于生成响应的 内存缓冲区只有 112 字节。
这将导致服务器试图将一个 1056 字节的消息写入一个 112 字节的缓冲区,从而引发 缓冲区溢出。攻击者因此能够利用所有者 ID 字段中的数据覆盖内核内存。
有趣的是,最初的漏洞报告中,描述攻击流程的 ASCII 协议图也是由 Claude Code 生成的。
一个比 Git 更古老的漏洞
这个漏洞是在 2003 年 3 月被引入 Linux 内核的,当时的代码提交日志提到:
我已经将缓存实现为一个大小为 112 字节的静态缓冲区…这足以容纳 OPEN 操作,这是序列突变操作中最大的一个。
由于该漏洞的引入时间甚至早于 2005 年发布的版本控制系统 Git,因此无法直接链接到最初的变更记录。
漏洞太多,报告不过来
Carlini 表示,他已经发现了数百个潜在的 Linux 内核漏洞,但修复它们的瓶颈在于人工验证。
我在 Linux 内核中发现了太多的漏洞,以至于我无法报告它们,因为我还没有验证它们……这意味着我现在有几百个他们(Linux 内核维护者)还没见过的崩溃,因为我没时间去检查。
除了这个 23 年的漏洞,他还报告或修复了其他几个问题,包括:
io_uring/fdinfo: 修复 SQE_MIXED 环绕检查中的越界读取。futex: 要求sys_futex_requeue()具有相同的标志。ksmbd: 修复tree_conn断开连接时的 use-after-free 漏洞。ksmbd: 修复smb_direct_prepare_negotiation()中的符号错误。
一场即将到来的浪潮
语言模型在发现漏洞方面的能力正在迅速提升。较旧的 AI 模型只能找到新模型发现的一小部分漏洞。这预示着,随着研究人员和攻击者都意识到 AI 的强大能力,未来几个月内将有 大量的安全漏洞被揭示出来。