PHP 8.5.11 security release: what production teams should check
PHP 8.5.11, 8.4.26, 8.3.35 and 8.2.34 fix eleven advisories, including a SoapServer crash. CVEs, triage, version checks and upgrade steps for packages and Docker.
10 min read

In this article
On 24 September 2026 the PHP project released 8.5.11, 8.4.26, 8.3.35 and 8.2.34, all marked as security releases. Together they fix eleven advisories on every supported branch, one rated high (an unauthenticated crash of any SoapServer endpoint) and the rest medium or low, covering TLS certificate checks, credential leaks on HTTP redirects, a PHP-FPM access-control bypass over IPv6, Phar archives and mysqlnd. This article lists exactly what was fixed, with the CVE and GitHub advisory identifiers from php.net, how to tell which ones affect your servers, how to check whether you are patched when your PHP comes from a distribution or a Docker image, and the three fixes that can change behaviour in production.
Checked with: the php.net ChangeLog and release announcements, the php/php-src GitHub security advisories, the Debian and Ubuntu security trackers and Docker Hub, in the first week of October 2026. The check script and redirect test below ran on an unpatched PHP 8.5.7 CLI on macOS.
Which versions to install
All four supported branches were released on the same day (PHP 8 ChangeLog; branch support dates from php.net supported versions):
| Branch | Fixed version | Support (php.net) |
|---|---|---|
| 8.5 | 8.5.11 | Active support to 31 Dec 2027, security to 31 Dec 2029 |
| 8.4 | 8.4.26 | Active support to 31 Dec 2026, security to 31 Dec 2028 |
| 8.3 | 8.3.35 | Security fixes only, to 31 Dec 2027 |
| 8.2 | 8.2.34 | Security fixes only, ends 31 Dec 2026 |
PHP 8.1 and older receive nothing from php.net. If you are on 8.2, this is one of its last releases; plan the move now, using our PHP 8.2 end-of-life checklist. Laravel teams moving to 8.5 can follow our Laravel and PHP 8.5 compatibility test plan; this article does not repeat it.
What was fixed: the security advisories
Severities and scores come from each advisory in the php-src security advisories, all published on 24 September 2026. Every advisory below lists the same fixed versions: 8.2.34, 8.3.35, 8.4.26 and 8.5.11.
| Area | Advisory and CVE | Severity | What it means |
|---|---|---|---|
| SOAP server | GHSA-rgrp-mwpx-f6rm, CVE-2026-91765 | High, 7.5 | Unbounded recursion on deeply nested XML: an unauthenticated request can crash any SoapServer endpoint |
| SOAP client | GHSA-cj93-vc83-wgqv, CVE-2025-14181 | Medium, 6.5 | Integer overflow to heap buffer overflow when a malicious SOAP server sends huge chunked responses |
| OpenSSL | GHSA-xr7j-rvgx-xq5p, CVE-2026-91767 | Medium, 6.5 | Heap over-read when a TLS server presents a crafted wildcard name; reachable from default client streams |
| OpenSSL | GHSA-vvx9-73fr-5jjx, CVE-2026-91769 | Medium, 4.3 | Hostname verification fell back to the certificate CN after a SAN mismatch, against RFC 6125 |
| PHP-FPM | GHSA-62xp-839h-2637, CVE-2026-91768 | Medium, 6.5 | listen.allowed_clients compared only 12 of 16 IPv6 bytes, so each entry allowed a whole /96 |
| HTTP wrapper | GHSA-fpwc-w8rq-cr92, CVE-2026-91766 | Medium, 5.9 | Authorization, Cookie and Proxy-Authorization headers were forwarded on cross-origin redirects |
| HTTP wrapper | GHSA-7875-c8px-7q5f, CVE-2026-93682 | Medium, 5.3 | One-byte over-read on a redirect with an empty Location header |
| Stream filters | GHSA-88hq-2827-7pg6, CVE-2026-92842 | Medium, 5.9 | Out-of-bounds read in convert.* filters when line-break-chars contains a NUL byte |
| Phar | GHSA-j3wh-g957-2m85, CVE-2026-6103 | Medium, 4.0 | TAR size overflow lets a crafted archive inject entries that PharData lists and extracts |
| Windows | GHSA-9f67-6fw4-hpfp, CVE-2026-17545 | Medium, 6.9 | Reserved device names such as CON or NUL in paths opened devices, hanging workers |
| mysqlnd | GHSA-r6x9-5r99-36j7, CVE-2025-1218 | Low, 3.1 | Packet over-reads when talking to a malicious or compromised MySQL server |
8.3.35 and 8.2.34 also include GHSA-ch8v-r6jh-4vvr (low, no CVE): FILTER_SANITIZE_ENCODED did not reliably encode the byte 0xFF. It was fixed publicly in 8.4.25 and 8.5.10 in August and backported now. The two CVE identifiers from 2025 are not typos: they were reserved earlier and published with these releases. Besides the advisories, 8.5.11 carries the usual bug fixes, among them several use-after-free fixes in DOM and Intl and an OPcache tracing JIT crash.

