返回
快讯

29年旧 Squid Proxy Bug “Squidbleed” 可泄露明文 HTTP 请求

Squid web proxy 里一个 heap over-read bug 可把其他用户的明文 HTTP request 泄露出去,甚至包括 credentials 和 session tokens。这个问题源自 1997 年的 FTP 解析改动,影响默认配置,已命名为 Squidbleed(CVE-2026-47729)。

CVE-2026-47729CVE-2026-50012

Squid web proxy 里一个 heap over-read,可能会把另一个用户的明文 HTTP request 泄露出去,包括它携带的任何 credentials 或 session tokens,给任何已经被允许通过同一个 proxy 发送 traffic 的人看。

这个 bug 可追溯到 1997 年的一项 FTP-parsing 改动,而且在 Squid 的 default configuration 里到现在还是有效的。Calif.io 的研究员在 6 月披露了这个问题,并把它命名为 Squidbleed(CVE-2026-47729),名字是仿照 Heartbleed,因为它以同样方式泄露 memory。

Squid 把这个描述成 trusted client 的攻击:也就是已经被允许使用 proxy 的人,而不是互联网上随便什么 host。这和 Squid 通常的使用场景吻合,比如 school、office 和 public Wi-Fi 这种 shared networks。在这些设置里,attacker 只是同一个 proxy 的另一个用户。

这个泄露也只会碰到 Squid 能读到的 traffic。正常的 HTTPS 走的是一个 opaque CONNECT tunnel,所以 Squid 根本看不到里面;被暴露出来的是明文 HTTP,以及那些由 Squid 解密并检查的 TLS-terminating setups。

attacker 还需要让 proxy 去连一个他们控制、运行在 port 21 的 FTP server。FTP 和这个 port 都是默认开启的。

如何发生泄露

这个 bug 在 Squid 的 FTP directory-listing parser 里。为了兼容那些会在 listing 里额外填充空格的旧 NetWare servers,代码用一个 loop 来跳过 whitespace:while (strchr(w_space, *copyFrom)) ++copyFrom;。

如果 attacker 的 FTP server 送出一行 listing,刚好在 timestamp 后面结束,而且没有 filename,copyFrom 就会落到 string 的 null terminator 上。strchr 会把这个 terminating NUL 当成它要搜索的 string 的一部分,所以它会返回一个 pointer 而不是 NULL,于是这个 loop 就不会停。它会一路走出 buffer 的边界,而 xstrdup 会把后面跟着的内容当作 filename 复制回 attacker。

被泄露出来的 bytes 才是有用的部分。Squid 会重用已经释放的 memory buffers,但不会先清零,所以一个最近装过受害者 HTTP request 的 4KB buffer,里面通常还保留着大部分内容。短的 FTP line 只会覆盖最前面几个 bytes;over-read 会把剩下的内容读出来。

Calif 的 demo 会从和同一个 proxy 共用的受害者那里拉出一个 Authorization header,已经足够冒充那个用户。概念验证 code 已经公开,而到本文写作时为止,还没有报告说有在野 exploitation。

该怎么做

如果你要打补丁,确认的是 fix,不只是 version。要确认 guard 在 FtpGateway.cc 里,或者检查你发行版的 backport,因为各个 distro 会自己打包 build(Debian 提供的是 Squid 5.7)。

公开 thread 里目前还有不一致:maintainer Amos Jeffries 一开始说 Squid 7.6 已经带了这个 fix,后来又更正为 7.7;而在 6 月 22 日,Debian 的 Salvatore Bonaccorso 指出,所引用的 commit 看起来其实已经在 7.6 里了。

这个修补很小,只是在有漏洞的 strchr calls 之前加一个 null-terminator check,4 月合并到 development branch,5 月合并到 v7。Squid 7.6 另外还修补了 CVE-2026-50012,这是一个不相关的 cache_digest heap overflow。

更干净的做法,其实也是研究员建议的:把 FTP 关掉。Chromium 多年前就已经移除了 FTP,而大多数 network 几乎不传这个东西,所以不管你跑什么 build,关闭它都能免费移除这个 attack surface。

风险是真实的,但有范围。SUSE 给它的评级是 moderate,CVSS 6.5,而这个 vector 也解释了分数:attacker 需要 proxy access(low privileges),而唯一受影响的是 confidentiality,对 integrity 或 availability 都没有影响。

Calif 把能很快抓到这个 strchr 细节的功劳归给 Anthropic 的 Claude Mythos Preview,也就是 Project Glasswing 背后的 model。这和 AI agents 在别处挖出 buried parser bugs 的情况很像,包括在 FFmpeg 里也是如此。Calif 暗示,Squid 的 FTP code 可能不是最后一个忘了停下来读取的地方。