El 1 de junio de 2026, detectamos que múltiples paquetes oficiales de @redhat-cloud-services alcance en npm fueron comprometidos con un gusano de robo de credenciales. En total, 96 versiones de 32 paquetes han sido comprometidas, descargadas acumulativamente 116.991 veces por semana. El malware parece similar al malware Mini Shai-Hulud que fue recientemente liberado como código abierto por TeamPCP. Dado que las herramientas se hicieron públicas, otros actores de amenazas ahora tienen acceso a las mismas técnicas y pueden replicarlas o adaptarlas. Los paquetes se publicaron a través de GitHub Actions OIDC, lo que indica que el pipeline de CI/CD fue comprometido en lugar de un token de npm. Si ha instalado alguna versión de paquete afectada desde el 1 de junio de 2026, considere todos los secretos de CI, credenciales de cloud, claves SSH y tokens de npm como comprometidos y rótelos inmediatamente.
Cronología de la campaña Mini Shai-Hulud
- 22 de abril de 2026 - @bitwarden/cli comprometido a través de un flujo de trabajo envenenado de GitHub Actions. La carga útil se autoidentifica como "Shai-Hulud: The Third Coming."
- 29 de abril de 2026 - Cuatro paquetes npm de SAP comprometidos debido a la filtración de un token npm a través de una compilación maliciosa de solicitud de extracción de CircleCI.
- 30 de abril de 2026 - PyTorch Lightning comprometido en PyPI, versiones 2.6.2 y 2.6.3.
- 12 de mayo de 2026 - Mini Shai-Hulud afecta a más de 160 paquetes, incluyendo Mistral y Tanstack.
- 12 de mayo de 2026 - TeamPCP publica el código fuente completo de Shai-Hulud en GitHub, junto con publicaciones en BreachForums animando a otros a ejecutar sus propias campañas.
- 19 de mayo de 2026 - Paquete npm DurableTask de Microsoft comprometido, causado por una cuenta de GitHub previamente comprometida.
- Junio 1, 2026 - Más de 30
@redhat-cloud-servicespaquetes npm comprometidos con Miasma, una nueva variante de Mini Shai-Hulud.
Miasma: ¿Ha vuelto Shai-Hulud?
El payload incrustado en los paquetes afectados tiene fuertes similitudes con Mini Shai-Hulud, el malware de cadena de suministro de código abierto por TeamPCP. Curiosamente, esta versión se autodenomina "Miasma" y parece haber reemplazado las referencias familiares de Dune de Shai-Hulud por la mitología griega.
TeamPCP es un grupo de actores de amenazas que ha estado llevando a cabo ataques dirigidos a la cadena de suministro de CI/CD durante varios meses. Su malware Mini Shai-Hulud es un sofisticado gusano de robo de credenciales que se propaga republicando versiones con puertas traseras de paquetes a los que la cuenta de la víctima tiene acceso. Anteriormente hemos informado sobre compromisos que afectan a Mistral y TanStack, Durable Task de Microsoft, PyTorch Lightning, Bitwarden CLI, e Intercom, todos ellos rastreados hasta las mismas herramientas.
Cuando TeamPCP liberó Mini Shai-Hulud como código abierto, la amenaza se expandió más allá de un único actor. Cualquier grupo puede ahora tomar el framework, adaptarlo y desplegarlo contra nuevos objetivos.
Bypass de publicación de confianza
Trusted publishing es un mecanismo introducido por npm para eliminar los tokens de publicación de larga duración de los pipelines de CI/CD, sustituyéndolos por tokens OIDC de corta duración emitidos por GitHub Actions. Fue diseñado para ser más seguro, pero como demuestran los ataques recientes, puede ser eludido si un atacante obtiene acceso a un pipeline de CI/CD a través de una vulnerabilidad o un token comprometido.
Encontramos que la cuenta de GitHub de un empleado de Red Hat fue comprometida y utilizada para subir commits huérfanos maliciosos directamente a varios repositorios, saltándose por completo la revisión de código. Esos commits huérfanos contenían un archivo de flujo de trabajo (ci.yaml) y un script (_index.js).
name: release
on:
push:
branches: ['*']
jobs:
release:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6
- name: prepare
run: bun run _index.js
env:
OIDC_PACKAGES: "@redhat-cloud-services/frontend-components-advisor-components, @redhat-cloud-services/chrome, @redhat-cloud-services/frontend-components, @redhat-cloud-services/frontend-components-config-utilities, @redhat-cloud-services/frontend-components-config, @redhat-cloud-services/eslint-config-redhat-cloud-services, @redhat-cloud-services/frontend-components-notifications, @redhat-cloud-services/frontend-components-remediations, @redhat-cloud-services/rule-components, @redhat-cloud-services/frontend-components-testing, @redhat-cloud-services/frontend-components-translations, @redhat-cloud-services/tsc-transform-imports, @redhat-cloud-services/types, @redhat-cloud-services/frontend-components-utilities"
WORKFLOW_ID: "ci.yaml"
REPO_ID_SUFFIX: "RedHatInsights/frontend-components"Cuando se ejecuta el flujo de trabajo, instala Bun y ejecuta _index.js, pasándole una lista de paquetes objetivo a través de la variable de entorno OIDC_PACKAGES variable de entorno. El script utiliza el permiso id-token: write para solicitar un token OIDC de corta duración a GitHub, y luego utiliza ese token para autenticarse directamente con el endpoint de publicación de confianza de npm y publicar versiones con puerta trasera de cada paquete de la lista.
Este es el mismo patrón fundamental observado en los compromisos de TanStack y Bitwarden: el propio pipeline de CI/CD se convierte en la superficie de ataque, mientras que la publicación de confianza basada en OIDC —diseñada para eliminar los tokens de larga duración— se convierte en una señal de confianza engañosa.
El script de preinstalación
Cada paquete comprometido declara un script de preinstalación en su package.json que ejecuta node index.js automáticamente en cada npm install, antes de que se ejecute cualquier código de aplicación y antes de que el desarrollador tenga alguna indicación de que algo va mal.
"scripts": {
"preinstall": "node index.js"
}
El archivo index.js es una carga útil de 4.2 MB oculta tras múltiples capas de ofuscación.
Qué roba
Al igual que en ataques anteriores de Mini Shai-Hulud, la carga útil realiza un barrido exhaustivo de credenciales en proveedores de la nube, entornos CI/CD y herramientas de desarrollo. En el lado de CI, se dirige a los secretos de GitHub Actions, incluyendo GITHUB_TOKEN y ACTIONS_RUNTIME_TOKEN. Para las credenciales de la nube, recopila claves de acceso y tokens de sesión de AWS, credenciales predeterminadas de aplicación y archivos de clave de cuenta de servicio de GCP, y credenciales de entidad de servicio y tokens de identidad administrada de Azure. También busca tokens de HashiCorp Vault, tokens de cuenta de servicio de Kubernetes y archivos kubeconfig, tokens de publicación de npm y PyPI, claves privadas SSH, credenciales de registro de Docker, claves GPG y cualquier archivo .env que pueda encontrar en el sistema de archivos.
Cómo Aikido detecta esto
Si es usuario de Aikido, revise su feed central y filtre por problemas de malware. Esto aparecerá como un problema crítico de 100/100. Aikido realiza reescaneos cada noche, pero recomendamos activar un reescaneo manual ahora.
Si aún no es usuario de Aikido, puede crear una cuenta y conectar sus repositorios. Nuestra cobertura de malware está incluida en el plan gratuito, sin necesidad de tarjeta de crédito.
Para una cobertura más amplia en todo su equipo, Device Protection de Aikido le proporciona visibilidad y control sobre los paquetes de software instalados en los dispositivos de su equipo. Cubre extensiones de navegador, bibliotecas de código, plugins IDE y dependencias de compilación, todo en un solo lugar. Detenga el malware antes de que se instale.
Para una protección futura, considere Aikido Safe Chain (código abierto). Safe Chain se integra en su flujo de trabajo existente, interceptando comandos npm, npx, yarn, pnpm y pnpx y verificando los paquetes con Aikido Intel antes de la instalación.
Indicadores de compromiso
Si ha instalado alguna de las siguientes versiones de paquetes, considere todos los secretos de CI, credenciales de la nube, claves SSH y tokens npm como comprometidos y rótelos inmediatamente:
@redhat-cloud-services/chrome(2.3.1, 2.3.2)@redhat-cloud-services/compliance-client(4.0.3, 4.0.4)@redhat-cloud-services/config-manager-client(5.0.4, 5.0.5)@redhat-cloud-services/entitlements-client(4.0.11, 4.0.12)@redhat-cloud-services/eslint-config-redhat-cloud-services(3.2.1, 3.2.2)@redhat-cloud-services/frontend-components(7.7.2, 7.7.3)@redhat-cloud-services/frontend-components-advisor-components(3.8.2)@redhat-cloud-services/frontend-components-config(6.11.3, 6.11.4)@redhat-cloud-services/frontend-components-config-utilities(4.11.2, 4.11.3)@redhat-cloud-services/frontend-components-notifications(6.9.2, 6.9.3)@redhat-cloud-services/frontend-components-remediations(4.9.2, 4.9.3)@redhat-cloud-services/frontend-components-testing(1.2.1, 1.2.2)@redhat-cloud-services/frontend-components-translations(4.4.1, 4.4.2)@redhat-cloud-services/frontend-components-utilities(7.4.1, 7.4.2)@redhat-cloud-services/hcc-feo-mcp(0.3.1, 0.3.2)@redhat-cloud-services/hcc-kessel-mcp(0.3.1, 0.3.2)@redhat-cloud-services/hcc-pf-mcp(0.6.1, 0.6.2)@redhat-cloud-services/host-inventory-client(5.0.3, 5.0.4)@redhat-cloud-services/insights-client(4.0.4, 4.0.5)@redhat-cloud-services/integrations-client(6.0.4, 6.0.5)@redhat-cloud-services/javascript-clients-shared(2.0.8, 2.0.9)@redhat-cloud-services/notifications-client(6.1.4, 6.1.5)@redhat-cloud-services/patch-client(4.0.4, 4.0.5)@redhat-cloud-services/quickstarts-client(4.0.11, 4.0.12)@redhat-cloud-services/rbac-client(9.0.3, 9.0.4)@redhat-cloud-services/remediations-client(4.0.4, 4.0.5)@redhat-cloud-services/rule-components(4.7.2, 4.7.3)@redhat-cloud-services/sources-client(3.0.10, 3.0.11)@redhat-cloud-services/topological-inventory-client(3.0.10, 3.0.11)@redhat-cloud-services/tsc-transform-imports(1.2.2)@redhat-cloud-services/types(3.6.1, 3.6.2, 3.6.4)@redhat-cloud-services/vulnerabilities-client(2.1.8, 2.1.9)

