Qué corrigen estos dos avisos
Ambos avisos apuntan a ext/openssl, la extensión que gestiona el cifrado TLS de los flujos de PHP. No afectan a los visitantes de su sitio: afectan a las conexiones que su código PHP abre hacia el exterior, por ejemplo un file_get_contents('https://…'), un fopen sobre una URL https o un stream_socket_client en tls://.
En esos casos, PHP comprueba que el certificado que presenta el servidor remoto corresponde al nombre de host solicitado. Es la opción verify_peer_name, activa por defecto. Los dos fallos están en esa comprobación. El aviso de CVE-2026-91769 (GHSA-vvx9-73fr-5jjx) describe una verificación demasiado permisiva. El de CVE-2026-91767 (GHSA-xr7j-rvgx-xq5p) describe una lectura fuera de límites en la comparación de nombres con comodín. Ambos se publicaron el mismo día, el 24 de septiembre de 2026, y los corrigen las mismas versiones.
Lo esencial en siete puntos
- CVE-2026-91769 — gravedad moderada, CVSS 3.1 de 4.3. La verificación del nombre del par consulta primero los
subjectAltNamey luego recurre al Common Name, incluso cuando el certificado presenta un SAN DNS que no coincide. - CVE-2026-91767 — gravedad moderada, CVSS 3.1 de 6.5 (CWE-122). En
php_openssl_matches_wildcard_name(), un desbordamiento por defecto de longitud pasado amemchr()provoca una lectura fuera de límites cuando el nombre con comodín del certificado tiene más caracteres literales que el host verificado. - Versiones corregidas — PHP 8.2.34, 8.3.35, 8.4.26 y 8.5.11, para ambos fallos. Las versiones 8.4.26 y 8.5.11 figuran en el changelog de PHP con fecha del 24 de septiembre de 2026.
- Quién está afectado — los clientes que dependen del valor por defecto de
verify_peer_name, mediantefile_get_contents(),fopen()ystream_socket_client()sobrehttps://ytls://. - Solución provisional — el aviso no indica ninguna. Desactivar la verificación no lo es, es un fallo más.
- Ramas 8.1 y anteriores — fin de vida, sin corrección del proyecto. Puede haber correcciones de la distribución o backports de terceros: compruébelo paquete por paquete.
- Explotación — en las fuentes que consultamos, no encontramos ninguna explotación constatada de estos dos fallos.
Qué permiten estos fallos y qué no permiten
CVE-2026-91769 permite suplantar un host. Un certificado que su cliente acepta para un host puede servir para hacerse pasar por otro, si su Common Name contiene el nombre buscado. La RFC 6125 indica ignorar el CN cuando hay un SAN DNS, y PHP no lo hacía. El aviso considera el caso relevante sobre todo en una PKI privada, es decir, con una autoridad interna que emite certificados para muchos servicios.
CVE-2026-91767 permite hacer fallar a un cliente PHP. Un servidor malicioso, o con una autoridad aceptada, puede provocar la lectura fuera de límites durante la verificación: es una denegación de servicio. El aviso precisa que el resultado solo influye en la decisión de aceptar o rechazar y no devuelve contenido del montón. Una reserva honesta: el vector CVSS puntúa la confidencialidad como Alta y la disponibilidad como Ninguna, lo que no cuadra con el texto del impacto. Lo señalamos sin zanjarlo.
Lo que no permiten. El aviso no describe ninguna ejecución de código. Ninguno de los dos se activa con una petición de un visitante que llega a su sitio. Ambos vectores son de tipo red adyacente (AV:A): el atacante debe estar cerca de la comunicación, no en cualquier lugar de Internet.
Calificados como moderados: ¿es urgente?
Respuesta honesta: nada en las fuentes que consultamos indica que estos fallos se estén explotando. No afirmamos nada más allá. No se comparan con PHP2Shell (CVE-2026-109618 y CVE-2026-109619), que apunta al propio intérprete y se activa con una petición HTTP anónima. Ese fallo se trata aparte en nuestro artículo sobre PHP2Shell; la última versión de su rama, que ese artículo le pide instalar, también contiene estas correcciones.
La urgencia es, por tanto, gradual. Es real si su código llama a URL externas con los flujos de PHP (API de pago, webhooks salientes, importación de feeds, comprobación de licencias) o a servicios internos cuyos certificados proceden de una PKI privada. Lo es mucho menos para un sitio escaparate que no hace llamadas salientes. En ambos casos la corrección se queda en la misma rama: inclúyala en su próxima ventana de mantenimiento en lugar de aplazarla sin fecha.
Medir su exposición en cuatro pasos
Lea la versión de PHP que realmente se sirve
En el servidor, ejecute
php -r 'echo PHP_VERSION, PHP_EOL;'. No se fíe deOPENSSL_VERSION_TEXT: lo que se corrige no es la biblioteca OpenSSL del sistema, sino el código de la extensión, es decir, la versión de PHP. Atención, la CLI puede diferir de lo que sirven sus sitios: en un servidor con varias ramas, lea también la versión de cada pool de PHP-FPM (paso de verificación más abajo). En cPanel, la versión se lee por dominio, vea nuestra guía del selector de PHP.Busque las llamadas que pasan por los flujos de PHP
Liste las llamadas salientes con una URL literal en el código:
grep -rnE "(file_get_contents|fopen)\(\s*['\"]https?://|stream_socket_client\(\s*['\"]tls://" /var/www --include='*.php'. En un alojamiento cPanel, sustituya/var/wwwpor/home. Complete con las llamadas cuya URL viene de una variable:grep -rnE "(file_get_contents|fopen|stream_socket_client)\(\s*\$" /var/www --include='*.php'. Piense en los plugins de WordPress y en la carpetavendor: las llamadas salientes suelen esconderse ahí.Localice las verificaciones ya desactivadas
Ejecute
grep -rn "verify_peer_name" /var/www --include='*.php'. Un valor afalsesignifica que no se verifica ningún nombre de host: ese código está expuesto a mucho más que estos dos avisos, sea cual sea la versión de PHP. Corríjalo antes que nada.Clasifique sus sitios
Un sitio es prioritario si suma una rama por debajo del mínimo de la tabla siguiente y llamadas salientes por flujos. Las llamadas hechas con la extensión cURL no las cita el aviso, que enumera los flujos de PHP. WordPress y la mayoría de las bibliotecas HTTP suelen usar cURL cuando está disponible, pero recurren a los flujos si no lo está: no las descarte sin comprobarlo.
Qué versión instalar según su rama
Desplace la tabla
| Rama de PHP | Versión mínima corregida | Estado |
|---|---|---|
| 8.5 | 8.5.11 | Corregida. Instale la última 8.5 disponible. |
| 8.4 | 8.4.26 | Corregida. Instale la última 8.4 disponible. |
| 8.3 | 8.3.35 | Corregida. Instale la última 8.3 disponible. |
| 8.2 | 8.2.34 | Corregida. Planifique la salida de esta rama, vea la checklist enlazada al final del artículo. |
| 8.1 y anteriores (5.6 a 8.1) | Ninguna versión del proyecto | Fin de vida. Corrección de la distribución o backport de terceros por comprobar; si no, migrar. |
Aplicar la corrección según su entorno
Debian y Ubuntu
Actualice el índice con
sudo apt updatey después los paquetes de su rama consudo apt install --only-upgrade 'php8.3*'(sustituya 8.3 por su rama). Para ver lo pendiente:apt list --upgradable 2>/dev/null | grep -i php. Las distribuciones suelen corregir mediante backport sin cambiar el número del proyecto: lea el registro del paquete conapt changelog php8.3-cli | grep -i CVE-2026-91769. Con un repositorio de terceros como Sury, se aplican los mismos comandos.RHEL, AlmaLinux y Rocky Linux
Ejecute
sudo dnf update 'php*'. Si usa un flujo de módulos, la rama sigue al módulo activado:dnf module list --enabled phpla indica. Después compruebe el registro conrpm -q --changelog php-cli | grep -i CVE-2026-91769. Con un repositorio de terceros, los nombres de paquete cambian: adapte el patrón a lo que devuelvarpm -qa 'php*'.cPanel: EasyApache 4 y selector de PHP
Las ramas de EasyApache 4 son paquetes
ea-php83,ea-php84, etc. Si tiene root, lístelas conrpm -qa 'ea-php*' | sorty actualícelas consudo dnf update 'ea-php*'. Lea el registro conrpm -qa --changelog 'ea-php83*' | grep -i CVE-2026-91769y la versión real con/opt/cpanel/ea-php83/root/usr/bin/php -v. En un alojamiento compartido, la actualización la hace el proveedor: su parte consiste en comprobar, en el selector de PHP de cPanel (MultiPHP Manager, o Select PHP Version en CloudLinux), que cada dominio funciona con una rama corregida.Docker
Una imagen no se corrige en el sitio: reconstruya tirando de la base actualizada con
docker build --pull --no-cache -t su-imagen ., odocker compose build --pull --no-cachecon Compose, y reinicie condocker compose up -d. Compruebe el resultado dentro del contenedor condocker run --rm su-imagen php -v. Una etiqueta flotante comophp:8.4-fpmsolo avanza si se reconstruyó la imagen de origen: manda el número mostrado, no el nombre de la etiqueta.Reinicie los servicios de PHP
PHP-FPM y Apache conservan el código antiguo en memoria mientras no se recarguen. En Debian o Ubuntu:
sudo systemctl restart php8.3-fpm(adapte la rama), ysudo systemctl restart apache2si usamod_php. En RHEL o AlmaLinux:sudo systemctl restart httpd. En cPanel con PHP-FPM,systemctl list-units 'ea-php*'da el nombre exacto del servicio que hay que reiniciar.Verifique la versión realmente servida
La CLI no es el servicio web. Consulte el binario de FPM:
php-fpm8.3 -ven Debian y Ubuntu,php-fpm -ven RHEL y derivados, o la versión del dominio en cPanel. El número debe alcanzar el mínimo de su rama, o su registro debe citar CVE-2026-91769. Termine con una llamada saliente de prueba:php -r 'echo strlen(file_get_contents("https://su-dominio.com/")), PHP_EOL;'.
Si su rama está en fin de vida (8.1 y anteriores)
Según HeroDevs, las ramas de PHP 5.6 a 8.1 están en fin de vida y no reciben corrección del proyecto para estos fallos. No dé nada por supuesto en un sentido ni en otro. Su distribución quizá haya trasladado la corrección a su paquete: es posible, no está garantizado, y se comprueba paquete por paquete, con el registro de cambios (apt changelog, rpm -q --changelog) y el seguimiento de seguridad de la distribución. También hay proveedores terceros que ofrecen backports para versiones abandonadas.
Sin una corrección confirmada, tiene tres palancas. La primera es migrar a una rama mantenida, 8.3 u 8.4 tras probar su sitio: el método está en nuestra checklist de migración de PHP. La segunda es limitar las llamadas salientes de ese código a hosts cuyos certificados controla. La tercera es restringir en el cortafuegos el tráfico saliente del servidor. Las dos últimas reducen la exposición, no corrigen nada.
No ponga nunca verify_peer_name a false
Ante un error de certificado, la tentación es añadir verify_peer_name => false en un stream_context_create. Es peor que el fallo: ya no se verifica ningún nombre de host, de modo que cualquier certificado aceptado vale para cualquier host. El aviso no indica ninguna solución provisional, y esta opción no lo es. Cuando una conexión falla tras la actualización, repare el certificado.
Una tercera corrección de OpenSSL en el mismo trimestre
CVE-2026-14355 es un fallo distinto: una corrupción de memoria en openssl_encrypt() con el algoritmo AES-WRAP-PAD (GH-22187). Según el changelog de PHP (https://www.php.net/ChangeLog-8.php), está corregida en PHP 8.4.23, con fecha del 3 de julio de 2026, y en PHP 8.5.8, con fecha del 2 de julio de 2026. Afecta al cifrado, no a la verificación TLS: no cambia nada en la prueba de exposición anterior.
Si instala 8.4.26 u 8.5.11 o posterior, ya tiene esta corrección. Para las ramas 8.2 y 8.3 no citamos ninguna versión, porque no la hemos verificado: lea el registro de su paquete para saber si aparece CVE-2026-14355.
Solución de problemas tras la actualización
La corrección endurece una comprobación. Algunas llamadas que antes pasaban pueden fallar ahora, y es la consecuencia esperada de la corrección, no una regresión. El caso que hay que probar primero es un servicio interno cuyo certificado procede de una autoridad privada. Estos son los mensajes reales que puede encontrar y el remedio que corresponde.
Los errores encontrados y sus remedios
SSL operation failed with code 1y luegocertificate verify failed— mensaje completo típico:stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed. Causa probable: el certificado presenta un SAN DNS que no contiene el host llamado, pero su CN sí. La verificación antigua lo aceptaba recurriendo al CN, la nueva lo rechaza. Lea el certificado conopenssl s_client -connect interne.su-dominio.com:443 -servername interne.su-dominio.com </dev/null 2>/dev/null | openssl x509 -noout -subject -ext subjectAltName. Remedio: reemitir el certificado con un SAN DNS correcto para cada nombre utilizado, nunca desactivar la verificación.file_get_contents(): Failed to enable crypto— advertencia que acompaña a la anterior. Lea el mensaje completo que sigue: según la versión, también puede aparecerPeer certificate CN=… did not match expected CN=…. Misma causa, mismo remedio.- Un certificado sin ningún SAN, solo con CN, sigue fallando — la corrección conserva el recurso al CN para los certificados sin identificador de servicio. La causa está, por tanto, en otro sitio: autoridad no aceptada por el cliente, host llamado por un alias o una dirección IP que no figuran en el certificado, certificado caducado. Remedio: añadir la autoridad interna a
cafileen el contexto del flujo y reemitir el certificado con un SAN. child exited on signal 11 (SIGSEGV)en el registro de PHP-FPM — un worker que falla durante una llamada saliente TLS es compatible con CVE-2026-91767. No concluya solo con ese indicio: compruebe la versión, actualice y vea si el patrón desaparece.php -vsigue mostrando la versión antigua — servicio no reiniciado, CLI y FPM de ramas distintas, imagen Docker reconstruida sin--pull, o versión del dominio sin cambios en cPanel. Retome el paso de verificación.- El registro de la distribución no cita la CVE — su ausencia no prueba ni que la corrección esté ni que falte. Consulte el seguimiento de seguridad de la distribución y, en su defecto, compare el número del proyecto con el mínimo de la tabla.
Integrar la actualización en su rutina
Anote el mínimo en su inventario
Añada a su inventario de parque una columna de "versión mínima" por rama, con los valores de la tabla. Una versión por debajo del mínimo se vuelve visible sin investigar.
Planifique las actualizaciones de PHP
Una corrección de seguridad de PHP es una actualización menor de la misma rama: prevea una ventana regular en lugar de un proyecto por cada aviso, con reinicio de los servicios y verificación de la versión servida.
Pruebe una llamada saliente tras cada actualización
Repita
php -r 'echo strlen(file_get_contents("https://su-dominio.com/")), PHP_EOL;'desde cada servidor, y una llamada a sus servicios internos. Un error de certificado aparece entonces de inmediato, no en casa de un cliente.Enlace esta corrección con el resto de su vigilancia
Para el método de inventario de un parque, lea el inventario de versiones PHP de un parque de clientes. Para el fallo más crítico del momento, vea PHP2Shell. Para cambiar la versión de un sitio, siga la guía del selector de PHP de cPanel. Para una rama que se apaga, retome la checklist de migración de PHP 8.2.