A Heartbleed-style vulnerability that leaks internal memory from every version of Squid Proxy in its default configuration. A one-line bug — a quirk of strchr and the null terminator — that survived 29 years of releases, audits and rewrites.
Squid renders a nice HTML page when you browse an FTP directory through it. But FTP has no standardized machine-readable listing format — the LIST command just returns something that loosely resembles ls -l.
In January 1997, a fix taught Squid to handle NetWare FTP servers, which pad four spaces between the timestamp and the filename instead of one. That whitespace-skipping code is still here, nearly 30 years on — and it carries the bug.
It comes down to C's favorite footguns: null-terminated strings, pointer arithmetic, and one weird strchr edge case.
strchr(w_space, '\0') returns non-NULL — the terminating NUL is considered part of the string. So when a listing line has no filename, *copyFrom is '\0', the loop doesn't stop, ++copyFrom walks straight off the end of the buffer, and xstrdup copies whatever lives next in heap memory.
Pointer skips the space, lands on l, stops. xstrdup copies "login". Correct.
Pointer walks past \0 into adjacent heap. xstrdup copies a stranger's memory.
How a freed buffer full of someone else's HTTP request finds its way back out through an FTP directory listing. Step through it.
Squid's pools never zero recycled buffers. A short FTP line overwrites only the first few dozen bytes of a freed 4 KB buffer — the rest is a stranger's HTTP request, and the overread walks right into it. Run the exploit.
How much is actually exposed, and why a stock install is enough. Figures below are illustrative estimates, not measured telemetry.
A fix teaches ftpget to recognize NetWare servers and skip whitespace before filenames. The whitespace-skipping strchr loop predates all available commit history.
The code is ported, refactored and modernized again and again — the loop survives every pass. The Squid running on a 2026 airplane Wi-Fi network was released nearly a decade ago, and it's affected too.
From 7.x, incoming requests are allocated straight from MEM_4K_BUF — the very pool the FTP parser reclaims. On older builds the request still reaches the pool once promoted past 2 KB.
Asked to investigate Squid's FTP state machine, the model flags the strchr(w_space, '\0') quirk almost immediately. Reported responsibly by Califio with Anthropic; assigned CVE-2026-47729 and patched.
Conceptually, yes — it's a buffer overread that discloses adjacent memory which may belong to other users. Unlike Heartbleed it's read-bounded by where the heap walk happens to stop, and the impact is more situational, but it can still leak credentials and session data from cleartext traffic.
Largely. HTTPS is relayed as an opaque CONNECT tunnel, so its contents never sit in a leakable buffer. The exposure is to cleartext HTTP and to setups where Squid terminates TLS itself. The FTP egress precondition still applies.
No. FTP is enabled by default and port 21 is in the default Safe_ports ACL. The attacker only needs an FTP server reachable from your proxy and the ability to make the proxy fetch from it.
It's tracked as CVE-2026-47729. A one-line fix — a null check before strchr — is available. If you can't update immediately, disable FTP as shown above.
Califio, using Claude Mythos Preview to investigate Squid's FTP state machine, in partnership with Anthropic. Full write-up and proof-of-concept are linked below.