cd ~/blog

~/vulns/php-810-dev-backdoor-user-agentt-rce.md

PHP 8.1.0-dev Backdoor (User-Agentt RCE)

rce 18-06-2026
PHPbackdoorRCEsupply-chain

~2 min de lectura


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-data o, 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

  1. Ejecutar la build específica 8.1.0-dev con la backdoor.
  2. Servicio web accesible que procese la cabecera User-Agentt.
  3. La firma de versión PHP 8.1.0-dev suele 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

  1. No usar nunca builds de desarrollo (-dev) en producción.
  2. Verificar la integridad del código fuente (firmas, checksums) antes de compilar/instalar.
  3. 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.

// relacionados