Vulnerabilidad crítica en PHP (CVE-2026-109618 y CVE-2026-109619): cómo funciona el fallo corregido hoy en PHP 8.4.27 / 8.2.35, el parche para mysqlnd y cómo proteger tu servidor
El equipo oficial de PHP acaba de publicar las actualizaciones de emergencia PHP 8.4.27 y PHP 8.2.35 para mitigar dos vulnerabilidades críticas en el núcleo del lenguaje (CVE-2026-109618 y CVE-2026-109619 / GHSA-w8hw-w9fx-j79w y GHSA-6wmf-4rv5-p3rp), junto con desbordamientos de búfer en Zend OPcache y Lexbor HTML5. En este informe elaborado por el equipo de ingeniería de MESI Hosting analizamos cómo se explotan estos fallos en servidores no parcheados, cómo solucionar la regresión en mysqlnd al compilar PHP 8.4.27 y cómo actualizar tu WordPress o sistema a medida sin errores.
1 Anatomía de CVE-2026-109618 y CVE-2026-109619: corrupción de estado vía "bailout" en el motor Zend
Las vulnerabilidades CVE-2026-109618 (GHSA-w8hw-w9fx-j79w) y CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp) afectan directamente al corazón de ejecución de PHP (Core / Zend Engine) bajo el vector técnico denominado State Corruption via Bailout.
¿Cómo ocurre la explotación en servidores web con PHP-FPM, Apache o Nginx?
Cuando un script PHP sufre una condición crítica irrecuperable —por ejemplo, cuando una petición maliciosa fuerza a agotar el límite de memoria (Allowed memory size exhausted), supera el max_execution_time o provoca un error fatal durante una operación interna del recolector de basura (GC), serialización o evaluación de tablas hash—, el motor Zend ejecuta internamente un salto no local (longjmp) mediante la función C zend_bailout() para abortar la petición actual.
En las versiones anteriores a PHP 8.4.27 y 8.2.35, si ese zend_bailout() se disparaba en puntos específicos donde el motor mantenía estructuras internas a medio modificar, el proceso hijo de PHP-FPM no restauraba limpiamente sus punteros globales antes de atender la siguiente petición HTTP:
- Contaminación y corrupción entre peticiones en el mismo worker PHP-FPM: El siguiente visitante legítimo que era atendido por ese mismo proceso worker recibía un estado interno del motor Zend inconsistente, pudiendo desencadenar lecturas de memoria liberada (Use-After-Free), fallos de aserción o filtración de fragmentos de memoria de la petición previa.
- Caída masiva de procesos (DoS / SIGSEGV): Un atacante remoto podía enviar una ráfaga de peticiones diseñadas para forzar bailouts en cadena, derribando los workers de PHP-FPM con errores
502 Bad Gatewayo503 Service Unavailable.
2 Los otros 5 fallos de seguridad y memoria corregidos hoy en PHP 8.4.27 (Lexbor, OPcache, Sesiones, SOAP y PDO)
Además de los dos CVEs principales del núcleo, el parche de hoy soluciona vulnerabilidades de alta severidad detectadas por OSS-Fuzz e investigadores de seguridad en extensiones críticas que usa el 99% de los sitios web:
| Componente / Extensión | Identificador del Fallo | Impacto de Explotación y Corrección en PHP 8.4.27 |
|---|---|---|
| Zend OPcache & JIT | OSS-Fuzz #546798343GH-23637 / GH-23991 |
Heap Buffer Overflow en el optimizador de OPcache al procesar First-Class Callables (FCC) con inlining, lectura de memoria no inicializada en is_cacheable_stream_path() y SIGSEGV en workers PHP-FPM por desbordamiento del offset map_ptr en caché de clases. |
| Parser HTML5 (Lexbor / DOM) | lexbor@8a14bc0lexbor@f67ce4b / GH-23729 |
Heap Buffer Overflow al parsear selectores :lexbor-contains() y secuencias malformadas en Dom\HTMLDocument, más un Use-After-Free en DOMXPath::__construct() cuando se registran callbacks php:function. |
| Motor de Sesiones (Session) | Bypass create_sid() +session.upload_progress |
session_start() continuaba ejecutándose aun después de que create_sid() fallara cuando session.use_strict_mode rechazaba un ID manipulado. Se suma al vector de creación no autenticada de archivos de sesión vía PHP_SESSION_UPLOAD_PROGRESS. |
| SOAP (WebServices / AFIP) | GH-22895 |
Heap Use-After-Free al codificar un objeto Traversable con una clave inválida en peticiones o respuestas SOAP. |
| PDO & MBString | GH-23106 / GH-23962 |
Lectura fuera de límites (Out-of-Bounds Read) en PDOStatement::getColumnMeta() y en mb_strpos() ante cadenas UTF-8 truncadas al final del buffer, más un Use-After-Free en bindValue() desde __toString(). |
Blindaje obligatorio en php.ini: desactivar session.upload_progress.enabled
Muchos administradores actualizan el binario de PHP pero dejan activada la configuración por defecto session.upload_progress.enabled = On. Cuando esta opción está encendida, un atacante puede enviar una petición POST multipart/form-data con el campo PHP_SESSION_UPLOAD_PROGRESS y obligar a PHP a escribir un archivo de sesión en /tmp/sess_* con contenido controlado por el atacante incluso en páginas que ni siquiera llaman a session_start().
; Bloquea la creación no autenticada de sesiones y Heap Spraying vía multipart POST:
session.upload_progress.enabled = Off
session.use_strict_mode = 1
session.cookie_httponly = 1
3 ¡Atención Sysadmins! Cómo solucionar la regresión de "mysqlnd" en PHP 8.4.27 ("Premature end of data" / "EOF packet shorter than expected")
Si administrás tus propios servidores Linux y hoy compilaste PHP 8.4.27 desde el código fuente oficial (php-8.4.27.tar.xz), es muy probable que al levantar PHP-FPM contra motores MySQL con protocolo clásico te hayas encontrado con que las conexiones fallan arrojando:
Warning: mysqli_real_connect(): Premature end of data (mysqlnd_wireprotocol.c:1018)
Warning: mysqli_real_connect(): EOF packet 1 bytes shorter than expected
¿Por qué ocurre este bug en el código fuente oficial de PHP 8.4.27 y cómo lo parcheamos en MESI?
En PHP 8.4.27, el equipo upstream agregó la macro BAIL_IF_NOT_ENOUGH_DATA(1) en la función php_mysqlnd_eof_read() dentro de ext/mysqlnd/mysqlnd_wireprotocol.c (línea 1018) inmediatamente después de avanzar el puntero p++ al leer packet->field_count. Eso exige que siempre quede al menos 1 byte extra en el buffer antes de evaluar if (packet->header.size > 1), rompiendo los paquetes EOF legítimos de 1 solo byte.
Compartimos con la comunidad técnica el parche exacto en C que nuestro equipo de ingeniería aplicó hoy en los paquetes de producción de MESI:
--- a/ext/mysqlnd/mysqlnd_wireprotocol.c
+++ b/ext/mysqlnd/mysqlnd_wireprotocol.c
@@ -1015,8 +1015,8 @@ php_mysqlnd_eof_read(zend_uchar * buf, size_t buf_len, ...
packet->field_count = uint1korr(p);
p++;
- BAIL_IF_NOT_ENOUGH_DATA(1);
if (ERROR_MARKER == packet->field_count) {
+ BAIL_IF_NOT_ENOUGH_DATA(1);
DBG_ERR("Error packet appeared as EOF packet");
ca-certificates (`SSA:2026-293-02`)? Ayer se publicó la actualización crítica de almacenes de certificados raíz TLS que revoca CAs comprometidas usadas en ataques Man-in-the-Middle. Leé nuestro análisis completo acá: Explotación de ca-certificates desactualizados (SSA:2026-293-02): cómo blindar OpenSSL, cURL, Mercado Pago y ARCA/AFIP en PHP 8.4.
4 Más allá del parche de seguridad: hasta 55% más velocidad (OPcache + JIT) y cómo migrar desde PHP 7.4 sin pantalla blanca
Actualizar tu sitio a PHP 8.4.27 en MESI no solo te protege contra CVE-2026-109618 y CVE-2026-109619: también reduce hasta un 55% el tiempo de respuesta (TTFB) en WordPress y duplica las peticiones por segundo en WooCommerce gracias a Zend OPcache v8.4.27 y nuestros discos SSD NVMe.
Si tu web todavía está en PHP 7.4 y al probar PHP 8.4 en tu panel panel.com.ar algún plugin o script propio muestra un error, así se corrigen en segundos los 3 casos más habituales:
<?php
// 1. Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array
// ❌ Antes en PHP 7.4:
if (count($items) > 0) { ... }
// ✅ En PHP 8.4:
if (is_array($items) && count($items) > 0) { ... }
// 2. Deprecated: Creation of dynamic property MiClase::$prop is deprecated
// ✅ Agregá el atributo nativo encima de la clase o declará "public $prop;":
#[\AllowDynamicProperties]
class MiClaseLegacy { ... }
// 3. Deprecated: Function utf8_encode() / utf8_decode() is deprecated
// ✅ Reemplazalo por mb_convert_encoding():
$iso = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8');
Y si tenés un sistema histórico con funciones antiguas mysql_connect(), en MESI contás tanto con el Selector Multi-PHP (7.4 / 8.2.35 / 8.4.27) en 1 clic como con nuestro Puente de Compatibilidad Legacy a PHP 8.4 para que tu aplicación corra sobre el motor parcheado sin romperse.
5 Prompt Maestro: Usá la IA (Claude, ChatGPT, Gemini o Cursor) para auditar vulnerabilidades y actualizar tu código a PHP 8.4.27
Copiá este prompt diseñado por nuestro equipo de seguridad, pegalo en tu IA junto con tus archivos PHP y obtené el código blindado y compatible con PHP 8.4.27:
Necesito que audites y actualices el siguiente código PHP aplicando estos 5 puntos:
1. Detectar y corregir cualquier patrón que pueda provocar agotamiento descontrolado de memoria (
zend_bailout), recursión infinita o manejo inseguro de sesiones en session_start().2. Auditar llamadas a
DOMXPath, Dom\HTMLDocument, SoapClient y PDOStatement para evitar usos inseguros de memoria o inyección XPath/SQL.3. Si el código usa funciones antiguas
mysql_*, migrarlas a mysqli o PDO con sentencias preparadas.4. Corregir cualquier
TypeError estricto de PHP 8.4 en count(), strlen(), trim() o htmlspecialchars() cuando reciben null o false, y declarar explícitamente las propiedades de las clases para evitar Deprecated: Creation of dynamic property.5. Entregarme el código completo listo para producción en PHP 8.4.27."
¿Tu hosting actual sigue corriendo una versión vulnerable de PHP?
En MESI Hosting compilamos y aplicamos los parches críticos de seguridad el mismo día de su publicación. Mudá tu sitio web, tienda WooCommerce o sistema empresarial a nuestra infraestructura NVMe con migración bonificada sin caídas.
Hosting Profesional / Empresarial
Plan Profesional 20 GB NVMe + 50 casillas (o Plan Empresarial 60 GB + IP dedicada por $28.790/mes)
- PHP 8.4.27 y 8.2.35 blindados contra CVE-2026
- Zend OPcache activo + Discos SSD NVMe
- Selector Multi-PHP (7.4/8.2/8.4) + Puente Legacy
- SSL Gratis + Backups automáticos en
.snapshots
Cloud Server VPS 4
2 núcleos CPU · 4 GB RAM · 40 GB SSD Enterprise (o VPS 2 desde $22.000/mes)
- Entorno aislado propio con IP dedicada
- PHP 8.4.27 + ca-certificates 2026 preconfigurados
- Migración bonificada desde tu servidor actual
- Soporte de sysadmins 24/7 en español
MIA · Desarrollo con IA
Auditamos y actualizamos tu código a PHP 8.4.27
- Migramos tu sistema PHP 5.x/7.x a PHP 8.4
- Blindaje contra inyección SQL, sesiones y XSS
- Incluye servidor Cloud y supervisión humana
- Ideal para sistemas a medida e intranets
Preguntas frecuentes sobre CVE-2026-109618, CVE-2026-109619 y PHP 8.4.27
¿En qué consisten las vulnerabilidades críticas de PHP CVE-2026-109618 y CVE-2026-109619 corregidas hoy?
Registradas bajo los avisos GHSA-w8hw-w9fx-j79w y GHSA-6wmf-4rv5-p3rp, permiten provocar una corrupción del estado interno del motor Zend cuando se dispara una interrupción abrupta (zend_bailout), por ejemplo al agotar el memory_limit o forzar un error fatal en mitad de operaciones internas. En entornos persistentes como PHP-FPM, el worker reutiliza ese estado corrupto en la siguiente petición HTTP, exponiendo a fugas de memoria entre usuarios, fallos de segmentación (SIGSEGV) o ejecución arbitraria.
¿Qué otras vulnerabilidades de memoria y sesiones se corrigieron en PHP 8.4.27 y PHP 8.2.35?
El lanzamiento de PHP 8.4.27 y 8.2.35 corrige además un Heap Buffer Overflow en el parser HTML5 Lexbor (:lexbor-contains y decode replay), un Heap Buffer Overflow en el optimizador de Zend OPcache con First-Class Callables (OSS-Fuzz #546798343), un fallo donde session_start() continuaba ejecutándose aun cuando create_sid() fallaba con session.use_strict_mode activo, y vulnerabilidades Use-After-Free en SOAP (GH-22895), DOMXPath (GH-23729) y PDO.
¿Por qué se debe desactivar session.upload_progress.enabled en php.ini para evitar la explotación remota de sesiones?
Cuando session.upload_progress.enabled está en On (su valor por defecto), cualquier atacante remoto sin iniciar sesión puede enviar una petición POST multipart/form-data incluyendo el campo PHP_SESSION_UPLOAD_PROGRESS y una cookie PHPSESSID arbitraria. Eso obliga al motor de PHP a escribir archivos de sesión controlados por el atacante en el servidor antes de que el código de tu web se ejecute, facilitando ataques de Local File Inclusion (LFI) y Heap Spraying. En MESI esta directiva está blindada en Off en todos los servidores.
¿Por qué al compilar PHP 8.4.27 aparece el error "Premature end of data" o "EOF packet shorter than expected" en mysqlnd y cómo se repara?
En PHP 8.4.27 se introdujo una macro BAIL_IF_NOT_ENOUGH_DATA en la función php_mysqlnd_eof_read (archivo ext/mysqlnd/mysqlnd_wireprotocol.c, línea 1018) inmediatamente después de leer el byte field_count, exigiendo al menos un byte adicional antes de comprobar if (packet->header.size > 1). Esto rompe la lectura de paquetes EOF clásicos de 1 byte en motores MySQL legacy. Se soluciona moviendo BAIL_IF_NOT_ENOUGH_DATA dentro del bloque if (ERROR_MARKER == packet->field_count), parche que ya viene aplicado de fábrica en la infraestructura de MESI.
¿Qué pasa si actualizo mi sitio WordPress o sistema a PHP 8.4.27 y un plugin viejo tira error?
En el panel de control de MESI (panel.com.ar) contás con selector Multi-PHP (PHP 8.4.27, PHP 8.2.35 y PHP 7.4) y el Puente de Compatibilidad Legacy. Además, podés usar el Prompt Maestro de IA incluido en esta guía para corregir en segundos avisos como Deprecated: Creation of dynamic property o TypeError: count() en tus scripts.
¿Los servidores de Web Hosting y Cloud VPS de MESI ya están protegidos contra CVE-2026-109618 y CVE-2026-109619?
Sí. Toda la flota de servidores web de MESI Hosting ya cuenta con PHP 8.4.27 y PHP 8.2.35 compilados y activos en producción, endurecimiento de sesiones (session.upload_progress.enabled = Off) y el almacén ca-certificates-20261020 actualizado.
MIA