Ataque à cadeia de suprimentos do Ultralytics AI Pwn Request
11 de dezembro de 2024
0 minutos de leituraO 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
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:
Revise os logs de
pip installdesses períodosVerifique a versão atual:
pip show ultralyticsRevise os logs do sistema em busca de atividade incomum da CPU nesses períodos
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:
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:
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:
2. Autentique-se no Snyk:
3. Faça uma varredura no seu projeto Python:
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:
2. Configure seu token do GitHub:
3. Faça uma varredura em um repositório:
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:
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.
