Rilide, também conhecido como LumaC2 e CookieGenesis, é um malware sofisticado que tem como alvo navegadores baseados em Chromium para sequestrar a atividade do usuário e roubar dados confidenciais. Descoberto em 2023, o Rilide opera usando extensões de navegador para realizar seus ataques. O Rilide abusa do seu componente de extensão de navegador para injetar scripts maliciosos em páginas da web. Além de suas habilidades de exfiltração de dados, também possui recursos avançados de roubo de criptomoedas, com manipulação de autenticação de dois fatores (2FA) para carteiras e clientes de e-mail populares.
Desde o início de 2025, o laboratório de pesquisa Trusteer registrou mais de 50.000 sessões de usuários infectadas, indicando a escala de atividade de ameaças. Rilide tem uma campanha mundial em andamento detectada pelo laboratório Trusteer atacando a América do Norte, América do Sul, Europa e Japão.
Neste post, vamos explorar como o Rilide opera no navegador por meio de sua extensão e examinar as técnicas que ele usa para realizar seus ataques, especialmente seu impacto nas plataformas financeiras.
Os recursos da Rilide destacam a mudança no cenário de ameaças de injeções tradicionais na web usando um único código JavaScript na página para extensões de navegador. As extensões de navegador facilitam muitas funções que são bastante difíceis de alcançar sem elas. A análise a seguir mostra o quão poderosa é uma extensão e por que o malware moderno tende a usá-las.
No passado, a maioria dos ataques "man-in-the-browser" era executada por malware que escaneia a memória do navegador para identificar padrões HTML específicos e injetar uma tag <script> diretamente no conteúdo da memória da página. Apesar da intenção maliciosa, esses scripts ainda estavam sujeitos aos mecanismos de segurança do navegador, como operar em um ambiente isolado, aderir à política de mesma origem e estar vinculados ao ciclo de vida da página em que foram injetados.
Por exemplo, os scripts injetados não podiam acessar cookies ou recursos de outras origens, nem podiam persistir ou ser executados depois que a página fosse fechada.
Por outro lado, os ataques modernos que utilizam extensões maliciosas de navegadores superam a maioria dessas limitações. As extensões operam independentemente de qualquer página da Web específica, permitindo que sejam executadas persistentemente em segundo plano. Eles também têm privilégios elevados, o que lhes permite ignorar as restrições de mesma origem, acessar recursos de todo o navegador, como cookies ou armazenamento, e permanecer ativos mesmo quando nenhuma página está aberta. Essa mudança tornou as extensões de navegador uma ferramenta poderosa para invasores, fornecendo um nível de persistência e controle muito além dos métodos tradicionais de injeção na web.
As extensões também introduziram uma mudança no contexto de execução do JavaScript, o que tem seus próprios benefícios maliciosos. As injeções tradicionais na web foram executadas no mesmo contexto que o código da aplicação da web, incluindo ferramentas de segurança. Qualquer evidência deixada para trás (como elementos de script, solicitações de rede, variáveis js etc.) pode tornar o malware detectável.
Agora, existem dois ambientes JavaScript diferentes, além do contexto da página:
Todas as comunicações entre esses contextos ocorrem por meio de interfaces de navegador definidas que não são visíveis para a página ou seus desenvolvedores. A maioria das evidências e comportamentos de extensão é isolada por design, e a detecção é especialmente difícil se não houver alteração no documento principal.
Além de oferecer evasão aprimorada, o desenvolvimento de extensões de navegador também é simples, graças à extensa funcionalidade integrada e às permissões fornecidas pelas APIs dos navegadores modernos. A análise a seguir demonstra como as extensões facilitam o desenvolvimento de ataques complexos.
Dado o aumento de controle, persistência, recursos de evasão e facilidade de desenvolvimento que as extensões oferecem, a mudança das técnicas tradicionais "man-in-the-browser" para ataques baseados em extensão não é apenas compreensível, mas inevitável, na evolução dos ataques de navegador baseadas em ameaças.
Começaremos nossa análise do Rilide com o arquivo de manifesto — um componente crucial que descreve a funcionalidade da extensão e os níveis de acesso, fornecendo as primeiras pistas para entender os recursos maliciosos do Rilide.
Uma das variantes analisadas se apresenta como uma extensão do Google Drive:
Posteriormente, há uma lista de permissões necessárias. A lista contém várias funcionalidades críticas dos navegadores, incluindo, entre outras:
Em "host_permission", a extensão tem permissão para acessar e interagir com <all_ urls>, ou seja, qualquer esquema, domínio, caminho e porta compatíveis com o navegador.
Os "scripts de conteúdo" também são configurados para serem executados em todas as URLs em document_start, o que significa que são executados assim que o navegador começa a carregar a página, antes que qualquer conteúdo seja totalmente renderizado.
O script main.js inclui recursos gerais de roubo de informações, enquanto gmail.js tem como alvo a página do cliente de e-mail do Gmail. No entanto, todos os scripts são injetados em todas as páginas.
Em “declarative_net_request”, a extensão configura regras para remover vários cabeçalhos da Política de Segurança de Conteúdo (CSP). Isso permite que o Rilide contorne as restrições de segurança e injete conteúdo em linha.
Em "plano de fundo", o trabalhador de serviço da extensão é configurado. É aqui que o malware monitora eventos do navegador e estabelece comunicação com o servidor C2. A seguir, nós nos aprofundaremos na análise do script em segundo plano para entender melhor como o malware detecta eventos do navegador e executa sua estratégia de ataque.
O Background.js contém código de inicialização configurado para executar no evento de instalação da extensão. Ele busca as informações do dispositivo, como detalhes de CPU e armazenamento, usando chamadas do chrome.system e dados de extensões instaladas usando o chrome.mangement. O ID exclusivo é gerado usando o módulo npm uuid (importado via jspm) e salvo no armazenamento local. Por fim, todos os cookies são buscados usando chrome.cookies.getAll com um parâmetro de filtro vazio.
Esses dados são enviados para o servidor C2 e a resposta pode ativar os recursos de proxy da extensão. Injeções, comandos e configurações de malware também são buscados durante a inicialização da extensão.
A parte final da inicialização é habilitar as regras de remoção de CSP, após as quais o malware está pronto para configurar e monitorar os eventos do navegador. Mais uma vez, podemos ver claramente os benefícios de usar uma extensão de navegador em comparação com as técnicas tradicionais de injeção na web, tornando todas essas informações facilmente coletadas.
As versões anteriores do Rilide tinham domínios C2 codificados diretamente nos arquivos JavaScript. Outras variantes extraíram domínios recuperando detalhes da transação de uma carteira Bitcoin específica.
A nova variante analisada aqui inclui código projetado para buscar domínios de um bot do Telegram. Chamadas periódicas para buscar os domínios são configuradas para execução a cada minuto usando alarmes do Google Chrome.
Essa abordagem permite que o malware alterne facilmente os domínios se um deles for detectado e bloqueado.
Embora essa variante não contenha os tokens do Telegram, esse método provavelmente aparecerá em versões futuras.
O script de conteúdo envia todos os valores dos elementos de input da página utilizando chrome.runtime.sendMessage com o tipo de mensagem "new-grabber-info".
O listener a seguir é definido em segundo plano.js para transmitir os dados para o servidor C2.
Além disso, o plano de fundo está aguardando por mensagens de “set-screenshot-result”.
Essas mensagens acionam a captura de uma captura de tela usando chrome.tabs.captureVisibleTab e enviando os dados de volta para o C2.
Ao empregar esses métodos, se o usuário fizer login em um site bancário, uma série de dados confidenciais poderá ser roubada. Isso inclui nomes de usuário e senhas, números de conta, códigos PIN, detalhes de cartão de crédito, respostas a perguntas de segurança e informações do destinatário de transferência.
Na última parte dos scripts em segundo plano, as chamadas periódicas para busca de comandos e verificações de proxy são definidas usando "chrome.alarms". Os alarmes de comando buscam uma lista de comandos do C2 e os executam um por um.
O alarme de verificação de proxy verifica o status de conexão do proxy e inicia uma nova, se necessário. Depois que os ouvintes são definidos, a execução síncrona do script em segundo plano é concluída.
cmds.js contém um código que facilita o recebimento de um comando (de uma lista predefinida) junto com parâmetros do C2 e o envio de quaisquer resultados, se aplicável.
Alguns comandos interessantes incluem:
Outros comandos permitem alterar a configuração da extensão, buscar informações do dispositivo, o URL atual e assim por diante. Esse conjunto de comandos permite alterações dinâmicas no fluxo de trabalho e na execução do malware, tornando-o mais capaz de atrair a interação do usuário. A maioria desses comandos utiliza funções de extensão do Chrome integradas, o que facilita o desenvolvimento para autores de malware.
O script de conteúdo main.js começa com a biblioteca jQuery inicializada em uma função anônima, incorporada totalmente em linha sem importações externas. Isso é seguido pela execução de funções maliciosas em códigos ofuscados.
A arquitetura de extensão do Chromium permite que as extensões separem as responsabilidades da injeção e a tornem mais difícil de detectar. O trabalhador do serviço baixa e armazena as injeções durante a etapa de inicialização, enquanto o script de conteúdo as lê e executa. Nenhuma solicitação da web foi enviada no contexto da página, o que ajuda a manter o malware não detectado. O main.js itera todas as injeções buscadas e, se a URL atual corresponder à URL de injeção, ele a injeta.
O Rilide usa uma maneira inteligente de injetar scripts no DOM.
Ele cria um atributo de documento "onreset" com a injeção como manipulador de eventos. Em seguida, ele envia imediatamente um evento personalizado de "redefinição", que executa a injeção e, por fim, remove o atributo.
Esse atributo é definido em um momento específico entre a chamada "setAttribute" e a chamada "removeAttribute", o que dificulta a detecção das ferramentas de segurança.
A última chamada de função configura o ouvinte de roubo de dados genérico.
Usando um seletor jQuery, todos os elementos de entrada são selecionados e o ouvinte de eventos "change" é definido.
O evento "change" ocorre toda vez que o valor de um campo de entrada é alterado e perde o foco (o usuário clica em outro elemento). Por exemplo, quando uma vítima faz login na sua conta bancária, o seu nome de usuário é coletado quando clica no campo de senha, e a entrada de senha é roubada quando o usuário envia o formulário. Os dados são enviados para o trabalhador de serviço via chrome.runtime.sendMessage, que então os encaminha para os servidores C2.
O objetivo deste script é substituir a solicitação de autorização de 2FA de retirada por uma nova solicitação de autorização de dispositivo. Esperamos que essa abordagem mantenha os clientes cientes dos saques não autorizados, pois eles são mais propensos a perceber a autorização de um novo dispositivo como menos suspeita do que os saques.
O script começa com uma inicialização inline da biblioteca jQuery e uma verificação de que o local atual contém "mail.google" antes de iniciar a execução. A injeção verifica periodicamente os e-mails de carteiras de criptomoedas populares e, se detectada, invoca a função de carteira correspondente.
Os seletores do jQuery são bem simples, utilizam “divs” que contêm os nomes das carteiras em texto.
Demonstraremos a injeção personalizada de um fornecedor específico, embora todos eles atuem de forma semelhante.
O código procura por elementos que contenham o texto "Solicitação de retirada" e o substitui por "Autorizar novo dispositivo".
Ele também procura elementos de intervalo que contenham o texto "retirada" para substituir o conteúdo de visualização do e-mail.
Antes da injeção:
Após a injeção:
O corpo do e-mail em si é encontrado da seguinte maneira:
Simplificando, o script encontra todos os elementos com a classe CSS "ii" que possuem um elemento descendente "div" com o texto "verifique o endereço com atenção". Ele também extrai o código de autorização com base no elemento e no estilo do texto do código de autorização. Este método para identificar elementos não é muito estável, pois pequenas mudanças no estilo, texto ou estrutura podem quebrá-lo.
Por fim, o conteúdo HTML do e-mail é substituído por conteúdo codificado.
Conteúdo original:
Novo conteúdo:
Esse mecanismo permite que o agente da ameaça retire criptomoedas sem alertar o usuário sobre os saques.
Outro recurso de destaque, implementado sem esforço por meio de extensões, é o recurso de proxy. O Rilide permite converter o navegador da vítima em um proxy HTTP, encaminhando todas as solicitações enquanto utiliza as credenciais e dados da vítima.
Esse recurso é especialmente perigoso para fraudes financeiras, pois os invasores podem acessar portais bancários, contas de negociação e plataformas de pagamento sem acionar verificações extras de autenticação. Eles podem iniciar transações, modificar configurações de conta ou desviar fundos sob o pretexto de atividade legítima do usuário, ignorando medidas de segurança tradicionais, como rastreamento de endereços IP. Ao se passar pela vítima de forma eficaz, os invasores podem realizar exploração de mecanismos baseados em confiança para cometer fraudes sem dificuldades.
Essa funcionalidade foi notavelmente simples de implementar, pois foi copiada diretamente do CursedChrome, um projeto educacional que demonstra uma prova de conceito para esse tipo de ataque.
O proxy funciona usando o trabalhador do serviço de extensões para configurar uma conexão WebSocket com o servidor C2 do invasor. Essa conexão permite que o trabalhador do serviço receba comandos enviados pelo invasor. Esses comandos ditam as ações do proxy, como fazer solicitações ou navegar em sites. As solicitações são feitas usando os cookies coletados da vítima e as respostas são enviadas de volta para o nível C2.
Exemplo de código CursedChrome:
Exemplo de código Rilide:
Apesar de algumas diferenças de nomenclatura e local de definição de função, o código é o mesmo. Esse projeto ainda vem com código de back-end e uma interface de usuário (IU) de gerenciamento, facilitando a vida dos invasores.
Rilide exemplifica como as extensões de navegador transformaram o cenário de ameaças para ataques man-in-the-browser. Ao aproveitar os recursos inerentes das extensões, os invasores ganham um controle sem precedentes sobre o navegador, permitindo uma exploração sofisticada e persistente que supera em muito as limitações das injeções tradicionais na web na página. Essa mudança destaca a crescente necessidade de vigilância e defesas robustas, pois a simplicidade e o poder dos ataques baseados em extensões os tornam um vetor atraente para os cibercriminosos.
Para se protegerem, os usuários devem revisar regularmente suas extensões de navegador instaladas, removendo imediatamente quaisquer extensões desconhecidas ou suspeitas.
Além disso, é essencial monitorar as contas de e-mail em busca de atividades incomuns, como tentativas inesperadas de login, e ficar de olho nas carteiras de criptomoedas em busca de transações não autorizadas ou ações desconhecidas. Manter-se proativo e cauteloso pode ajudar a mitigar os riscos representados por esse paradigma de ataque em evolução.
O IBM Trusteer ajuda você a detectar fraudes e malwares, autenticar usuários e estabelecer confiança na identidade em toda a jornada do cliente. Mais de 500 organizações líderes confiam no Trusteer para ajudar a proteger as jornadas digitais de seus clientes e apoiar o crescimento dos negócios.
historytab.js | 2b72cc2c0c53321a472471c5189fdb56 |
notif.js | 8679a34885a02e94189c8fe5132245a |
config.js | 408d8fa7eade661e9a02b6065b792fca |
ico.png | 40de419c81de274c26c63e0f23d91a3f |
scrrule.js | 9db73e9a3a24070de075da13fdea01ab |
exts.js | 868eb23af363b5790d16103d2dd94178 |
rules.json | 6c1f6ab3492a615404a70161303de746 |
manifest.json | fd7d90a5e31cd19bbc65095d722c1525 |
utils.js | bd14616118af50f6e0b886bd90144845 |
content-scripts-register-polyfill.4.0.0.js | 5bf61a91e003afb1e169e3e3be336cac |
app.html | 08785f3794a7ae9aab6b3fa669646794 |
background.js | 1de94fff2cb80f44d82d69f816139974 |
main.js | 6c19e1bf9a7eac2c9b44f5e5c0b76d39 |
gmail.js | 49c851c025506d0a570d75bc00c7605a |
csp.js | 15606d8d8d6ca797c2c98c20114619b4 |
exchangeSettings.js | 2dcf7f099c08f9d074994a0a4f996720 |
screen.js | 7d0defc1a08d5a58d95f5ca38509c8ef |
domain.js | bb0bc698eb64447a3ab581517273487b |
inj.js | 3d67fa8a26390e8819d6bd36a2c5959f |
set.js | 8049e7bd36a88f7a393b7ff0746a04db |
proxing.js | b4b2510d7ec41711ef29ddddd4cab09a |
cmds.js | 0ebb9b78c38ae45884b85632fe087e49 |
machine.js | c43644bed7d94e3ec880af3195e4c906 |
extFiles.zip | 3113c21eee9704b14437edb5c6f29634 |
Domínio:
statbrwsr.digital