Um atacante publicou uma versão maliciosa do pacote “elementary-data” no PyPI e no GitHub Container Registry no dia 24 de abril. Credenciais de acesso a ambientes em nuvem, chaves SSH, carteiras de criptomoedas e segredos de infraestrutura com o pacote instalado foram expostos.
Nenhuma conta de mantenedor foi comprometida. O atacante explorou uma falha no próprio sistema de automação do projeto.
Nossos vídeos em destaque
O elementary-data é uma ferramenta open-source de observabilidade de dados para o ecossistema dbt. É usada por engenheiros de dados para monitorar pipelines. O pacote tem mais de 1,1 milhão de downloads mensais no PyPI e presença significativa em ambientes corporativos.
)
A falha que abriu a porta
O ataque começou com um comentário numa pull request aberta. O projeto mantinha um workflow no GitHub Actions chamado update_pylon_issue.yml. Ele processava comentários de PRs e tinha um erro clássico de segurança, ele interpolava o conteúdo do comentário diretamente em um comando de shell, sem nenhuma sanitização.
O atacante criou uma conta no GitHub com dois dias de vida. Postou um comentário com código malicioso disfarçado de texto. Quando o workflow leu o comentário e tentou processá-lo, executou o código do atacante dentro da infraestrutura do próprio GitHub.
É basicamente o equivalente de um formulário de contato que executa tudo que o usuário digitar como se fosse um comando do sistema operacional.
)
Do comentário ao pacote publicado
Com código rodando dentro do workflow, o atacante teve acesso ao GITHUB_TOKEN. Essa é a chave temporária que o GitHub fornece automaticamente para que automações possam interagir com o repositório. Com esse token, o atacante criou um commit com o payload malicioso, atribuiu a ele a tag v0.23.3 e acionou o pipeline legítimo de publicação do projeto.
O commit foi assinado e aparece com o selo verde de "Verificado" no GitHub. A assinatura é válida. Foi feita com as credenciais do workflow, não as do mantenedor. O processo de verificação não distingue esse caso. O nome do commit foi copiado de uma PR legítima anterior para não chamar atenção: release/v0.23.2 (#2188).
O pipeline oficial então fez exatamente o que foi projetado para fazer. Construiu o pacote a partir do código marcado com a tag v0.23.3 e publicou o wheel e o source distribution no PyPI, usando as credenciais armazenadas como secrets do repositório.
)
A imagem Docker também foi comprometida
O mesmo workflow que publica no PyPI tem um job para construir e publicar a imagem Docker do projeto. Os dois jobs rodaram juntos contra o commit malicioso. O resultado foi uma imagem multi-arquitetura publicada no GitHub Container Registry com as tags 0.23.3 e latest.
A tag latest é o ponto crítico. Muitos times fixam versões de pacotes Python em requirements.txt ou lockfiles. Mas usam latest para imagens de container, ou simplesmente não especificam nenhuma tag, o que tem o mesmo efeito.
Qualquer Dockerfile com uma linha FROM ghcr.io/elementary-data/elementary sem tag fixada puxou a imagem comprometida automaticamente desde o dia 24 de abril.
)
O payload é um ladrão de credenciais em três camadas
O pacote malicioso incluía um arquivo chamado elementary.pth. Arquivos .pth têm uma propriedade específica do Python, eles são executados automaticamente toda vez que o interpretador inicia, em qualquer ambiente onde o pacote esteja instalado. O payload dispara mesmo que nenhum código importe o elementary-data diretamente.
O conteúdo era um código ofuscado em três camadas. Base64 seguido de duas rodadas de criptografia XOR com chaves derivadas de MD5. Decifrado, o código coletava:
- Chaves SSH privadas, ~/.git-credentials e tokens do GitHub CLI;
- Credenciais de AWS, GCP e Azure, incluindo consultas diretas ao AWS Secrets Manager e ao SSM Parameter Store via API;
- Configurações de Kubernetes (~/.kube/config, tokens de ServiceAccount, secrets de todos os namespaces) e Docker;
- Arquivos .env até seis níveis de profundidade, além de .npmrc, .pypirc e tokens de ferramentas como Vault e Cargo;
- Carteiras de Bitcoin, Litecoin, Dogecoin, Zcash, Dash, Monero, Ripple, Ethereum, Cardano e Solana;
- /etc/passwd, /etc/shadow, histórico de shell e logs de autenticação do sistema.
Tudo era compactado num arquivo trin.tar.gz e enviado via curl para um servidor controlado pelo atacante.
Descoberta e resposta
A versão maliciosa foi identificada pelo membro da comunidade crisperik. Ele abriu a issue #2205 no GitHub do projeto no dia 25 de abril. O alerta foi confirmado por outro membro, H-Max, que também escalou o caso diretamente no Slack da comunidade Elementary.
A equipe do elementary-data removeu a versão 0.23.3 do PyPI e a imagem correspondente do GHCR. Uma versão limpa, a 0.23.4, foi publicada em seguida. A tag :latest agora aponta para essa versão segura.
)
Quem instalou elementary-data==0.23.3 ou usou as imagens ghcr.io/elementary-data/elementary:0.23.3 ou :latest entre 24 e 25 de abril deve rotacionar todas as credenciais presentes no ambiente afetado e restaurar os sistemas a partir de um estado anterior conhecido como seguro.
Acompanhe o TecMundo nas redes sociais. Para mais notícias de segurança e tecnologia, inscreva-se em nossa newsletter e canal do YouTube.
)
)
)
)
)
)
)