本文内容参考自 Michael Lynch 的博客文章:Claude Code Found a Linux Vulnerability Hidden for 23 Years。
Anthropic 的研究科学家 Nicholas Carlini 在 [un]prompted AI 安全会议 上报告称,他使用 Claude Code 在 Linux 内核中发现了多个可远程利用的安全漏洞,其中包括一个已经隐藏了 23 年之久的漏洞。
Nicholas 对 Claude Code 查找此类 Bug 的效率感到十分震惊:
“我们现在在 Linux 内核中发现了一系列可远程利用的堆缓冲溢出(heap buffer overflows)漏洞。我这辈子以前从未亲手发现过这类漏洞,这非常、非常、非常难做到。但有了这些语言模型,我一下子发现了一堆。” —— Nicholas Carlini,发表于 [un]prompted 2026
Claude Code 是如何发现这个 Bug 的?
最令人惊讶的是,Claude Code 在发现这个漏洞时几乎不需要人工监督。Nicholas 基本上只是将 Claude Code 指向了 Linux 内核的源代码,并问道:“安全漏洞在哪儿?”
Nicholas 使用了类似下面的简单脚本:
# 遍历源码树中的所有文件
find . -type f -print0 | while IFS= read -r -d '' file; do
# 告诉 Claude Code 检查每个文件中的漏洞
claude \
--verbose \
--dangerously-skip-permissions \
--print "你正在参加一场 CTF。请找出一个漏洞。提示:重点查看 $file。将最严重的一个漏洞写入 /out/report.txt。"
done
该脚本告诉 Claude Code,用户正在参加一场 CTF(Capture The Flag) 网络安全竞赛,需要帮助解决一个谜题。为了防止 Claude Code 反复发现同一个漏洞,脚本循环遍历 Linux 内核中的每一个源文件,并告诉 Claude:漏洞可能在 A 文件中,然后是 B 文件,依此类推,直到 Claude 遍历了内核中的每一个文件。
NFS 协议漏洞分析
在演讲中,Nicholas 重点介绍了 Claude 在 Linux 网络文件共享(NFS)驱动程序中发现的一个 Bug,该漏洞允许攻击者通过网络读取敏感的内核内存。
Nicholas 选择这个漏洞是为了展示 Claude Code 并不只是发现一些显而易见的 Bug 或寻找常见的模式。这个漏洞需要 AI 模型深入理解 NFS 协议的工作细节。
该攻击需要攻击者使用两个协作的 NFS 客户端(Client A 和 Client B)向 Linux NFS 服务器发起攻击:
Client A NFS Server Client B
| | |
(1)|--- SETCLIENTID --->| |
|<-- clientid_a -----| |
|--- SET_CONFIRM --->| |
| | |
(2)|--- OPEN "lockfile"| |
|<-- stateid_a ------| |
| | |
(3)|--- LOCK (1024B id)>| lock_owner=1024B |
|<-- lock_granted ---| (长 ID) |
| | |
(1) 客户端 A 与服务器进行三次握手。 (2) 客户端 A 请求锁定一个文件并获得批准。 (3) 客户端 A 获取锁并声明一个 1024 字节的 Owner ID,这是一个异常长但符合协议标准的合法值。
随后,攻击者启动第二个客户端 Client B:
Client A NFS Server Client B
| | |
(4)| |<--- SETCLIENTID ---|
| |--- clientid_b ---->|
| | |
(5)| |<--- OPEN "lockfile"|
| |--- stateid_b ----->|
| | |
(6)| |<--- LOCK (同范围) --|
| | 拒绝锁请求 |
| | 生成响应: |
| | 缓冲区只有 112B|
| | 要写入 1056B |
| | (缓冲区溢出!!) |
| +--------------------+
在第 (6) 步中,当服务器生成响应告知 Client B 锁请求被拒绝时,它使用了一个仅有 112 字节 的内存缓冲区。然而,拒绝消息中包含了之前 Client A 声明的 Owner ID(最高 1024 字节),导致消息总长度达到 1056 字节。内核试图将 1056 字节的数据写入 112 字节的缓冲区,这意味着攻击者可以通过控制 Owner ID 来覆盖内核内存。
注:有趣的是,上述 ASCII 协议图就是 Claude Code 在初始漏洞报告中自动生成的。
隐藏长达 23 年
这个 Bug 是在 2003 年 3 月 引入 Linux 内核的。由于这个 Bug 历史悠久,它甚至早于 Git 的诞生(Git 直到 2005 年才发布)。
漏洞数量远超人工处理速度
Nicholas 已经发现了数百个潜在的 Linux 内核 Bug,但现在的瓶颈在于需要人工审核所有结果:
“我在 Linux 内核中发现了这么多 Bug,但我没法全部提交,因为我还没来得及验证它们……我不想给内核维护者发送潜在的‘垃圾’信息,但这意味着现在有数百次崩溃信息还没被他们看到,因为我没时间核对。” —— Nicholas Carlini
目前 Nicholas 已经修复或报告了五个较为严重的漏洞:
- nfsd: fix heap overflow in NFSv4.0 LOCK replay cache (上文所述)
- io_uring/fdinfo: fix OOB read in SQE_MIXED wrap check
- futex: Require sys_futex_requeue() to have identical flags
- ksmbd: fix share_conf UAF in tree_conn disconnect
- ksmbd: fix signededness bug in smb_direct_prepare_negotiation()
大浪将至
Nicholas 的演讲中最引人注目的一点是:大语言模型在发现漏洞方面的进步速度惊人。Nicholas 使用的是 Anthropic 发布不到两个月的 Claude Opus 4.6。他在旧模型上尝试复现,发现八个月前的 Opus 4.1 和六个月前的 Sonnet 4.5 只能发现极小部分漏洞。
我们可以预见,在接下来的几个月里,随着研究人员和攻击者意识到这些 AI 模型在发现安全漏洞方面的强大威力,将会涌现出一股规模空前的安全漏洞发现浪潮。
参考资料: