Una falla grave en versiones 5.x, 7.x y 8.x de PHP expone a miles de servidores a explotación remota mediante corrupción de memoria
Los administradores de sistemas que gestionan entornos PHP deben actuar con urgencia. Un fallo descubierto recientemente en la función extract()
de PHP permite a atacantes ejecutar código nativo en servidores vulnerables. Esta vulnerabilidad afecta a las principales versiones activas de PHP —incluidas 7.x y 8.x— y permite condiciones de double-free o use-after-free, ambas con consecuencias críticas sobre la seguridad y estabilidad de los sistemas.
¿Qué está en riesgo?
La función extract()
, frecuentemente utilizada para importar variables desde arrays asociativos al espacio de símbolos local, es popular pero arriesgada, especialmente en contextos donde los datos provienen del usuario. Si se combina con la bandera EXTR_REFS
y se manipulan referencias a objetos con destructores (__destruct()
), es posible provocar que el mismo puntero sea liberado dos veces o que se use después de ser liberado, lo cual corrompe el heap de PHP.
Impacto técnico
- PHP 5.x: Provoca double-free, una condición que puede ser explotada para sobreescribir estructuras internas.
- PHP 7.x / 8.x: Permite use-after-free, exponiendo a lectura/escritura arbitraria y ejecución de código nativo.
- Alcance: Afecta entornos que aún usan
extract()
con datos dinámicos —por ejemplo,extract($_POST)
— y puede ser aprovechada sin necesidad de autenticación si el código vulnerable se ejecuta antes de aplicar validaciones o filtrados.
Ejemplo simplificado de explotación
class Danger {
function __destruct() {
unset($GLOBALS['vulnerable']);
}
}
$malicioso = ['vulnerable' => new Danger()];
extract($malicioso, EXTR_REFS);
Recomendaciones para administradores de sistemas
🔒 Actualizar PHP inmediatamente. Se han publicado parches en el repositorio oficial:
GHSA-4pwq-3fv3-gm94
🔍 Auditar aplicaciones PHP alojadas que utilicen extract()
sobre datos externos.
Buscar patrones como extract($_POST)
, extract($_REQUEST)
, etc.
🚫 Restringir el uso de extract() y fomentar buenas prácticas de desarrollo, como asignaciones explícitas o uso de EXTR_PREFIX_ALL
para evitar colisiones de nombres.
🧠 Monitorizar logs de errores para detectar posibles síntomas de corrupción de memoria como fallos de segmentación o comportamientos inesperados en procesos PHP-FPM.
📦 Aislar entornos PHP heredados mediante contenedores o sandboxes si no es posible actualizarlos de inmediato. En entornos compartidos, un fallo como este puede permitir una escalada entre sitios virtuales (vhosts).
🧪 Aplicar pruebas de seguridad automatizadas sobre el stack PHP para detectar vulnerabilidades similares antes de que sean explotadas.
Conclusión
Esta vulnerabilidad no solo pone en jaque a desarrolladores, sino también a sysadmins responsables de mantener entornos seguros y estables. Las funciones heredadas como extract()
continúan generando problemas críticos en versiones modernas de PHP. Aunque el núcleo de PHP ha recibido parches, la verdadera solución pasa por identificar y eliminar patrones de codificación peligrosos en los entornos que gestionamos.
Los administradores deben tomar la iniciativa: auditar, actualizar y reforzar medidas de aislamiento. La seguridad del sistema no termina en el kernel, también reside en el comportamiento de cada línea de código ejecutado en producción.
🛑 Revisa tus sitios ahora. Cada segundo cuenta.
Fuente: OpenSecurity, GBHackers y SSD Disclosure