Ataque Massivo na Cadeia de Suprimentos do PyPI Colhe Credenciais na Nuvem através de Hooks de Inicialização do Python
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
Uma operação coordenada da cadeia de suprimentos conhecida como a Campanha Hades comprometeu 26 pacotes PyPI para roubar credenciais de nuvem. O ataque abusa de arquivos .pth para acionar código malicioso durante a inicialização do interpretador, utilizando o runtime Bun JavaScript para executar o payload. Ele é projetado para coletar segredos vinculados a AWS, GCP, Azure, Kubernetes e GitHub em múltiplos sistemas operacionais.
Investigação
A Orca Security identificou 37 arquivos wheel maliciosos espalhados pelos ecossistemas de bioinformática e ferramentas de desenvolvimento. Sua análise expôs uma técnica de cross-runtime na qual o malware baixa Bun para executar payloads JavaScript ofuscados. A campanha também gera tráfego de despiste para serviços de IA Anthropic e usa técnicas de injeção de prompt para reduzir a eficácia da revisão de segurança baseada em LLM.
Mitigação
As organizações devem remover imediatamente os pacotes afetados ou fixá-los para versões seguras e girar todas as credenciais potencialmente expostas. Isso inclui tokens de acesso à nuvem, tokens de acesso pessoal do GitHub, chaves SSH e credenciais do registro Docker. As equipes de segurança também devem caçar os artefatos de persistência conhecidos em hosts Linux, macOS e Windows.
Resposta
Quando o comprometimento é suspeito, isole o sistema afetado antes de rodar as credenciais para reduzir o risco de extorsão através do daemon do monitor de tokens gh . Reconstrua todas as estações de trabalho de desenvolvedores e runners de CI/CD que executaram os pacotes envenenados. Revise os repositórios no GitHub para commits não autorizados e para repositórios recém-criados que correspondam aos padrões de nomenclatura do atacante.
"graph TB %% Definições de Classes classDef technique fill:#99ccff %% Azul para Técnicas MITRE ATT&CK classDef tool fill:#cccccc %% Cinza para Ferramentas e Software classDef action fill:#ff99cc %% Rosa para Ações ou comportamentos específicos classDef persistence fill:#ccffcc %% Verde para mecanismos de Persistência %% Definições de Nós %% Fase de Acesso Inicial e Execução tech_supply_chain["<b>Técnica</b> – <b>T1195.001 Comprometimento da Cadeia de Suprimentos: Comprometer Dependências de Software e Ferramentas de Desenvolvimento</b><br/>Arquivos wheel maliciosos distribuídos via PyPI."] class tech_supply_chain technique tech_user_exec["<b>Técnica</b> – <b>T1204.005 Execução do Usuário: Biblioteca Maliciosa</b><br/>Acionado durante a inicialização do interpretador Python via arquivos *-setup.pth."] class tech_user_exec technique tech_poison_pipeline["<b>Técnica</b> – <b>T1677 Execução do Pipeline Envenenado</b><br/>Código executado automaticamente em ambientes de desenvolvimento e CI."] class tech_poison_pipeline technique %% Fase de Payload e Execução tool_bun["<b>Ferramenta</b> – <b>Nome</b>: Runtime Bun JavaScript<br/>Baixado para executar payload ofuscado."] class tool_bun tool tech_ipc["<b>Técnica</b> – <b>T1559.003 Comunicação Inter-Processual: Serviços XPC</b><br/>Usado para executar o payload ofuscado _index.js."] class tech_ipc technique payload_js["<b>Arquivo</b> – <b>Nome</b>: _index.js<br/>Payload JavaScript ofuscado."] class payload_js tool %% Fase de Persistência tech_persistence["<b>Técnica</b> – <b>Persistência</b><br/>Mantendo o acesso no sistema comprometido."] class tech_persistence technique tech_launch_daemon["<b>Técnica</b> – <b>T1543.004 Criar ou Modificar Processo do Sistema: Launch Daemon</b><br/>Usa serviços systemd no Linux e LaunchAgents no macOS."] class tech_launch_daemon technique svc_monitor["<b>Processo/Serviço</b> – <b>Nome</b>: gh-token-monitor.service<br/>Exemplo de mecanismo de persistência."] class svc_monitor persistence %% Fase de Acesso a Credenciais e Exfiltração tech_cred_access["<b>Técnica</b> – <b>T1212 Exploração para Acesso a Credenciais</b><br/>Raspagem de memória do processo para colher tokens da AWS, GCP, Azure e GitHub."] class tech_cred_access technique tech_archive["<b>Técnica</b> – <b>T1560 Arquivar Dados Coletados</b><br/>Compactação de segredos roubados usando gzip."] class tech_archive technique tech_exfil["<b>Técnica</b> – <b>T1567.001 Exfiltração Via Serviço Web: Exfiltração para Repositório de Código</b><br/>Enviando dados criptografados para repositórios GitHub controlados pelo atacante."] class tech_exfil technique %% Conexões %% A cadeia de suprimentos leva à execução do usuário tech_supply_chain –>|leva_a| tech_user_exec %% Execução do usuário leva ao pipeline envenenado tech_user_exec –>|aciona| tech_poison_pipeline %% O pipeline envenenado aciona a execução do payload tech_poison_pipeline –>|executa| tool_bun %% Ferramenta usa IPC para executar o payload JS tool_bun –>|utiliza| tech_ipc tech_ipc –>|executa| payload_js %% O payload leva à persistência payload_js –>|estabelece| tech_persistence tech_persistence –>|implementa| tech_launch_daemon tech_launch_daemon –>|cria| svc_monitor %% A persistência permite acesso a credenciais svc_monitor –>|habilita| tech_cred_access %% O acesso a credenciais leva à arquivação tech_cred_access –>|resulta_em| tech_archive %% A arquivação leva à exfiltração final tech_archive –>|prepara_dados_para| tech_exfil "
Fluxo de Ataque
Detecções
Criação suspeita de arquivo Plist em LaunchAgents ou LaunchDaemons (via file_event)
Visualizar
Processos filhos NodeJS suspeitos [Linux] (via cmdline)
Visualizar
Criação de arquivo de serviço na pasta Systemd (via file_event)
Visualizar
Possível arquivo de configuração de gancho específico do site foi criado (via file_event)
Visualizar
Script Linux foi criado em pastas temporárias (via file_event)
Visualizar
Pacotes Python maliciosos IOCs (via cmdline)
Visualizar
Detecção de raspagem de token de autenticação GCP pela Campanha Hades [Google Cloud Platform]
Visualizar
Campanha Hades – Exfiltração de Tokens de Autenticação do Azure [Azure Activity Logs]
Visualizar
Coleta de Credenciais de Nuvem AWS via Ataque de Cadeia de Suprimentos PyPI [AWS Cloudtrail]
Visualizar
Execução de Simulação
Pré-requisito: A verificação pré-voo de Telemetria & Baseline deve ter sido aprovada.
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 narrativa DEVEM refletir diretamente as TTPs identificadas 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: O adversário comprometeu com sucesso a estação de trabalho de um desenvolvedor via um pacote PyPI malicioso (Campanha Hades). Um gancho de inicialização do Python foi executado, raspando com sucesso um token de autenticação Azure da memória/cache local. Para simular a detecção dessa atividade nos Logs de Auditoria do Azure, vamos simular a geração de uma entrada de Log de Auditoria que contém a string específica “Tokens de autenticação Azure” no campo de descrição, imitando a telemetria do evento que um sistema automatizado pode relatar quando detecta tal exfiltração.
-
Script de Teste de Regressão: Como não podemos forçar facilmente o backend real do Azure a gerar uma string de descrição maliciosa específica sem uma violação real, simulamos a presença do log no fluxo de telemetria (frequentemente feito em BAS por injetar um log sintético no workspace).
# Injeção de Log Sintético para simular a detecção de exfiltração de token # Isto simula o campo 'Descrição' sendo populado com a string alvo. $LogEntry = @{ TimeGenerated = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ssZ") OperationName = "TokenExfiltrationDetected" Result = "Success" Description = "Atividade de malware detectada: tokens de autenticação Azure foram exfiltrados de um processo local." Identity = "gancho-python-malicioso@atacante.com" } Write-Host "Injetando telemetria sintética para validar a regra de detecção..." # Em um BAS real, isto chamaria a API do Coletor de Dados do Log Analytics # Para fins de simulação, representamos a entrada de log resultante: $LogEntry | ConvertTo-Json -
Comandos de Limpeza:
# Se logs sintéticos foram injetados via API, delete o ID de correlação específico # Para esta simulação, nenhuma alteração persistente foi feita no Tenant do Azure. Write-Host "Limpeza completa. Nenhum artefato adversário persistente permanece."