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.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.O pacote malicioso foi publicado no PyPI em 24 de abril e chegou a aparecer como "Latest version" antes de ser removido pela equipe do projeto. Imagem: StrepSecurity.A falha que abriu a portaO 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.O workflow update_pylon_issue.yml interpolava o conteúdo de comentários diretamente em comandos de shell — a brecha que permitiu ao atacante executar código dentro da infraestrutura do GitHub. Imagem: StepSecurity.Do comentário ao pacote publicadoCom 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.O arquivo elementary.pth foi inserido na tag v0.23.3 pelo próprio pipeline de automação do projeto. Arquivos com essa extensão são executados automaticamente pelo Python toda vez que o interpretador inicia. Imagem: StepSecurity.A imagem Docker também foi comprometidaO 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.A release maliciosa foi criada com nome e descrição sem sentido, mas exibe o selo de commit verificado — assinado pelas credenciais do workflow, não do mantenedor. Imagem: StepSecurity.O payload é um ladrão de credenciais em três camadasO 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 respostaA 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.A issue #2205, aberta pelo membro da comunidade crisperik em 25 de abril, foi o primeiro alerta público sobre o arquivo malicioso na versão 0.23.3. Imagem: StepSecurity.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.