29年前埋下的定时炸弹
来自 Calif.io 的安全研究人员近日披露了一个存在于 Squid 代理服务器中长达 29 年的严重内存泄露漏洞。因其攻击方式与当年臭名昭著的 Heartbleed 极为相似,该漏洞被命名为 Squidbleed,漏洞编号 CVE-2026-47729。
这个漏洞的根源可以追溯到 1997 年。当时开发人员为了兼容古老的 NetWare 服务器,在 FTP 目录解析代码中添加了一段处理空格的逻辑。这段有问题的代码不仅存活了近三十年,至今仍存在于所有 Squid 版本的默认配置中。
危险有多大?同一 WiFi 就能偷你的密码
Squid 是全球使用最广泛的开源代理服务器之一,广泛部署在学校、企业、公共 WiFi 热点等共享网络环境中。而这个漏洞最可怕的地方在于:攻击者只需要是同一代理的普通用户,不需要任何特殊权限。
也就是说,如果你正在使用公司、学校或咖啡馆的公共 WiFi,那么旁边任何一个连接了同一个网络的人,都有可能利用这个漏洞窃取你的网络流量。
具体会泄露什么?
- 所有明文 HTTP 请求的完整内容
- 网页登录的用户名和密码(Authorization 头)
- 网站会话 Cookie 和令牌
- 所有未加密的浏览记录
不过漏洞影响范围也有明确边界:正常的 HTTPS 流量由于使用了 CONNECT 隧道,Squid 无法解密,因此不会被泄露。但如果企业使用了 Squid 进行 TLS 解密和内容审计,那么所有经过该代理的 HTTPS 流量也将面临泄露风险。
漏洞原理:一个小小的判断失误
这个能泄露内存的严重漏洞,起因只是一行极其简单的代码:
while (strchr(w_space, *copyFrom)) ++copyFrom;
这段代码的本意是跳过 FTP 目录列表中的多余空格。但如果攻击者控制的 FTP 服务器返回一个“畸形”的目录行——在时间戳之后直接结束,没有文件名——那么 copyFrom 指针就会指向字符串的结束符 \0。
问题就出在这里:C 语言的 strchr 函数会把字符串结束符也当作有效字符进行搜索,因此它永远不会返回 NULL,导致循环无限执行,指针直接越界访问缓冲区之后的内存。这涉及到 C/C++ 中指针与内存管理的经典陷阱。
更致命的是,Squid 在释放内存时不会清零。一个刚刚存放过受害者 HTTP 请求的 4KB 内存块,在被 FTP 解析代码复用后,除了开头几个字节被覆盖,其余大部分内容都原封不动地保留着。攻击者通过越界读取,就能像翻阅一本未被擦干净的笔记本一样,完整获取到这些敏感数据。
研究人员已经发布了概念验证代码,演示了如何从同一代理的其他用户那里窃取 Authorization 认证头,从而完全接管受害者的网站账号。截至目前,尚未有在野利用的报告。

紧急修复指南:这样做最安全
由于 Squid 各版本的修复状态目前存在混乱,官方维护者先是称 7.6 版本已修复,后又更正为 7.7 版本,而 Debian 安全团队则表示相关补丁其实已经包含在 7.6 中。因此单纯升级版本可能无法确保安全。
最稳妥的修复方案:
1. 立即禁用 FTP 代理功能(强烈推荐)
- 这是最推荐的方法,一劳永逸。
- Chrome 浏览器早在多年前就已移除 FTP 支持。
- 现代网络中 FTP 流量几乎可以忽略不计。
- 无论你使用哪个版本,禁用 FTP 都能彻底消除攻击面。
2. 手动验证补丁
- 检查
FtpGateway.cc 文件中是否添加了空终止符检查。
- 确认你使用的 Linux 发行版已经正确回传了补丁。
SUSE 将该漏洞的 CVSS 评分定为 6.5 分(中危),主要原因是攻击者需要先获得代理访问权限,且仅影响机密性,不破坏数据完整性或服务可用性。
但对于绝大多数普通用户来说,这个漏洞的实际风险远高于评分所显示的。在公共 WiFi 环境中,“获得代理访问权限”几乎没有任何门槛,这直接关系到每一位网络使用者最基础的 网络/系统 安全。
这个埋藏了 29 年的漏洞,是由 Anthropic 的 Claude Mythos Preview 大模型在代码审计中发现的。这也是 AI 继在 FFmpeg 等项目中发现多个深度隐藏的解析器漏洞后,再次展现出在软件安全领域的强大能力。云栈社区将持续关注此类由自动化工具发现的深层安全威胁。
资讯来源:Calif.io 安全研究报告


|