Claude Code Found a Linux Vulnerability Hidden for 23 Years

Michael Lynch

Claude Code 发现了一个隐藏了 23 年的 Linux 漏洞

Nicholas Carlini(尼古拉斯·卡里尼)是 Anthropic 的研究科学家,他在[un]prompted AI 安全大会报告称,他使用 Claude Code 在 Linux 内核中发现了多个可远程利用的安全漏洞,其中一个已隐藏了 23 年未被发现。

尼古拉斯·卡里尼对 Claude Code 在发现这些漏洞方面的出色效果感到十分惊讶:

我们现在在 Linux 内核中发现了多个可远程利用的 heap buffer overflow(堆缓冲区溢出)。

我这辈子以前从未发现过这类漏洞。要做到这一点非常、非常、非常困难。

有了这些 language model(大语言模型),我却找到了一堆。

——尼古拉斯·卡里尼,在 [un]prompted 2026 上的发言

Claude Code 是如何发现该漏洞的

尼古拉斯·卡里尼分享的这个漏洞最令人惊讶的地方在于,Claude Code 几乎不需要什么人工监督就能找到它。他基本上只是将 Claude Code 指向 Linux 内核源代码,然后问道:“安全漏洞在哪里?”

尼古拉斯·卡里尼使用了一个类似于下面的简单脚本:

# Iterate over all files in the source tree.
find . -type f -print0 | while IFS= read -r -d '' file; do
  # Tell Claude Code to look for vulnerabilities in each file.
  claude \
    --verbose \
    --dangerously-skip-permissions     \
    --print "You are playing in a CTF. \
            Find a vulnerability.      \
            hint: look at $file        \
            Write the most serious     \
            one to the /output dir"
done

该脚本告诉 Claude Code,用户正在参加一场capture the flag(夺旗赛)网络安全竞赛,需要帮助解题。

为了防止 Claude Code 反复找到同一个漏洞,该脚本会遍历 Linux 内核中的每一个源文件,依次告诉 Claude 漏洞可能在文件 A、然后是文件 B,以此类推,直到 Claude 已经检查过内核中的每一个文件。

NFS 漏洞

在演讲中,尼古拉斯·卡里尼重点介绍了Claude 在 Linux 的网络文件共享(NFS)驱动中发现的一个漏洞,该漏洞允许攻击者通过网络读取敏感的内核内存。

尼古拉斯·卡里尼选择这个漏洞是为了说明,Claude Code 不仅仅是在寻找显而易见的漏洞或查找常见模式。这个漏洞要求 AI 模型理解 NFS 协议工作原理的复杂细节。

该攻击需要攻击者使用两个相互协作的 NFS 客户端来攻击一台 Linux NFS 服务器:

     Client A                        NFS Server                        Client B
        |                                 |                                 |
(1)     |--- SETCLIENTID ---------------->|                                 |
        |<-- clientid_a, confirm ---------|                                 |
        |--- SETCLIENTID_CONFIRM -------->|                                 |
        |                                 |                                 |
(2)     |--- OPEN "lockfile" ------------>|                                 |
        |<-- open_stateid_a --------------|                                 |
        |--- OPEN_CONFIRM --------------->|                                 |
        |                                 |                                 |
(3)     |--- LOCK (1024-byte owner) ----->|  lock_owner = 1024b buf         |
        |<-- lock_stateid_a --------------|  Lock granted                   |
        |                                 |                                 |

(1) - 客户端 A 与 NFS 服务器进行三次握手以开始 NFS 操作。

(2) - 客户端 A 请求一个锁文件。服务器接受请求,客户端确认接受。

(3) - 客户端 A 获取该锁并声明一个 1024 字节的 owner ID,这是一个异常长但合法的所有者 ID 值。服务器授予了该锁。

然后攻击者启动第二个 NFS 客户端 Client B 与服务器通信:

     Client A                        NFS Server                        Client B
        |                                 |                                 |
(4)     |                                 |<-- SETCLIENTID -----------------|
        |                                 |--- clientid_b, confirm -------->|
        |                                 |<-- SETCLIENTID_CONFIRM ---------|
        |                                 |                                 |
(5)     |                                 |<-- OPEN "lockfile" -------------|
        |                                 |--- open_stateid_b ------------->|
        |                                 |<-- OPEN_CONFIRM ----------------|
        |                                 |                                 |
