Al comprometer el proceso de publicación de GitHub Actions del proyecto TanStack, los atacantes lograron publicar 84 versiones maliciosas de 42 paquetes NPM del stack de TanStack en el repositorio NPM. Algunos de los paquetes comprometidos se descargaron más de 10 millones de veces por semana.
El acceso a la publicación de la versión se obtuvo debido a una configuración incorrecta de pull_request_target "Pwn Request" en GitHub Actions (especificar una máscara en la configuración llevó al lanzamiento de pull_request_target para solicitudes de extracción a bifurcaciones de terceros), envenenando la caché de GitHub Actions a través de una bifurcación y la capacidad de extraer un token OIDC de la memoria de un proceso ejecutor en ejecución (Runner.Worker) leyendo el contenido de /proc/ /mem.
El 11 de mayo, entre las 22:20 y las 22:26 (hora de Moscú), se publicaron paquetes NPM con modificaciones maliciosas. Estos paquetes fueron detectados 20 minutos después y bloqueados una hora y media más tarde. Se publicaron dos versiones maliciosas de cada paquete NPM afectado, cada una con código para activar el gusano mini-shai-hulud, que busca tokens y credenciales en el entorno actual. Si se detectaba un token de conexión al directorio NPM, el gusano publicaba automáticamente nuevas versiones maliciosas de los paquetes que se estaban desarrollando en dicho entorno, afectando así al árbol de dependencias. Más de 400 paquetes NPM que utilizaban paquetes TanStack como dependencias se vieron afectados de esta manera.
El gusano se instaló en el archivo router_init.js y se activó cuando el desarrollador instaló manualmente el paquete afectado o automáticamente en un entorno de integración continua mediante los comandos "npm install", "pnpm install" o "yarn install". Una vez activado, el gusano buscó en el sistema tokens de NPM (~/.npmrc), AWS, GCP, Azure, HashiCorp y KubernetesK8s, así como claves privadas SSH. Los datos encontrados se enviaron a los atacantes a través del mensajero P2P descentralizado getsession.org.
El gusano fue diseñado para realizar acciones destructivas en caso de que se revocara un token NPM interceptado. El sistema estaba configurado para ejecutar periódicamente el script ~/.local/bin/gh-token-monitor.sh, que comprobaba la actividad del token cada 60 segundos accediendo a api.github.com/user y, en caso de que se revocara un token, ejecutaba el comando "rm -rf ~/".
Fuente: opennet.ru
