
Backdoor User-Agentt de PHP 8.1.0-dev: Ejecución Remota de Código (RCE)
User-Agentt Backdoor de Ejecución Remota de Código (RCE)Severidad: Crítico (Equivalente CVSS: 10.0)
Tipo de Vulnerabilidad: Backdoor de Cadena de Suministro / Ejecución Remota de Código (RCE)
Software Afectado: PHP 8.1.0-dev (Solo Build de Desarrollo)
Vector de Ataque: Remoto (Sin Autenticación)
Autenticación Requerida: No
Interacción del Usuario: Ninguna
Impacto: Compromiso Total del Sistema
El Backdoor User-Agentt de PHP 8.1.0-dev es uno de los compromisos de cadena de suministro más infames en la historia del software de código abierto. A diferencia de las vulnerabilidades tradicionales que surgen de errores de programación, este problema fue el resultado de código malicioso insertado intencionalmente en el repositorio oficial del código fuente de PHP.
El backdoor apareció en los snapshots de desarrollo de PHP 8.1.0-dev durante marzo de 2021, después de que los atacantes comprometieran con éxito la infraestructura Git de PHP. Los commits maliciosos suplantaron a mantenedores de confianza de PHP e introdujeron un mecanismo oculto capaz de ejecutar código PHP arbitrario siempre que se recibiera una cabecera HTTP especialmente manipulada.
Aunque el backdoor estuvo presente solo brevemente antes de ser descubierto y eliminado, cualquier servidor que implementara uno de los builds de desarrollo comprometidos se volvió instantáneamente vulnerable a la Ejecución Remota de Código (RCE) sin autenticación.
Este incidente cambió fundamentalmente el flujo de trabajo de desarrollo de PHP y finalmente condujo a la migración del repositorio fuente de PHP fuera de su infraestructura Git autogestionada. :contentReference[oaicite:0]{index=0}
La mayoría de las vulnerabilidades de Ejecución Remota de Código se originan en:
Esta vulnerabilidad fue diferente.
No era un bug de código.
Era un backdoor plantado deliberadamente oculto dentro del código fuente legítimo de PHP.
En lugar de explotar una debilidad existente, los atacantes modificaron el propio PHP para ejecutar código PHP arbitrario suministrado por cualquier persona que realizara una solicitud HTTP.
Eso convierte este incidente en uno de los ejemplos más conocidos de un ataque a la cadena de suministro de software.
El 28 de marzo de 2021, aparecieron dos commits sospechosos en el repositorio Git de PHP.
Ambos commits parecían provenir de mantenedores conocidos de PHP.
Inicialmente parecían inofensivos.
Los mensajes de los commits se asemejaban a correcciones ordinarias de erratas.
Sin embargo, los investigadores notaron rápidamente código sospechoso añadido al intérprete de PHP.
El código insertado buscaba en las solicitudes HTTP entrantes una cabecera personalizada:
User-Agentt
Observe la "t" adicional.
Esta sutil diferencia ortográfica ayudó a ocultar el backdoor durante revisiones casuales.
Si la cabecera comenzaba con la cadena de activación:
zerodium
PHP ejecutaba inmediatamente todo lo que venía después usando:
zend_eval_string()
Esto efectivamente permitía a cualquier persona ejecutar código PHP arbitrario de forma remota.
Los commits maliciosos fueron eliminados en cuestión de horas después de su descubrimiento. La investigación indicó posteriormente que los atacantes habían comprometido la infraestructura Git de PHP en lugar de obtener legítimamente las claves de firma de los mantenedores. :contentReference[oaicite:1]{index=1}
El código insertado realizaba aproximadamente la siguiente lógica:
Incoming HTTP Request
│
▼
Read User-Agentt Header
│
▼
Does header start with "zerodium"?
│
Yes ▼
Execute remaining text as PHP
│
▼
Attacker gains Remote Code Execution
En lugar de tratar la cabecera como metadatos inofensivos, PHP la evaluaba directamente como código PHP ejecutable.
Normalmente, una solicitud HTTP contiene cabeceras similares a:
GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla Firefox
La versión comprometida de PHP procesaba adicionalmente:
User-Agentt:
Si su valor comenzaba con:
zerodium
PHP llamaba a:
zend_eval_string()
El contenido restante se convertía en PHP ejecutable.
Conceptualmente:
User-Agentt:
zerodium
│
▼
zend_eval_string(payload)
│
▼
Remote Code Execution
Attacker
│
│ HTTP Request
▼
GET /
User-Agentt: zerodiumsystem("id");
│
▼
PHP 8.1.0-dev
│
▼
Backdoor Triggered
│
▼
system("id")
│
▼
Command Executed
│
▼
Output Returned
Sin autenticación.
Sin sesión.
Sin credenciales.
Una sola solicitud HTTP era suficiente.
Los atacantes eligieron intencionalmente
User-Agentt
en lugar de
User-Agent
porque:
Esta pequeña errata ocultaba un backdoor completo de ejecución remota de código.
Solo:
PHP 8.1.0-dev
Específicamente los snapshots de desarrollo comprometidos publicados durante el incidente de marzo de 2021.
Las versiones estables como:
nunca se vieron afectadas.
El atacante solo necesitaba:
Sin autenticación.
Sin fuerza bruta.
Sin inicio de sesión.
Sin acceso previo.
Una explotación exitosa permite a los atacantes:
En la práctica, esta vulnerabilidad resulta en el compromiso total del servidor.
| Técnica | Descripción |
|---|---|
| T1195 | Compromiso de la Cadena de Suministro |
| T1059 | Intérprete de Comandos y Scripts |
| T1505 | Componente de Software de Servidor |
| T1105 | Transferencia de Herramientas de Entrada |
| T1071 | Protocolo de Capa de Aplicación |
| T1106 | API Nativa |
| T1055 | Inyección de Procesos (posible post-explotación) |
| T1027 | Archivos o Información Ofuscados |
Los administradores deben investigar inmediatamente los sistemas que expongan:
PHP/8.1.0-dev
dentro de las cabeceras de respuesta como:
X-Powered-By:
PHP/8.1.0-dev
Los registros HTTP también deben examinarse en busca de solicitudes sospechosas que contengan:
User-Agentt
o
zerodium
Muchos sistemas de detección de intrusiones y productos IPS ahora incluyen firmas específicas para este patrón de ataque. :contentReference[oaicite:2]{index=2}
Los posibles indicadores incluyen:
User-Agenttzerodium| Propiedad | Valor |
|---|---|
| Autenticación | Ninguna |
| Interacción del Usuario | Ninguna |
| Complejidad | Muy Baja |
| Privilegios Requeridos | Ninguno |
| Remoto | Sí |