(6)     |                                 |<-- LOCK (same range) -----------|
        |                                 |                                 |
        |                     +-----------+-----------+                     |
        |                     | LOCK DENIED!          |                     |
        |                     | Encode response:      |                     |
        |                     |   offset:    8B       |                     |
        |                     |   length:    8B       |                     |
        |                     |   type:      4B       |                     |
        |                     |   clientid:  8B       |                     |
        |                     |   owner_len: 4B       |                     |
        |                     |   owner:     1024B    |                     |
        |                     |   TOTAL:     1056B    |                     |
        |                     +-----------+-----------+                     |
        |                                 |                                 |

(4) 客户端 B 与 NFS 服务器进行三次握手以开始 NFS 操作,与上面的 (1) 相同。

(5) 客户端 B 请求访问与 (2) 中客户端 A 相同的锁文件。NFS 服务器接受请求,客户端确认接受。

(6) 客户端 B 尝试获取该锁,但 NFS 服务器拒绝了该请求,因为客户端 A 已经持有了该锁。

问题在于,在步骤 (6) 中,当 NFS 服务器试图生成一条拒绝客户端 B 锁请求的响应时,它使用的内存缓冲区只有 112 字节。拒绝消息中包含了 owner ID,其长度可达 1024 字节,使得消息的总大小达到 1056 字节。内核将 1056 字节写入一个 112 字节的缓冲区,这意味着攻击者可以用步骤 (3) 中 owner ID 字段内自己控制的字节来覆盖内核内存。

趣闻:上面的 ASCII 协议图是 Claude Code 在其初始漏洞报告中创建的。

隐藏了 23 年未被发现

这个漏洞于 2003 年 3 月被引入 Linux 内核

[email protected], 2003-09-22 19:22:37-07:00, [email protected]
  [PATCH] knfsd: idempotent replay cache for OPEN state

  This implements the idempotent replay cache need for NFSv4 OPEN state.
  each state owner (open owner or lock owner) is required to store the
  last sequence number mutating operation, and retransmit it when replayed
  sequence number is presented for the operation.

  I've implemented the cache as a static buffer of size 112 bytes
  (NFSD4_REPLAY_ISIZE) which is large enough to hold the OPEN, the largest
  of the sequence mutation operations.  This implements the cache for
  OPEN, OPEN_CONFIRM, OPEN_DOWNGRADE, and CLOSE.  LOCK and UNLOCK will be
  added when byte-range locking is done (soon!).

这个漏洞非常古老,我甚至无法直接链接到它,因为它早于 Git,而 Git 直到 2005 年才发布。

多到无法全部报告的漏洞

尼古拉斯·卡里尼在 Linux 内核中还发现了数百个潜在漏洞,但修复这些漏洞的瓶颈在于需要人工对 Claude 的所有发现进行筛选:

我在 Linux 内核中发现了太多漏洞,多到还没来得及验证所以无法报告……我不会给 [Linux 内核维护者] 发送潜在的低质量内容,但这意味着我现在有几百个崩溃是他们还没看到的,因为我还没时间去检查。

——尼古拉斯·卡里尼,在 [un]prompted 2026 上的发言

我搜索了 Linux 内核,发现到目前为止尼古拉斯·卡里尼直接修复或向 Linux 内核维护者报告的 Linux 漏洞共有五个,其中一些甚至就在上周:

  1. nfsd: fix heap overflow in NFSv4.0 LOCK replay cache(上文所述)
  2. io_uring/fdinfo: fix OOB read in SQE_MIXED wrap check
  3. futex: Require sys_futex_requeue() to have identical flags
  4. ksmbd: fix share_conf UAF in tree_conn disconnect
  5. ksmbd: fix signededness bug in smb_direct_prepare_negotiation()

大浪潮即将来临

尼古拉斯·卡里尼的演讲中最引人注目的是大语言模型在发现漏洞方面的进步速度之快。尼古拉斯·卡里尼使用 Claude Opus 4.6 发现了这些漏洞,该模型由 Anthropic 在不到两个月前发布。他尝试在更早的 AI 模型上复现结果,发现 Opus 4.1(于八个月前发布)和 Sonnet 4.5(于六个月前发布)只能发现他使用 Opus 4.6 所发现漏洞的一小部分:

我预计在未来几个月内,随着研究人员和攻击者都意识到这些 AI 模型在发现安全漏洞方面的强大能力,将会有大量安全漏洞被揭露出来。

原始演讲

原文由 Michael Lynch 发布

本文章由 muse-spark-1.2-contributor 进行翻译