Tutorial

PHP: corregir CVE-2026-91767 y CVE-2026-91769 (OpenSSL)

Seguridad y monitorización13 min de lectura14 pasos

El 24 de septiembre de 2026, el proyecto PHP publicó dos avisos de seguridad sobre la extensión OpenSSL: CVE-2026-91769, una verificación del nombre de host TLS demasiado permisiva, y CVE-2026-91767, una lectura fuera de límites durante esa misma comprobación. Se califican como moderadas y las corrigen PHP 8.2.34, 8.3.35, 8.4.26 y 8.5.11. No se comparan con PHP2Shell, pero afectan a cualquier código PHP que abra una conexión TLS saliente. Aquí verá si sus sitios están afectados, qué versión instalar en Debian, Ubuntu, RHEL, AlmaLinux, cPanel y Docker, y qué hacer con una rama sin corrección.

Contenido· Qué corrigen estos dos avisos1/13
  1. 01Qué corrigen estos dos avisos
  2. 02Lo esencial en siete puntos
  3. 03Qué permiten estos fallos y qué no permiten
  4. 04Calificados como moderados: ¿es urgente?
  5. 05Medir su exposición en cuatro pasos
  6. 06Qué versión instalar según su rama
  7. 07Aplicar la corrección según su entorno
  8. 08Si su rama está en fin de vida (8.1 y anteriores)
  9. 09No ponga nunca verify_peer_name a false
  10. 10Una tercera corrección de OpenSSL en el mismo trimestre
  11. 11Solución de problemas tras la actualización
  12. 12Los errores encontrados y sus remedios
  13. 13Integrar la actualización en su rutina

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 subjectAltName y 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 a memchr() 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, mediante file_get_contents(), fopen() y stream_socket_client() sobre https:// y tls://.
  • 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

  1. 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 de OPENSSL_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.

  2. 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/www por /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 carpeta vendor: las llamadas salientes suelen esconderse ahí.

  3. Localice las verificaciones ya desactivadas

    Ejecute grep -rn "verify_peer_name" /var/www --include='*.php'. Un valor a false significa 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.

  4. 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 PHPVersión mínima corregidaEstado
8.58.5.11Corregida. Instale la última 8.5 disponible.
8.48.4.26Corregida. Instale la última 8.4 disponible.
8.38.3.35Corregida. Instale la última 8.3 disponible.
8.28.2.34Corregida. 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 proyectoFin 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

  1. Debian y Ubuntu

    Actualice el índice con sudo apt update y después los paquetes de su rama con sudo 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 con apt changelog php8.3-cli | grep -i CVE-2026-91769. Con un repositorio de terceros como Sury, se aplican los mismos comandos.

  2. 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 php la indica. Después compruebe el registro con rpm -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 devuelva rpm -qa 'php*'.

  3. cPanel: EasyApache 4 y selector de PHP

    Las ramas de EasyApache 4 son paquetes ea-php83, ea-php84, etc. Si tiene root, lístelas con rpm -qa 'ea-php*' | sort y actualícelas con sudo dnf update 'ea-php*'. Lea el registro con rpm -qa --changelog 'ea-php83*' | grep -i CVE-2026-91769 y 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.

  4. Docker

    Una imagen no se corrige en el sitio: reconstruya tirando de la base actualizada con docker build --pull --no-cache -t su-imagen ., o docker compose build --pull --no-cache con Compose, y reinicie con docker compose up -d. Compruebe el resultado dentro del contenedor con docker run --rm su-imagen php -v. Una etiqueta flotante como php:8.4-fpm solo avanza si se reconstruyó la imagen de origen: manda el número mostrado, no el nombre de la etiqueta.

  5. 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), y sudo systemctl restart apache2 si usa mod_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.

  6. Verifique la versión realmente servida

    La CLI no es el servicio web. Consulte el binario de FPM: php-fpm8.3 -v en Debian y Ubuntu, php-fpm -v en 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 1 y luego certificate 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 con openssl 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 aparecer Peer 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 cafile en 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 -v sigue 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Elija la versión de PHP de cada sitio

En un alojamiento web ServOrbit.com, elige la versión de PHP dominio por dominio desde cPanel y pasa a una rama todavía corregida tras probar su sitio.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva