Claude Code Found a Linux Vulnerability Hidden for 23 Years

Michael Lynch

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

原文由 Michael Lynch 发布,订阅该博客

Nicholas Carlini 是 Anthropic 的一名研究科学家,他在[un]prompted AI 安全会议报告称,自己利用 Claude Code 在 Linux 内核中发现了多个可远程利用的安全漏洞,其中一个已隐藏长达 23 年未被发现。

Nicholas 对 Claude Code 在发现这些漏洞方面的效率之高感到十分惊讶:

我们现在在 Linux 内核中发现了多个可远程利用的堆缓冲区溢出漏洞。

我以前从未发现过这类漏洞。这非常、非常、非常难做到。

而有了这些语言模型,我一下子就找到了一堆。

——Nicholas Carlini 在 [un]prompted 2026 上的发言

Claude Code 是如何找到漏洞的

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

Nicholas 使用了一个类似下面的简单脚本:

# 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 漏洞

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

Nicholas 选择这个漏洞是为了说明,Claude Code 不只是会找一些显而易见的漏洞或套用常见模式。这个漏洞要求 AI 模型理解 NFS 协议 intricate 的细节。

这次攻击需要攻击者使用两个相互配合的 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,这是一个异常长但合法的 owner ID 取值。服务器授予了该锁。

随后,攻击者启动第二个 NFS 客户端——客户端 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 尝试获取该锁,但由于客户端 A 已持有该锁,NFS 服务器拒绝了请求。

问题在于,在第(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 年才发布。

多到报不过来的漏洞

Nicholas 在 Linux 内核中还发现了数百个潜在漏洞,但修复这些漏洞的瓶颈在于,需要人工去逐一梳理 Claude 的所有发现:

我在 Linux 内核中发现了太多漏洞,还没验证完,所以没法上报……我不会给 [Linux 内核维护者] 发送可能是垃圾的潜在问题,但这也意味着现在有好几百个崩溃是他们还没看到的,因为我还没时间去检查。

——Nicholas Carlini 在 [un]prompted 2026 上的发言

我检索了 Linux 内核,发现迄今为止 Nicholas 已直接修复或向 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()

大浪将至

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

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

演讲原视频

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

评论