It's been a wild 48 hours. Four separate security issues landed within two days of each other. If you run Laravel, there's a good chance all four touch your stack.
I've been answering questions about these in our GitHub discussions and Discord all day. Here's everything in one place: what happened and what I would do about each one.
| Issue | Severity | What to do |
|---|---|---|
| PHP security release | Critical (CVSS 9.2) | Upgrade to 8.5.12, 8.4.27, 8.3.36, or 8.2.35 |
| Laravel TokenGuard auth bypass | Critical (CVSS 9.2) | Upgrade to 13.29.0 or 12.68.0 |
| Node.js security releases | High | Upgrade to 26.12.1, 24.22.1, or 22.23.4 |
| eMudhra CA compromise | Critical for non-browser clients | Update ca-certificates on your servers and in your containers |
PHP released 8.5.12, 8.4.27, 8.3.36, and 8.2.35 on October 21. They fix two critical vulnerabilities (CVSS 9.2) that allow unauthenticated remote code execution. Every version before those releases is affected.
| Release line | Patched version |
|---|---|
| 8.5 | 8.5.12 |
| 8.4 | 8.4.27 |
| 8.3 | 8.3.36 |
| 8.2 | 8.2.35 |
Both bugs are in PHP's request handling, so they hit every way of serving PHP: PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP, and LiteSpeed. PHP rates mod_php as the highest risk. They have a working exploit where a single unauthenticated request triggers the attack before any of your application code runs.
Check which version you're running:
php -v
If you install PHP from your Linux distribution, the distributions got the patches ahead of time. Run your package manager's update and restart PHP.
Patched images are live in v5.0.2. It covers PHP 8.2, 8.3, 8.4, and 8.5 on Debian Bookworm, Debian Trixie, Alpine 3.23, and Alpine 3.24.
How you update depends on which tag you use:
| Tag type | Example | What to do |
|---|---|---|
| Floating | 8.4-fpm-nginx | Pull and redeploy |
| Release | 8.4-fpm-nginx-v5.0.1 | Change it to 8.4-fpm-nginx-v5.0.2 |
| Patch version | 8.4.26-fpm-nginx | Change it to 8.4.27-fpm-nginx |
If you use a floating tag, pull and restart:
docker compose pull
docker compose up -d
If you build your own image FROM serversideup/php, add --pull so Docker doesn't use the old base image from its cache:
docker compose build --pull
docker compose up -d
Then confirm you're on the patched version:
docker compose exec php php -v
PHP 8.1 and older will not. The PHP team did publish minimal source backports for 7.4, 8.0, and 8.1 for people who build from source. Those aren't official releases, and there won't be official Docker images for them. We also stopped building Debian Bullseye and Alpine 3.16 on September 3. If you're on any of those, this is the push to upgrade. Our upgrade guide walks through it.
Also keep in mind PHP 8.2 reaches end of life on December 31, 2026.
One thing that makes days like this a little less stressful: our images run as www-data instead of root. If someone does get code execution, they don't own the whole container.
Laravel published GHSA-f9x3-7vq9-cph6 on October 19. It's rated critical (CVSS 9.2).
If you use Laravel's built-in TokenGuard and run MySQL or MariaDB, an attacker can send a crafted, non-string token value that matches the wrong user in the database. Under certain database configurations, that lets someone log in as any existing user without their token. Every route behind that guard is exposed.
You're using TokenGuard if your config/auth.php has a guard with the token driver:
'guards' => [
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
The fix is in 13.29.0 and 12.68.0. There are no workarounds listed, so upgrade:
composer update laravel/framework
Then confirm the version you're running:
composer show laravel/framework | grep versions
Even if you don't use the token driver, I'd still upgrade. It's a patch release and it's one less thing to wonder about.
The advisory only lists fixes for 12.x and 13.x. If you're still on Laravel 11 or older, you won't get a patch for this one.
Node.js shipped security releases for every supported line on October 21. There are 10 CVEs in total. The four rated high are the ones I'd pay attention to:
dns.resolve truncating names that contain a NUL characterUpgrade to the patched version for your line:
| Release line | Patched version |
|---|---|
| 26.x | v26.12.1 |
| 24.x | v24.22.1 |
| 22.x | v22.23.4 |
A lot of Laravel developers only use Node to run npm run build with Vite. It's easy to think this doesn't matter. If that's all you use it for, the risk is lower. You should still update. If you run Inertia SSR or any Node process in production, update today.
Places to check:
nvm install 24, Homebrew, etc.)FROM node:... lines in your Dockerfilesnode-version in your GitHub Actions or GitLab CI config.nvmrc or .node-version files pinned to an older patch versionThese releases also include the updated CA store for the next issue.
This one is the strangest of the bunch. The private keys for eight eMudhra intermediate certificates were generated so badly that anyone could recover them from the public certificates. The keys were effectively tiny numbers. 🤯
Those intermediates chain up to roots trusted by Mozilla, Microsoft, Apple, and Chrome. Six are TLS certificates and two are for code signing. If you have the keys, you can issue a certificate for any domain that clients would trust.
Mozilla is tracking it in Bug 2083449. Dennis Jackson also put together a full write-up with patched versions for every platform.
Browsers already handled this. Firefox and Chrome blocked the certificates on October 17. Apple followed on October 19 and Microsoft on October 20.
The problem is everything that isn't a browser. When your Laravel app calls an API with the Http facade, Guzzle uses the CA bundle on your server or in your container. Same with curl, wget, and anything else making outbound HTTPS requests. If that CA bundle is old, your app still trusts these certificates.
On a Debian or Ubuntu server:
sudo apt update && sudo apt install --only-upgrade ca-certificates
On Alpine:
apk upgrade ca-certificates
Here are the patched ca-certificates versions for the platforms most of us run:
| Platform | Patched version |
|---|---|
| Debian 12 (Bookworm) | 20250419~deb12u2 |
| Debian 13 (Trixie) | 20250419+deb13u1 |
| Ubuntu 24.04 | 20260816ubuntu0.24.04.1 |
| Ubuntu 22.04 | 20260816ubuntu0.22.04.1 |
| Alpine | 20261020-r0 |
If you use composer/ca-bundle directly, update to 1.4.16 or 1.6.0.
For containers, don't patch a running container. Pull a fresh image and redeploy so the update is baked in. You can check which version an image ships with:
docker run --rm serversideup/php:8.4-fpm-nginx dpkg -s ca-certificates | grep Version
docker run --rm serversideup/php:8.4-fpm-nginx-alpine apk list -I ca-certificates
The write-up includes test hosts that serve certificates from the compromised chain. Run this from your server or inside your container:
curl https://dv-g3b-emudhra.we-have-a-problem.com/
You want a certificate error here. If the request succeeds, that machine still trusts the compromised intermediates.
Every one of these has a fix available today. Update PHP, Laravel, Node, and your CA certificates, then redeploy.
Have questions or stuck on an upgrade? Jump into our Discord and let us know.
If you'd rather not spend your next security week doing this yourself, we can handle it for you. Security updates and infrastructure are part of what we do for our clients every month.
We write code the same way -- production-grade, well-documented, and built to last. Two senior engineers available for a fraction of what a full-time hire costs.

We're a community of 3,000+ members help each other level up our development skills.
Active Discord Members
We help each other through the challenges and share our knowledge when we learn something cool.
Stars on GitHub
Our community is active and growing.
Newsletter Subscribers
We send periodic updates what we're learning and what new tools are available. No spam. No BS.
Be the first to know about our latest releases and product updates.