Ataque à Cadeia de Suprimentos Miasma se Espalha Através do Phantom Gyp Worm
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
Uma nova variante do worm Miasma está se espalhando pelo ecossistema npm ao abusar de um binding.gyp arquivo malicioso que desencadeia execução de código durante npm install. Este método escapa de muitas verificações tradicionais baseadas em scripts, baixa um runtime Bun alternativo, rouba credenciais de CI/CD e nuvem, e envia os dados coletados para uma conta morta no GitHub. Mais de 57 pacotes foram comprometidos durante uma campanha em rápida movimentação que ocorreu em menos de duas horas em 3 de junho de 2026. O worm também planta backdoors dentro de arquivos de configuração de assistentes de código de IA.
Investigação
Pesquisadores recriaram a intrusão dentro de um runner endurecido do GitHub Actions e capturaram a árvore de processos completa, o tráfego de rede e os artefatos de código envolvidos no ataque. Sua análise revelou a técnica Phantom Gyp, uma cadeia de carga útil ofuscada em quatro estágios, e o uso de Bun para evitar detecções focadas apenas no comportamento do Node.js. O roubo de credenciais foi realizado lendo a memória do runner e consultando endpoints de metadados de instâncias na nuvem. A exfiltração ocorreu então através de solicitações autenticadas da API do GitHub para uma conta maliciosa que criava repositórios dinamicamente para armazenar os dados roubados.
Mitigação
Os defensores devem reduzir a exposição bloqueando etapas de compilação nativa, desabilitando node-gyp quando possível, ou ignorando scripts de instalação em ambientes de alto risco. Janelas de resfriamento de registros e verificação de assinaturas de procedência do SLSA também podem ajudar a limitar a adulteração de pacotes. As equipes de segurança devem observar por downloads inesperados do Bun, arquivos index.js root superdimensionados, e a criação de novos repositórios no GitHub por tokens emitidos pelo CI. Quaisquer tokens expostos ou credenciais de nuvem devem ser rotacionados imediatamente.
Resposta
As organizações devem detectar binding.gyp arquivos contendo padrões como <!(node index.js ...), alertar sobre downloads do runtime Bun, e parar o fluxo de trabalho afetado assim que a atividade maliciosa for confirmada. Os repositórios devem ser examinados para arquivos de configuração de assistente de IA injetados e limpos prontamente. Todos os tokens roubados devem ser revogados e rotacionados, alcances de permissão de CI/CD revisados e uma investigação completa de resposta ao incidente lançada para determinar a extensão da exposição das credenciais.
Fluxo do Ataque
Ainda estamos atualizando esta parte. Inscreva-se para ser notificado
Notifique-meDetecções
Upload/Download de Arquivo Remoto via Ferramentas Padrão (via linha de comando)
Ver
Script de Linux Criado em Pastas Temporárias (via file_event)
Ver
Arquivo Oculto Criado em Host Linux (via file_event)
Ver
IOCs (HashSha256) para detectar: Ataque à Cadeia de Suprimentos Miasma npm: Worm de Auto-Disseminação via Phantom Gyp
Ver
IOCs (HashMd5) para detectar: Ataque à Cadeia de Suprimentos Miasma npm: Worm de Auto-Disseminação via Phantom Gyp
Ver
Detecção de Ataque à Cadeia de Suprimentos do Miasma Npm [Indicadores de Rede]
Ver
Detecção de Ataque à Cadeia de Suprimentos Miasma npm via Técnica Phantom Gyp [Criação de Processo Linux]
Ver
Execução de Simulação
Pré-requisito: A Verificação de Pré-Voo de Telemetria e Linha de Base deve ter passado.
Justificativa: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa DEVEM refletir diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção.
-
Narrativa & Comandos do Ataque:
Um invasor compromete um pacote npm de código aberto, adicionando umbinding.gypmalicioso. Quando um desenvolvedor executanpm install, o processo de construção do pacote invocanode-gyp rebuild. Dentro do script de construção gerado, o invasor:- Baixa o runtime Bun (binário assinado) via
curlpara um diretório temporário (/tmp/b-<rand>/). - Eleva privilégios invocando
sudo python3para descompactar o zip e colocar o binário em/usr/local/bin. - Coleta o token do GitHub do desenvolvedor usando
gh auth token. - Executa uma carga útil (
bun run /tmp/p1764ajw42rg.js) que exfiltra dados.
Cada etapa aparece verbatim nos logs de criação de processos, satisfazendo a regra Sigma
contémlista. - Baixa o runtime Bun (binário assinado) via
-
Script de Teste de Regressão: O script Bash a seguir reproduz a cadeia exata de comandos em um ambiente de laboratório controlado.
# miasma_phantom_gyp_simulation.sh set -euo pipefail # 1. Preparar um pacote npm falso com binding.gyp malicioso PKG_DIR=$(mktemp -d /tmp/miasma_pkg.XXXX) cd "$PKG_DIR" npm init -y >/dev/null 2>&1 cat > binding.gyp <<'EOF' { "targets": [ { "target_name": "evil", "sources": [ "evil.c" ] } ] } EOF echo "int main(){return 0;}" > evil.c # Instalar node-gyp localmente npm install node-gyp >/dev/null 2>&1 # 2. Executar node-gyp rebuild (primeiro indicador) ./node_modules/.bin/node-gyp rebuild # 3. Baixar runtime Bun (segundo indicador) TMPDIR=$(mktemp -d /tmp/b-XXXXXX) curl -sSL "https://github.com/oven-sh/bun/releases/download/bun-v1.3.13/bun-linux-x64-baseline.zip" -o "$TMPDIR/bun.zip" # 4. Elevar com sudo python3 para descompactar (terceiro indicador) sudo python3 - <<PYTHON import zipfile, sys, os zip_path = os.getenv('TMPDIR') + '/bun.zip' with zipfile.ZipFile(zip_path, 'r') as z: z.extractall(os.getenv('TMPDIR')) PYTHON # 5. Adquirir token do GitHub (quarto indicador) # Nota: Isso requer que o GitHub CLI seja instalado e previamente autenticado. gh auth token > "$TMPDIR/gh_token.txt" # 6. Executar carga maliciosa via Bun (quinto indicador) # Criar uma carga JS falsa echo "console.log('exfiltrated');" > "$TMPDIR/p1764ajw42rg.js" "$TMPDIR/bun" run "$TMPDIR/p1764ajw42rg.js" echo "Simulação completa. Verifique seu SIEM para os alertas gerados." -
Comandos de Limpeza: Remova artefatos temporários e reverta artefatos de escalonamento de privilégio.
# cleanup_miasma_simulation.sh set -euo pipefail # Remova diretórios temporários rm -rf "$PKG_DIR" "$TMPDIR" # Opcionalmente remova o binário Bun instalado de /usr/local/bin se ele foi colocado lá if command -v bun >/dev/null; then sudo rm -f "$(command -v bun)" fi # Limpar qualquer token de GitHub capturado shred -u "$HOME/.config/gh/hosts.yml" 2>/dev/null || true echo "Limpeza finalizada."