Explosão de Vulnerabilidades: Pacote Python com Milhões de Usuários Comprometido no GitHub

Um invasor explorou uma vulnerabilidade no processo de automação do GitHub Actions para lançar uma versão maliciosa do pacote elementary-data. Essa versão tinha a capacidade de coletar chaves SSH, credenciais de serviços em nuvem como AWS, GCP e Azure, além de carteiras de criptomoedas de sistemas que tinham o pacote instalado.

No dia 24 de abril, o atacante publicou o pacote comprometido tanto no PyPI quanto no GitHub Container Registry, levando à exposição de dados sensíveis. É importante ressaltar que nenhuma conta dos responsáveis pelo projeto foi comprometida; a exploração se deu através de uma falha no workflow do projeto.

elementary-data é uma ferramenta open-source voltada para observabilidade de dados no ecossistema dbt, frequentemente utilizada por engenheiros de dados para monitorar pipelines. O pacote possui mais de 1,1 milhão de downloads mensais no PyPI e é amplamente adotado em ambientes corporativos.

A Brecha na Segurança

O ataque teve início com um comentário em uma pull request. O projeto utilizava um workflow no GitHub Actions que processava comentários e continha uma falha de segurança crítica: ele inseria o conteúdo do comentário diretamente em um comando shell sem qualquer tipo de sanitização apropriada.

O atacante, que havia criado uma conta no GitHub dois dias antes, postou um comentário contendo código malicioso disfarçado. Quando o workflow processou o comentário, executou o código malicioso na infraestrutura do GitHub.

Da Exploração ao Pacote Comprometido

Com o código em execução, o invasor teve acesso à chave GITHUB_TOKEN, que permite interações automáticas com o repositório. Com isso, ele criou um commit que incluía 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 verificado como legítimo, embora a assinatura tenha sido gerada com as credenciais do workflow, e não do mantenedor.

O pipeline, então, construiu e publicou o pacote comprometido no PyPI, usando as credenciais armazenadas.

Imagem Docker Comprometida

Além do pacote no PyPI, o workflow também foi responsável por construir e publicar a imagem Docker do projeto. Isso resultou na criação de uma imagem multi-arquitetura publicada no GitHub Container Registry, que estava disponível sob as tags 0.23.3 e latest. Muitos desenvolvedores utilizam a última versão sem a fixação de tags, o que levou à descarga automática da imagem comprometida.

Um Ladrão de Credenciais

O pacote malicioso continha um arquivo denominado elementary.pth, que, ao ser executado, coletava diversos tipos de credenciais e dados sensíveis. Mesmo que o pacote não fosse diretamente importado, o código dentro do arquivo era executado a cada vez que o interpretador Python era iniciado.

Entre as informações coletadas estavam chaves SSH, credenciais de acesso a diferentes serviços em nuvem, configurações do Kubernetes e até informações sensíveis sobre criptomoedas.

Descoberta e Ações Tomadas

A versão maliciosa foi descoberta por um membro da comunidade, que rapidamente alertou o projeto. A equipe responsável pelo elementary-data agiu rapidamente, removendo a versão comprometida e publicando uma versão limpa, a 0.23.4, que agora é a versão padrão.

Os usuários que instalaram a versão 0.23.3 devem rotacionar suas credenciais e restaurar seus sistemas para um estado seguro, a fim de se proteger contra possíveis vazamentos de segurança.

Para mais atualizações sobre segurança e tecnologia, continue acompanhando o TecMania nas redes sociais!

Rolar para cima