SOC Prime Bias: Crítico

05 Jun 2026 15:45 UTC

Ataque à Cadeia de Suprimentos Miasma se Espalha Através do Phantom Gyp Worm

Author Photo
SOC Prime Team linkedin icon Seguir
Ataque à Cadeia de Suprimentos Miasma se Espalha Através do Phantom Gyp Worm
shield icon

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-me

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 um binding.gypmalicioso. Quando um desenvolvedor executa npm install, o processo de construção do pacote invoca node-gyp rebuild. Dentro do script de construção gerado, o invasor:

    1. Baixa o runtime Bun (binário assinado) via curl para um diretório temporário (/tmp/b-<rand>/).
    2. Eleva privilégios invocando sudo python3 para descompactar o zip e colocar o binário em /usr/local/bin.
    3. Coleta o token do GitHub do desenvolvedor usando gh auth token.
    4. 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ém lista.

  • 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."