Triage: which fixes matter for your servers
Patch everything, but patch the exposed hosts first:
- Public SOAP endpoints are the clear priority. CVE-2026-91765 needs no authentication: a single nested request crashes the worker, and repeated requests take a pool down. The fix caps XML depth at 2,048 levels.
- Applications that call other services over HTTPS with PHP streams (
file_get_contents('https://...'),SoapClient,stream_socket_client) are exposed to the two OpenSSL issues when talking to a hostile or compromised server. cURL-based clients such as Guzzle's default handler use libcurl's own TLS checks instead. - Code that sends credentials through the
http://wrapper withfollow_locationcould leak them to whatever host a redirect points at. We confirmed this on 8.5.7, shown below. - PHP-FPM listening on an IPv6 TCP address with
listen.allowed_clientsaccepted any client sharing the first 96 bits of an allowed address. Unix sockets and IPv4 were not affected. - Upload features that open user TAR files with
PharData, and Windows servers that build paths from user input.
Check what you are running
This script compares the running version with the patched release for its branch and lists which affected extensions are loaded. Run it with the same binary and configuration as production; PHP-FPM can use a different build from the CLI, so also call it once through FPM if in doubt. Exit code 1 means "older than the upstream fix", which for distribution packages means "check the vendor advisory", because Debian and Ubuntu backport fixes without changing the upstream version number.
<?php
declare(strict_types=1);
/**
* Checks a PHP runtime against the 24 September 2026 security releases
* (8.5.11, 8.4.26, 8.3.35, 8.2.34). Run it with the same binary and ini
* files as production: `php php-sept-2026-check.php` for CLI, or call it
* once through PHP-FPM if the FPM build differs from the CLI build.
*/
const PATCHED = ['8.5' => '8.5.11', '8.4' => '8.4.26', '8.3' => '8.3.35', '8.2' => '8.2.34'];
$branch = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;
$exit = 0;
printf("PHP %s (%s SAPI, %s)\n", PHP_VERSION, PHP_SAPI, PHP_OS_FAMILY);
if (!isset(PATCHED[$branch])) {
echo " ! Branch {$branch} receives no security fixes from php.net: upgrade to a supported branch.\n";
$exit = 2;
} elseif (version_compare(PHP_VERSION, PATCHED[$branch], '<')) {
printf(" ! Upstream version is older than %s. A distribution package may still carry backported fixes:\n", PATCHED[$branch]);
echo " check your vendor's advisory before deciding (Debian DSA/DLA, Ubuntu USN, Red Hat RHSA).\n";
$exit = 1;
} else {
printf(" ok: at or above %s\n", PATCHED[$branch]);
}
// Which advisories touch code that is loaded in this runtime?
$exposure = [
'soap' => 'CVE-2026-91765 (SoapServer recursion, CVSS 7.5) and CVE-2025-14181 (SOAP client HTTP overflow)',
'openssl' => 'CVE-2026-91769 (CN fallback after SAN mismatch) and CVE-2026-91767 (wildcard CN overflow)',
'phar' => 'CVE-2026-6103 (TAR size overflow lets PharData expose injected entries)',
'mysqlnd' => 'CVE-2025-1218 (packet overreads from a malicious MySQL server)',
];
foreach ($exposure as $ext => $what) {
printf(" %-8s %s %s\n", $ext, extension_loaded($ext) ? 'loaded ' : 'absent ', $what);
}
echo " core always CVE-2026-91766 / CVE-2026-93682 (http:// wrapper redirects), CVE-2026-92842 (convert.* filters)\n";
if (PHP_OS_FAMILY === 'Windows') {
echo " windows yes CVE-2026-17545 (reserved device names such as CON or NUL in paths)\n";
}
if (PHP_SAPI === 'fpm-fcgi' || PHP_SAPI === 'cli') { // the CLI cannot see FPM pool config
echo " fpm review CVE-2026-91768: review listen.allowed_clients entries that use IPv6 addresses\n";
}
exit($exit);
To see the redirect credential leak for yourself, start two PHP built-in servers, one that redirects to the other and one that reports the Authorization header it received, then run this against them. On our unpatched 8.5.7 the token reached the second origin. On a patched build the header should be stripped; we could not run a patched 8.5.11 binary in our environment, so verify that on your own staging host.
<?php
// Does this PHP forward Authorization to a different origin after a redirect?
$ctx = stream_context_create(['http' => [
'header' => "Authorization: Bearer test-token-not-a-secret\r\n",
'follow_location' => 1,
]]);
echo PHP_VERSION, ': ', file_get_contents('http://127.0.0.1:4780/', false, $ctx);# On the PHP-FPM host: which pools listen on IPv6 TCP with an allow list?
grep -RnE '^\s*listen(\.allowed_clients)?\s*=' /etc/php/*/fpm/pool.d/ /usr/local/etc/php-fpm.d/ 2>/dev/null
# Which binary and version does FPM actually run?
php-fpm8.4 -v 2>/dev/null || php-fpm -vUpgrading: distribution packages, Docker images and source builds
Debian. At the time of writing the Debian security tracker listed the fixes as DSA-6514-1 for trixie (php8.4 8.4.26-1~deb13u1) and DLA-4819-1 for bookworm, now in long-term support (php8.2 8.2.34-1~deb12u1). Update and restart FPM:
sudo apt update
apt-cache policy php8.4-fpm # Candidate should be 8.4.26-1~deb13u1 or later
sudo apt install --only-upgrade 'php8.4*'
sudo systemctl restart php8.4-fpm # the old code stays in memory until FPM restartsUbuntu. Ubuntu backports fixes into its own version numbers. When we checked the Ubuntu CVE page in early October, php8.3 on 24.04 LTS and php8.5 on 26.04 LTS were still listed as vulnerable, meaning no update had been published yet. Until a USN appears, consider the upstream builds from a maintained repository, put a WAF rule or authentication in front of SOAP endpoints, and track the CVE page.
Red Hat, Rocky, AlmaLinux and other distributions: follow the vendor advisory for each CVE above; the package version will not match the upstream number.
Official Docker images. Docker Hub has php:8.5.11-* and php:8.4.26-* tags for the Debian (trixie, bookworm) and Alpine variants. Pin the patch version, rebuild, and confirm inside the image:
# Pin the patch release rather than a floating tag, so a rebuild is a deliberate change
FROM php:8.5.11-fpm-trixiedocker build --pull -t my-app:php-8.5.11 .
docker run --rm my-app:php-8.5.11 php -r 'echo PHP_VERSION, PHP_EOL;' # expect 8.5.11A floating tag such as php:8.5-fpm only helps if you rebuild: running containers keep the old binary. Also rebuild images derived from distribution base images, since apt upgrade in a running container is lost on the next deploy.
Source builds: the tarballs and SHA-256 checksums are on the php.net downloads page; verify the checksum before building.
Rolling a security release across several servers, images and PHP versions, with a restart window and a rollback plan, is routine maintenance work that is easy to postpone. If you would rather hand it off, our application maintenance and support service covers patching, verification and monitoring.
Fixes that can change behaviour
- Stricter certificate name checks. A certificate whose SAN list does not include the host name is now rejected even if its CN matches, with "Peer certificate subjectAltName did not match expected name". Internal services with badly issued certificates will start failing; certificates with no SAN at all keep the CN fallback. Test calls to internal hosts in staging.
- Credentials dropped on cross-origin redirects. If an integration relied on
Authorizationbeing forwarded from one host to another via a redirect, it will now get 401 from the second host. Call the final URL directly. - SOAP depth limit. Documents nested deeper than 2,048 levels are rejected. Legitimate SOAP traffic is nowhere near that, but generated test fixtures sometimes are.
- Windows device names. Paths containing
CON,NUL,COM1and similar components now fail with an invalid name error instead of opening a device.
Production checklist
- Inventory every PHP runtime: servers, FPM pools, containers, CI images, cron hosts and queue workers.
- Patch internet-facing SOAP servers first, then everything that makes outbound HTTPS calls.
- Install the fixed package or rebuild the image with a pinned patch tag.
- Restart PHP-FPM, Apache with mod_php, long-running workers (Laravel Horizon, queue workers, Swoole, RoadRunner, FrankenPHP) so the new binary is actually loaded.
- Run the check script through the real SAPI and record the result.
- Watch error logs for TLS name mismatches and 401s from integrations for a few days.
Common mistakes
- Upgrading the package but not restarting PHP-FPM or long-running workers.
- Checking
php -von the CLI when FPM runs a different build or version. - Treating a distribution version such as 8.3.6-0ubuntu0.24.04.x as unpatched (or patched) by comparing it with 8.3.35; read the vendor's changelog instead.
- Assuming Docker images patch themselves; they change only when you rebuild.
- Leaving PHP 8.1 or older in place because "it is internal"; no fixes will arrive for it.
When not to rush
A patch release is low risk, but it is not zero risk. If you run none of the affected features (no SOAP, no outbound HTTPS through PHP streams, FPM on a Unix socket, Linux only), a normal maintenance window this week is reasonable rather than an emergency change tonight; test the TLS behaviour change first if you call internal HTTPS services. If you run a public SOAP endpoint, do not wait.
Need PHP security releases applied across servers and containers without surprises? Cloudsoft Zone provides application maintenance and support for PHP and Laravel applications, including patching, verification and post-release monitoring.
Frequently asked questions
Which PHP versions fix the September 2026 security issues?
8.5.11, 8.4.26, 8.3.35 and 8.2.34, all released on 24 September 2026. Distribution packages carry the same fixes under their own version numbers, so check the vendor advisory.
What is the most serious issue in PHP 8.5.11?
CVE-2026-91765 (GHSA-rgrp-mwpx-f6rm), rated high with CVSS 7.5: unbounded recursion in the SOAP XML parser lets an unauthenticated request crash any
SoapServerendpoint.Is PHP 8.1 affected, and will it be fixed?
php.net no longer supports 8.1, so no fixed 8.1 release was published. Some advisories describe code that exists in older branches too. Upgrade to a supported branch, or use a vendor that still backports fixes to your version.
Do I need to restart anything after upgrading?
Yes. PHP-FPM, Apache with mod_php and long-running workers keep the old binary in memory until they restart. Containers need a rebuild and redeploy.
Could the update break working code?
Possibly in three places: TLS connections to hosts whose certificate SAN does not match, integrations that relied on credentials being forwarded across redirects, and Windows paths containing reserved device names. Test those in staging.
Your next customer could start right here.
Introduce your tool, product or business to readers exploring technology.
Explore placements and request a private quote
Sources
- PHP 8 ChangeLog (8.5.11, 8.4.26, 8.3.35, 8.2.34) — The PHP Group, 2026-09-24
- PHP 8.5.11 Released! — The PHP Group, 2026-09-24
- Supported Versions — The PHP Group
- SOAP: Unbounded Recursion in Server-Side cleanup_xml_node (GHSA-rgrp-mwpx-f6rm) — php-src (GitHub), 2026-09-24
- Cross-origin credential leak in HTTP stream wrapper redirects (GHSA-fpwc-w8rq-cr92) — php-src (GitHub), 2026-09-24
- IPv6 ACL bypass in FastCGI listen.allowed_clients (GHSA-62xp-839h-2637) — php-src (GitHub), 2026-09-24
- TLS Hostname Verification Falls Back to CN After SAN Mismatch (GHSA-vvx9-73fr-5jjx) — php-src (GitHub), 2026-09-24
- CVE-2026-91765 — Debian Security Tracker
- CVE-2026-91765 — Ubuntu Security
- php official image tags — Docker Hub
Comments
No comments yet. Be the first to join the conversation.
Leave a comment
Every comment is read by a moderator before it appears. Your email address is never published; it is used only to contact you about this comment.
More from Cloudsoft Zone

TutorialPHP
PHPStan tutorial: catch PHP bugs before production with levels
Install PHPStan 2.3, choose a rule level, adopt a baseline for legacy code and fail CI only on new errors, with real output from a worked PHP 8.5 example.
By Cloudsoft Zone

PHP
PSR standards in 2026: which PHP-FIG specs your project needs
Current status of every PSR, why PER Coding Style replaces PSR-12, and how PSR-4, PSR-3 and PSR-20 make PHP code portable, with a working Composer example.
By Cloudsoft Zone

TutorialLaravel
Laravel Horizon setup guide: monitored Redis queues in Laravel 13
Install Laravel Horizon 5 on Laravel 13, configure supervisors and balancing, set retries and timeouts safely, secure the dashboard and run it under Supervisor.
By Cloudsoft Zone
