SOC Prime Bias: Crítico

08 Jun 2026 19:43 UTC

Pré-instalação para Persistência: Dentro da Campanha de Roubo de Credenciais Miasma do npm da Red Hat

Author Photo
SOC Prime Team linkedin icon Seguir
Pré-instalação para Persistência: Dentro da Campanha de Roubo de Credenciais Miasma do npm da Red Hat
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

O Microsoft Defender identificou um comprometimento da cadeia de suprimentos afetando 32 pacotes npm publicados sob o namespace @redhat-cloud-services . Os invasores embutiram um gancho de pré-instalação que implanta um carregador JavaScript altamente ofuscado, que então recupera o runtime Bun e um ladrão de credenciais de segunda etapa. O malware coleta tokens do GitHub, npm, principais provedores de nuvem, HashiCorp Vault e Kubernetes, em seguida, republica pacotes envenenados para continuar se espalhando. A campanha também inclui uma salvaguarda destrutiva que apaga o diretório inicial da vítima se um token de isca for detectado.

Investigação

A investigação rastreou a violação inicial para uma pipeline CI/CD comprometida para RedHatInsights/javascript-clients, onde os invasores abusaram de um fluxo de trabalho legítimo de OIDC do GitHub Actions para publicar pacotes trojanizados com assinaturas de proveniência válidas. A análise do dropper expôs múltiplas camadas de ofuscação, incluindo codificação baseada em ROT, criptografia AES-128-GCM e um cifra personalizada, antes que o Bun fosse executado para lançar o payload de segunda etapa. Os agentes de ameaça também rasparam a memória dos runners do GitHub Actions para extrair segredos diretamente de processos ativos.

Mitigação

A Microsoft recomenda revisar as árvores de dependência para os pacotes afetados, fixar versões confiáveis e desabilitar a execução de scripts npm com a flag @redhat-cloud-services packages, pinning trusted versions, and disabling npm script execution with the --ignore-scripts quando possível. Todos os tokens npm comprometidos devem ser revogados e reemitidos, e as contas do GitHub devem ser revisadas para criação de repositórios não autorizados ou atividades suspeitas. Salvaguardas adicionais foram implementadas dentro do namespace @redhat-cloud-services para evitar publicação não autorizada.

Resposta

Os defensores devem detectar execuções suspeitas de pré-instalação npm e lançamentos inesperados do runtime Bun a partir de diretórios temporários. O monitoramento também deve cobrir a criação de repositórios públicos desconhecidos no GitHub e padrões incomuns de uso de tokens. Defesas de rede devem bloquear ou alertar para conexões a URLs conhecidos de download do Bun e ao domínio api.anthropic.com . Quaisquer credenciais potencialmente expostas devem ser imediatamente rotacionadas, e a memória do runner CI/CD deve ser investigada quanto a sinais de vazamento de segredos.

