Pesquisadores de cibersegurança identificaram um novo ataque à cadeia de suprimentos de software batizado de SleeperGem, que mira o ecossistema Ruby após três gems (pacotes de software da linguagem Ruby) maliciosas serem publicadas no RubyGems (repositório oficial desses pacotes) com o objetivo final de servir cargas úteis adicionais.
As gems fraudulentas estão listadas abaixo:
- git_credential_manager (versões 2.8.0, 2.8.1, 2.8.2, 2.8.3) — publicada em 18 de julho de 2026
- Dendreo (versões 1.1.3, 1.1.4) — publicada em 14 de outubro de 2017
- fastlane-plugin-run_tests_firebase_testlab (versão 0.3.2) — publicada em 6 de fevereiro de 2018
"Cada lançamento malicioso é um carregador", afirmou a StepSecurity em uma análise. "Ele busca um segundo estágio em um servidor Forgejo controlado pelo invasor, verifica se está em execução em um sistema de build (compilação) e ignora nesse caso; em uma máquina de desenvolvedor, ele solta um daemon nativo e instala mecanismos de persistência."
Um aspecto do ataque que chama a atenção imediatamente é que o "git_credential_manager" se passa pelo Microsoft Git Credential Manager oficial, enquanto as outras duas gems estavam inativas há anos antes de receberem as atualizações maliciosas. O "Dendreo" foi atualizado pela última vez em 24 de outubro de 2020, e o "fastlane-plugin-run_tests_firebase_testlab" ficou inativo desde 9 de março de 2019, antes das novas versões.
Outra característica marcante da atividade é que os lançamentos foram publicados diretamente no registro sem nenhum commit ou tag correspondente nos projetos de origem.
Curiosamente, o "git_credential_manager" foi adicionado como dependência em cinco pacotes, incluindo "Dendreo" e "fastlane-plugin-run_tests_firebase_testlab", permitindo efetivamente que a carga maliciosa se espalhe para usuários existentes desses pacotes:
- Dendreo
- fastlane-plugin-run_tests_firebase_testlab
- slackHtmlToMarkdown
- seo_optimizer
- array_fast_methods
Todos os pacotes mencionados, com exceção do "fastlane-plugin-run_tests_firebase_testlab", são mantidos pela mesma conta ("LR-DEV"). O fato de a gem pertencer a um mantenedor diferente ("pinkroom") indica que mais de uma conta provavelmente foi comprometida para enviar as versões fraudulentas ao RubyGems.
Uma vez instalado, o malware incorporado nesses pacotes verifica cerca de 30 variáveis de ambiente no sistema infectado, incluindo as relacionadas a GitHub Actions, GitLab, CircleCI, Travis, Jenkins e Vercel. Caso alguma delas seja identificada, o programa encerra imediatamente. A verificação é considerada uma tentativa deliberada de evitar a execução em executores efêmeros de Integração Contínua (CI) e garantir que o código seja executado em uma máquina de desenvolvedor.
No caso do "git_credential_manager", o código malicioso é acionado quando a biblioteca é requisitada, fazendo o download de duas cargas úteis a partir de uma instância pública do Forgejo ("git.disroot[.]org/git-ecosystem"): um script de shell ("deploy.sh") e um binário nativo que carrega o mesmo nome da ferramenta que a gem se passa. No Windows, a carga recuperada é executada por meio do PowerShell.
Enquanto a versão 2.8.2 apenas prepara as cargas úteis, a versão 2.8.3 da gem avança para a próxima fase do ataque. Isso envolve o uso do script de instalação para iniciar o binário como um daemon em segundo plano, após o qual ele estabelece persistência usando uma entrada no cron e como serviço de usuário do systemd, além de consultar os grupos sudo e wheel.
"Se o usuário puder executar o sudo sem senha, o script se executa novamente como root, e, quando roda como root, ele implanta uma cópia setuid root do shell do sistema em um caminho escolhido para imitar um utilitário de rede", afirmou a StepSecurity.
Usuários que tenham instalado qualquer uma das gems mencionadas são aconselhados a tratar as máquinas e os segredos associados como comprometidos. Também é recomendável remover o daemon depositado em "~/.local/share/gcm/", apagar os mecanismos de persistência, verificar a presença de um shell setuid em "/usr/local/sbin/ping6" e rotacionar todas as credenciais.
"Uma conta no RubyGems que ficou em silêncio por seis ou sete anos não parece arriscada para ninguém", disse o pesquisador da Aikido Security, Charlie Eriksen em comunicado. "Esse é exatamente o perfil que vale a pena assumir. Daí vem o nome SleeperGem: não um ativo de atacante plantado em um jogo de longo prazo, mas uma conta real e comum que simplesmente ficou inativa e parecia inofensiva o suficiente para ser sequestrada sem que ninguém percebesse."
RubyGems como ponto cego para exfiltração de dados
A divulgação ocorre mais de dois meses depois de o RubyGems ter pausado brevemente o cadastro de novas contas, após agentes maliciosos publicarem dezenas de pacotes maliciosos como parte de uma campanha coordenada de publicação de spam. Na mesma época, pesquisadores da Socket identificaram uma campanha paralela que inundou o registro com 150 gems usadas como canal de exfiltração de dados.
No início deste mês, a Mend.io revelou detalhes de um ataque à cadeia de suprimentos de software não documentado que utilizou outro conjunto de 14 pacotes no RubyGems para armazenar dados de credenciais roubadas.
Especificamente, descobriu-se que uma extensão de navegador maliciosa coletou credenciais por meio de uma API (Interface de Programação de Aplicações) acessível localmente, empacotou as informações em arquivos .gem válidos inteiramente no navegador usando JavaScript e APIs Web padrão e fez o upload desses pacotes diretamente para o RubyGems.org usando uma chave de API do RubyGems codificada diretamente no código.
"O material incluía senhas em texto puro, chaves privadas SSH (Secure Shell, protocolo de acesso remoto seguro), credenciais da AWS (Amazon Web Services, plataforma de computação em nuvem da Amazon), frases-semente de carteiras de criptomoedas, números de Seguro Social, números de cartão de crédito e dados de contas bancárias em 63 itens do cofre", afirmou Maciej Mensfeld em sua análise.
"O RubyGems não foi o mecanismo de entrega aqui. Foi o ponto cego: um domínio confiável e de alto tráfego onde os dados roubados ficaram até que o invasor voltasse para buscá-los, invisível entre os uploads normais de desenvolvedores."