El 22 de mayo de 2026, investigadores de Aikido Security, Socket y StepSecurity detectaron un ataque sofisticado contra el ecosistema PHP: cuatro paquetes del proyecto laravel-lang fueron comprometidos con un malware de robo de credenciales que se ejecuta automáticamente al instalar el paquete vía Composer.
Qué ocurrió
Los atacantes obtuvieron acceso a los repositorios de GitHub mediante un GitHub Personal Access Token (PAT) filtrado, probablemente procedente de una brecha anterior en GitHub. Con este acceso, reescribieron todas las etiquetas (tags) de release existentes en cuatro repositorios del proyecto laravel-lang, apuntándolas a commits maliciosos en un fork que ellos controlaban. Esto comprometió 233 versiones directas y afectó a aproximadamente 700 versiones históricas.
La técnica es especialmente peligrosa porque GitHub permite que las etiquetas referencien commits de un fork del mismo repositorio. El desarrollador que ejecuta composer require o composer update recibe código malicioso aunque el nombre y la versión del paquete sean legítimos.
Paquetes afectados
- laravel-lang/lang — biblioteca de traducciones para Laravel (7.800+ estrellas en GitHub)
- laravel-lang/http-statuses — traducciones de códigos de estado HTTP
- laravel-lang/attributes — traducciones de atributos Eloquent
- laravel-lang/actions — traducciones de acciones comunes
Mecanismo del ataque
El vector de infección inicial era un fichero src/helpers.php inyectado en el composer.json del paquete bajo la clave autoload.files. Esto provoca que el código malicioso se ejecute en cada petición PHP desde el momento en que el paquete queda instalado, sin que el desarrollador tenga que hacer nada más.
El dropper (Fase 1) realiza un fingerprint del sistema usando rutas de ficheros, hostname e inodos, escribe un marcador de persistencia en el directorio temporal, y ofusca el dominio C2 en arrays de enteros antes de contactar con la infraestructura del atacante. En Windows descarga un lanzador .vbs; en Linux/macOS usa exec() para ejecución en segundo plano.
Análisis del payload
El stealer de Fase 2 contiene aproximadamente 5.900 líneas de código PHP distribuidas en 15 módulos especializados de recolección. Sus capacidades incluyen:
- Claves de cloud: AWS, GCP, Azure, Kubernetes tokens, Vault
- Credenciales de repositorios: SSH, Git, GitHub, GitLab, Bitbucket
- Datos de CI/CD: variables de entorno, tokens de pipelines
- Más de 17 tipos de navegador (Chrome, Firefox, Brave, Edge, etc.)
- Carteras de criptomonedas: Bitcoin, Ethereum, Monero
- Gestores de contraseñas
- Plataformas de comunicación: Slack, Discord
- Ficheros
.env, tokens API de Stripe, PayPal y servicios similares - Configuraciones VPN y claves SSH
Toda la información exfiltrada se cifra con AES-256 antes de enviarse al servidor C2 (flipboxstudio[.]info, endpoints /payload y /exfil). El malware se autoeliminó tras la transmisión para dificultar el análisis forense.
Cronología
- 22 mayo 2026 — 22:32 UTC: Inicio del ataque sobre
laravel-lang/lang - 23 mayo 2026 — 00:00 UTC: Ataque completado;
laravel-lang/actionscomprometido - 23 mayo 2026: Aikido Security, Socket y StepSecurity reportan el incidente a Packagist
- 23 mayo 2026: Packagist elimina las versiones maliciosas y da de baja temporalmente los paquetes
- 25 mayo 2026: Actualización del advisory con nuevos hallazgos
Qué debes hacer ahora
- Tratar el entorno como comprometido. Si has instalado o actualizado cualquiera de los cuatro paquetes entre el 22 y el 23 de mayo, asume que las credenciales accesibles desde ese proceso PHP han sido robadas.
- Rotar todas las credenciales. Claves AWS/GCP/Azure, tokens GitHub/GitLab, tokens Stripe/PayPal, claves SSH, contraseñas de base de datos y cualquier secreto en ficheros
.env. - No instalar estos paquetes hasta que el proyecto laravel-lang confirme la integridad de sus repositorios y Packagist restablezca los listados.
- Bloquear el dominio C2:
flipboxstudio[.]infoa nivel de firewall, DNS y WAF. - Revisar logs de acceso en busca de conexiones salientes a ese dominio desde el 22 de mayo.
- Auditar permisos SCM y activar MFA con hardware (FIDO2) en todas las cuentas con acceso de escritura a repositorios.
- Reconstruir desde imágenes limpias los servidores que ejecutaban el código afectado.
Lección para equipos PHP
Este ataque ilustra un riesgo fundamental del modelo de paquetes modernos: la confianza en el nombre del paquete y el número de versión no es suficiente. Los equipos deben usar hash pinning en composer.lock, verificar la integridad de los paquetes con herramientas como Socket o Aikido, y revisar regularmente las dependencias transitivas de sus proyectos Laravel.
Fuentes y documentación
- Aikido Security — Análisis técnico completo del ataque
- Snyk — Advisory de cadena de suministro Laravel Lang
- BleepingComputer — Laravel-Lang packages hijacked
- SecurityWeek — Laravel-Lang Packages Poisoned
- CyberSecurityNews — 700 GitHub Repos comprometidos
- Packagist — Actualización de seguridad de la cadena de suministro