"graph TB %% Definições de Classe classDef action fill:#99ccff classDef tool fill:#cccccc classDef malware fill:#ffcc99 classDef process fill:#ff9966 %% Nós node_sc_001["<b>Ação</b> – <b>T1195.001 Comprometimento da Cadeia de Suprimentos</b>: Comprometer Dependências de Software e Ferramentas de Desenvolvimento<br/>O invasor sequestrou a pipeline CI/CD do RedHatInsights/javascript-clients e usou OIDC do GitHub Actions para publicar pacotes npm trojanizados @redhat-cloud-services."] class node_sc_001 action tool_github_oidc["<b>Ferramenta</b> – <b>Nome</b>: OIDC do GitHub Actions<br/><b>Descrição</b>: Integração OpenID Connect que fornece tokens de curta duração para fluxos de trabalho CI."] class tool_github_oidc tool malicious_preinstall["<b>Malware</b> – <b>T1127.003 Execução Proxy de Utilitários de Desenvolvedor Confiáveis</b>: Gancho de pré-instalação malicioso em package.json executado automaticamente durante <code>npm install</code>, gerando <code>node index.js</code>."] class malicious_preinstall malware installer_trigger["<b>Ação</b> – <b>T1546.016 Execução Disparada por Evento</b>: Disparador de pacote do instalador que executa o dropper quando o script de pré-instalação é invocado."] class installer_trigger action obfuscated_payload["<b>Malware</b> – <b>T1027.009 Arquivos ou Informações Ofuscadas</b>: Payload embutido (4.29u202fMB index.js) usando camadas múltiplas ROT, AESu2011128u2011GCM, stringu2011array e cifra PBKDF2 personalizada para ocultar seu código."] class obfuscated_payload malware dynamic_resolution["<b>Malware</b> – <b>T1027.007 Arquivos ou Informações Ofuscadas</b>: Resolução de API dinâmica u2013 a desofuscação em tempo de execução resolve URLs para o runtime Bun e endpoints C2."] class dynamic_resolution malware ingress_transfer["<b>Ação</b> – <b>T1105 Transferência de Ferramenta de Ingresso</b>: Dropper baixa o runtime JavaScript Bun dos URLs de release oficiais antes de executar o payload de segunda etapa."] class ingress_transfer action tool_bun_runtime["<b>Ferramenta</b> – <b>Nome</b>: Runtime JavaScript Bun<br/><b>Descrição</b>: Motor JavaScript de alto desempenho usado como ambiente de execução para a segunda etapa."] class tool_bun_runtime tool metadata_query["<b>Ação</b> – <b>T1552.005 Credenciais Inseguras</b>: API de Metadados de Instâncias de Nuvem<br/>Consulta serviços de metadados de AWS/ECS, Azure IMDS e GCP para obter tokens de acesso à nuvem."] class metadata_query action file_credential["<b>Ação</b> – <b>T1552.001 Credenciais Inseguras</b>: Credenciais em Arquivos<br/>Raspa arquivos locais em busca de chaves SSH, configs CLI, arquivos de carteiras de criptomoedas e outros materiais secretos."] class file_credential action token_harvest["<b>Ação</b> – <b>T1528 Roubo de Token de Acesso a Aplicação</b>: Coleta tokens de runner do GitHub Actions, tokens OIDC do npm e outros tokens de provedores."] class token_harvest action browser_discovery["<b>Ação</b> – <b>T1217 Descoberta de Informações do Navegador</b>: Coleta arquivos de armazenamento de navegadores e carteiras de criptomoedas de estações de trabalho de desenvolvedores."] class browser_discovery action elevation_control["<b>Ação</b> – <b>T1548 Abuso do Mecanismo de Controle de Elevação</b>: Instala uma regra sudo sem senha via um mount de vinculação em <code>/etc/sudoers.d</code> para ganhar privilégios de root."] class elevation_control action exfiltration_git["<b>Ação</b> – <b>T1048 Exfiltração por Protocolo Alternativo</b>: Exfiltra credenciais roubadas criando repositórios GitHub sob a conta da vítima, cometendo arquivos JSON, e também usa um endpoint HTTPS alternativo."] class exfiltration_git action destructive_cleanup["<b>Ação</b> – <b>T1070.010 Remoção de Indicador</b>: Realoca malware e, se um token de isca foi utilizado, executa <code>rm -rf ~/</code> para apagar o diretório inicial do usuário."] class destructive_cleanup action node_sc_002["<b>Ação</b> – <b>T1195.002 Comprometimento da Cadeia de Suprimentos</b>: Comprometimento da cadeia de suprimentos de software u2013 republishing pacotes envenenados com proveniência SLSA forjada, permitindo propagação semelhante a verme para projetos a jusante."] class node_sc_002 action %% Conexões node_sc_001 –>|usa| tool_github_oidc tool_github_oidc –>|executa| malicious_preinstall malicious_preinstall –>|dispara| installer_trigger installer_trigger –>|executa| obfuscated_payload obfuscated_payload –>|realiza| dynamic_resolution dynamic_resolution –>|baixa| ingress_transfer ingress_transfer –>|instala| tool_bun_runtime tool_bun_runtime –>|consulta| metadata_query metadata_query –>|raspa| file_credential file_credential –>|coleta| token_harvest token_harvest –>|coleta| browser_discovery browser_discovery –>|habilita| elevation_control elevation_control –>|exfiltra via| exfiltration_git exfiltration_git –>|pode disparar| destructive_cleanup destructive_cleanup –>|facilita| node_sc_002 node_sc_002 –>|propaga para| node_sc_001 "

Fluxo de Ataque

Execução de Simulação

Pré-requisito: O Check de Pré-vazio & Baseline de Telemetria deve ter passado.

Racional: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para disparar 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 de Ataque & Comandos:
    Um adversário que já comprometeu uma VM GCE utiliza uma abordagem viver-da-terra para coletar o token padrão de conta de serviço da VM. Os passos são:

    1. Sonde o servidor de metadados para verificar se está acessível.
    2. Envie uma solicitação de token to http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token com o cabeçalho Metadata-Flavor: Google necessário.
    3. Salve o JSON retornado (contém access_token, expires_in, token_type).
    4. Use o token para chamar uma API GCP privilegiada (por exemplo, listar todos os buckets) para demonstrar credenciais acionáveis.

    Esta sequência exata gera o evento de auditoria GCPServiceAccountTokenAccess, que corresponde à seleção.

  • do Sigma

    Script de Teste de Regressão:
  • Cleanup Commands:

    # Nenhuma alteração persistente foi feita; somente remoção de variáveis temporárias.
    unset TOKEN_RESPONSE ACCESS_TOKEN
    echo "[*] Limpeza completa."