docker pull Is Not a Patch: PHP RCE Inside Running Containers
Your Dockerfile is honest, your tag is current, your pipeline is green, and the container serving traffic right now is still running the binary it was born with. That is the whole shape of this one. Two PHP flaws, CVE-2026-109618 and CVE-2026-109619, were patched on 21 October 2026, and in container estates the gap between “patched image” and “patched process” is where the exposure lives.
The versions that count
Fixed releases: PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35. Everything earlier in those branches is unpatched, and 8.1 and below are end-of-life, so there is no release to wait for.
Both flaws give unauthenticated remote code execution. The worst layout is Apache with mod_php, where the request is handled before any application code runs, which also means your framework middleware and your edge rules are not part of the defence.
Upstream php images were rebuilt: php:8.2-cli and php:8.2-apache report 8.2.35, php:8.3-fpm reports 8.3.36, php:8.4-fpm-alpine reports 8.4.27, php:8.5-cli reports 8.5.12. The trap is elsewhere: Alpine 3.21 stable still carries php84-8.4.14, so any image that installs PHP from the distribution repository builds happily and ships something vulnerable.
Recreate, then look inside
docker compose pull && docker compose up -d
docker compose exec web php -v
On Kubernetes the equivalent is a rollout restart after the tag or digest moves, and the same rule applies afterwards: read the version from the process, not from the manifest. If you pin digests, this is the week those pins need a deliberate bump rather than a renewal.
Pull your PHP from php.net, from the distribution’s repositories, or from the vendor channel your base image belongs to. Sources that appeared this week with convenient tooling are not in that list.
A check for hosts, runners and build agents
This script walks a machine and reports PHP binaries, PHP-FPM workers with a restart still pending, and containers, which makes it useful on a build host nobody has inventoried in a year.
curl -fsSL https://blog.limewire.com/content/files/2026/10/php-exposure-check.txt -o php-exposure-check.sh
less php-exposure-check.sh
sh php-exposure-check.sh
SHA-256 c13cd5690c9d352c6a95e854602be2f330a0799435c05a8261037401fcf50255. Exit status 0 means every PHP found is patched, 1 means something vulnerable or end-of-life turned up, 2 means no PHP on the box. That makes it pipeline friendly.
Where egress policy blocks that curl, grab the browser copy published by our verified @limewireofficial account: the same file, hosted on LimeWire. Identical bytes, no account required, no download ceiling, no expiry to schedule around.
The deeper write-up
Full disclosure on our credentials: two decades ago, LimeWire was the reason a generation’s Shared folder filled up with files called install_now.exe. We are not involved in this PHP vulnerability in any way, we have grown up considerably since, and we do recognise a parser trusting the wrong input when we see one.
The per-platform work — distribution packages, EOL backports, mitigations that help and the one that makes things worse — is laid out in our complete analysis of the PHP RCE pair. Read that before you write the ticket for the rest of the fleet.
Upload files