1. Descripción técnica del ataque
En marzo de 2021, atacantes comprometieron el repositorio Git oficial de PHP e introdujeron dos commits maliciosos que añadían una puerta trasera al código fuente, etiquetada como la versión en desarrollo PHP 8.1.0-dev.
La backdoor inspecciona la cabecera HTTP User-Agentt (con doble "t", para no colisionar con la cabecera legítima User-Agent). Si el valor de esa cabecera comienza con la cadena zerodium, el resto se pasa a eval() / zend_eval_string(), ejecutándose como código PHP en el servidor:
User-Agentt: zerodiumsystem('id');Esto otorga ejecución remota de código (RCE) sin autenticación contra cualquier servidor que ejecute esa build troyanizada.
2. Impacto de la vulnerabilidad
- RCE remoto y no autenticado con los privilegios del proceso web (típicamente
www-datao, en CTFs, dentro de un contenedor). - Compromiso del servidor y punto de partida para escalada de privilegios o pivoting.
- Ejemplo de ataque a la cadena de suministro que afectó directamente al lenguaje más usado del web legacy.
3. Historia y evolución
- 28-29 de marzo de 2021: se detectan dos commits maliciosos firmados falsamente como contribuidores conocidos (Rasmus Lerdorf y Nikita Popov) en
git.php.net. - El equipo de PHP revierte los cambios y, a raíz del incidente, migra la infraestructura oficial a GitHub abandonando su servidor Git propio.
- Aunque la versión nunca llegó a producción de forma legítima, la build troyanizada quedó disponible y es un objetivo recurrente en máquinas de CTF. Existe el exploit público EDB-ID 49933.
4. Factores que la hacen posible
- Ejecutar la build específica 8.1.0-dev con la backdoor.
- Servicio web accesible que procese la cabecera
User-Agentt. - La firma de versión
PHP 8.1.0-devsuele revelarse en el banner de Nmap o en las cabeceras de respuesta del servidor.
5. Detección
- Fingerprint de versión:
nmap -sCV -p8080 target # PHP cli server 5.5 or later (PHP 8.1.0-dev)- Búsqueda de exploit:
searchsploit 8.1.0-dev
# PHP 8.1.0-dev - 'User-Agentt' Remote Code Execution | php/webapps/49933.py- Prueba manual: enviar la cabecera
User-Agentt: zerodiumsystem('id');y observar la salida del comando en la respuesta.
6. Mitigación
- No usar nunca builds de desarrollo (
-dev) en producción. - Verificar la integridad del código fuente (firmas, checksums) antes de compilar/instalar.
- Mantener PHP actualizado a versiones estables y oficiales.
7. Ejemplo de explotación real
Con el exploit público se obtiene una shell interactiva:
❯ python3 49933.py
Enter the full host url:
http://192.168.1.30:8080/
Interactive shell is opened on http://192.168.1.30:8080/
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)8. Clasificación
- Tipo: Backdoor / Supply Chain Attack → Remote Code Execution
- Referencia: EDB-ID 49933 (incidente de
git.php.net, marzo 2021) - CWE:
- CWE-78 – OS Command Injection
- CWE-506 – Embedded Malicious Code
- CWE-94 – Improper Control of Generation of Code (Code Injection)
9. Resumen
La backdoor de PHP 8.1.0-dev ejecuta código arbitrario cuando la cabecera User-Agentt empieza por zerodium, fruto del compromiso del repositorio Git oficial de PHP en 2021. Otorga RCE remoto sin autenticación y es un objetivo habitual en CTFs. La defensa es no usar builds de desarrollo y verificar la integridad del código. Otro caso de ataque a la cadena de suministro.