在广泛使用的开源代理(转发网络通信的服务器)Squid 中,发现了一个能窥探他人通信内容的漏洞。安全公司 Calif.io 于 6 月公布,并将其命名为「Squidbleed」(CVE-2026-47729)。引发问题的代码写于 1997 年,在长达 29 年的时间里无人察觉。而找出它的关键,正是 Anthropic 开发的 AI 模型 Claude。
什么是「Squidbleed」
Squidbleed 是一个让本不该拥有访问权限的一方,得以读取 Squid 正在使用的部分内存的漏洞。其名称源自 2014 年引发广泛关注的「Heartbleed」,因为两者都以相同方式泄露内存内容。
泄露的是经过同一个 Squid 的其他用户的通信数据。如果是未加密的 HTTP 通信,其中所夹带的密码和会话令牌(用于保持登录状态的认证信息)也有被窃取的风险。从技术上说,它属于「堆溢出读取(heap over-read)」(读取超出程序所分配内存区域之外的缺陷)。
起因是 1997 年写下的一行代码
问题出在 Squid 解析 FTP(文件传输机制)目录列表的部分。为了兼容会用多余空格填充列表的老旧设备,代码中写有如下跳过空格的处理:
while (strchr(w_space, *copyFrom)) ++copyFrom;
此时,如果攻击者一方的 FTP 服务器返回一个不含文件名的残缺列表行,读取位置就会抵达标示字符串结尾的「空字符(null 终止符)」。C 语言的字符查找函数 strchr 会把这个终止符也当作查找字符串的一部分,因此返回的是指针,而非本应返回的 NULL。结果循环无法停止,读取便越过所分配内存的边界继续进行。
Squid 随后会把越界读取到的区域当作「文件名」返回给攻击者。由于 Squid 会在不清除内容的情况下复用已释放的内存,前一刻还存放着其他用户 HTTP 请求的区域,就这样原封不动地落入攻击者手中。
攻击成立的条件
不过,并非任何人都能随意利用。能够发起攻击的,仅限于已获准使用该代理的内部人员。主要设想的是学校、办公室、公共 Wi-Fi 等多人共用一台代理的环境。
泄露的只是 Squid 能够读取的通信,普通的 HTTPS 通信会作为加密隧道直接放行,不在此列。此外,攻击者还需要自行准备一台代理能够访问的 FTP 服务器。但由于 FTP 功能与通信端口(21 端口)在 Squid 的初始设置中即为开启,这一条件绝谈不上特殊。
揪出 29 年前疏漏的 AI
最早指出这个漏洞的,是 Anthropic 的 AI 模型「Claude Mythos Preview」。Calif.io 在以防御为目的的安全研究项目「Project Glasswing」中使用该模型检查 Squid 的 FTP 处理,据称它几乎瞬间就看穿了 strchr 的这一怪癖。
一行躲过了 29 年人工代码审查与审计的代码,被 AI 轻松找出。类似「埋藏在解析处理中的缺陷」,在视频处理库 FFmpeg 等其他软件中也接连被 AI 发现。Calif.io 暗示,Squid 的 FTP 代码中或许还残留着同类疏漏。
应对与严重程度
应对方法有两种。其一是把 Squid 更新到修复版。修复本身很小,即在调用有问题的 strchr 之前先检查是否为空字符;它于 4 月并入开发版,5 月并入正式的 v7 系列。不过,修复究竟从哪个版本开始纳入,在开发者之间也说法反复。更新后最好不要只看版本号,而应确认相关代码是否确实已被修正。
其二是干脆停用 FTP 功能。主流浏览器 Chromium 已经废除 FTP 支持,如今几乎没有使用 FTP 的场景。研究者也更推荐这种做法。
严重程度在 CVSS 上被评为 6.5 的「中等」。因为攻击需要代理的使用权限,影响也仅限于信息泄露,不会造成篡改或服务中断。概念验证代码已经公开,但截至目前尚未确认有实际攻击发生。
总结
Squidbleed 尽管成立条件有限,却是一个利用了潜藏 29 年之久的疏漏的棘手漏洞。同时,人眼多年未能察觉的区区一行代码,被 AI 瞬间看穿,这一点本身也备受关注。可以说,它是将 AI 用于安全调查这一潮流的一个缩影。如果你正在运行 Squid,不妨更新到修复版,或在不需要 FTP 时将其停用。
