L’exploit X100 di sabato 24 ottobre ha portato via circa 4,85 milioni di USDT dal blockchain that runs exactly as written when it is called, holding and moving funds according to its code, without an intermediary able to change the outcome.">smart contract holding reserves of two or more tokens, supplied by users, that a decentralized exchange uses to execute trades automatically at a price set by a formula.">pool di scambio principale di X100, un piccolo token ERC-20 su Ethereum con ticker X. La società di sicurezza Blockaid lo ha segnalato alle 14:49 UTC, parlando di un attaccante che avrebbe «preso due seggi del Senato su tre», l’organo di holder che decide dove sta la liquidità del progetto, e di un attacco ancora in corso. La blockchain mostra come i seggi sono stati conquistati: gli attaccanti hanno preso in prestito USDT per pochi secondi, ci hanno comprato X e ne hanno messo in staking quanto bastava per scavalcare wallet. It becomes permanent when the provider withdraws.">il senatore più piccolo.
I soldi passano per due transazioni. La prima, alle 14:11:47 UTC, ha lasciato 4.749.726 USDT al wallet che l’ha inviata; la seconda, alle 14:35:59 UTC, ha lasciato circa 96.382 USDT a un altro indirizzo. In totale sono circa 4.846.108 USDT, in linea con la cifra di Blockaid, «~$4.85M USDT realized so far across 2 txs». Una terza transazione, alle 14:40:47 UTC, ha sottratto circa 549.916 X.
Dal team di X100 non è arrivato nulla. Alle 17:00 UTC non abbiamo trovato alcun comunicato sul sito del progetto, sul canale Telegram (l’ultimo messaggio risale al 22 ottobre) o in una qualsiasi testata che racconti l’attacco. Il suo account X non mostra alcun post a chi non ha effettuato l’accesso. Nessun post-mortem è stato pubblicato.
Questo è un progetto piccolo, non un grande protocollo DeFi. Alle 16:50 UTC DexScreener indicava per il pool X/USDT principale su Uniswap una liquidità di circa 341 dollari e un token in calo del 96,8% in sei ore. Quel prezzo appartiene a un pool svuotato, non a un mercato in cui qualcuno possa davvero scambiare.
Come funziona il Senato di X100, secondo il suo stesso codice
Sul sito, che abbiamo aperto oggi, X100 si presenta come un token con offerta fissa di 14.000.000 di unità, di cui circa 12 milioni formano un fondo di ricompense per lo staking e circa 1 milione è destinato alla liquidità sugli exchange. Un Senato di holder decide dove va quella liquidità, tra cinque asset (USDT, USDC, WBTC, WETH e X) e tre piattaforme: Uniswap v3, Uniswap v4 e PancakeSwap v3. Il sito afferma che sul mercato non possono esserci più di 1.000.000 di X alla volta e che nessuno, né i creatori né i senatori, può prelevare token verso un wallet.
I seggi vanno agli holder registrati con le quote maggiori. Per registrarsi servono almeno 1.000 X in staking e si paga una commissione una tantum di 100 X. Il Senato ha tre seggi di default e fino a 21; una proposta passa con i voti di più della metà dei seggi, quindi due su tre.
Il contratto di staking è quello che Blockaid chiama Freezer: il suo codice sorgente verificato su Etherscan riporta il nome Freezer e custodisce gli X in staking, il fondo ricompense e la logica del Senato. Il codice conferma quanto dice il sito su seggi e voti. Mostra anche qualcosa che il sito non sottolinea: quando due seggi su tre votano sì, chiunque può eseguire subito la proposta. Il periodo di voto di tre giorni è una scadenza, non un tempo di attesa. Il sito presenta l’esecuzione come un passaggio separato; nulla nel codice impedisce a un contratto di mettere in staking, registrarsi, proporre, votare ed eseguire all’interno di una sola transazione.
Il Senato era appena nato. Il primo holder si è registrato alle 12:07 UTC di sabato. Le prime proposte sono passate tra le 12:25 e le 12:50 UTC; la primissima ha immesso 550.000 X nel pool Uniswap principale. Meno di due ore dopo i seggi sono cambiati di mano.
Exploit X100: come gli attaccanti hanno preso due seggi su tre
Prima dell’attacco i tre seggi erano occupati da quote di 20.500 X, 19.000 X e 1.000 X, secondo gli eventi di classifica del Senato registrati sulla chain. Nessuno ha detto chi controlla quegli indirizzi e nulla on-chain li identifica.
Nella transazione minata alle 14:11:47 UTC, un contratto distribuito dal wallet 0x7ec2afdf3ec5964899894f8d58afa95cbb8ffd63 ha preso in prestito circa 1,94 milioni di USDT, da restituire nella stessa transazione (un prestito flash). Con quei fondi ha comprato circa 38.200 X dal pool Uniswap principale e li ha divisi tra due nuovi account. Ciascuno ha pagato la commissione di 100 X e ha messo in staking 19.000,000001 X, un milionesimo di token in più dei 19.000 X del senatore al secondo posto. È bastato per estromettere i due senatori più piccoli e prendere due dei tre seggi.
Sempre all’interno della stessa transazione, uno dei nuovi senatori ha proposto uno scambio, l’altro ha votato a favore e il contratto attaccante lo ha eseguito. Il Freezer ha immesso 400.000 X in un pool PancakeSwap creato poco prima nella stessa transazione con 100 USDT sull’altro lato, ricavandone circa 36 USDT. Gli attaccanti hanno poi venduto 131.703 X nel vero pool Uniswap, che ha pagato 6.693.089,64 USDT. Restituito il prestito, 4.749.726,10 USDT sono andati al wallet che aveva dato il via a tutto e circa 268.284 X sono rimasti nel contratto attaccante.
Il racconto di Blockaid, rilanciato da TechFlow e da altre testate, parla di tre attaccanti. On-chain i tre passaggi provengono da tre wallet mittenti diversi. Non abbiamo trovato alcun trasferimento che colleghi il wallet del primo passaggio agli altri due, e non traiamo conclusioni sul fatto che dietro ci sia una persona o più persone.

Il secondo e il terzo passaggio hanno seguito la stessa strada
Alle 14:35:59 UTC una seconda transazione, inviata da 0xfc3facd67138966ab0c841e905b0c4bca1abe92f, ha ripetuto il trucco con un prestito flash da 1,95 milioni di USDT. Due nuovi account hanno messo in staking 19.000,000002 X ciascuno, un milionesimo in più degli account del primo passaggio, e si sono presi i seggi. Con sei proposte approvate nella stessa transazione, le posizioni di liquidità Uniswap V3 del Freezer sono state bruciate, ed è il passaggio che descrive Blockaid. Circa 96.382 USDT e 9.895 X sono finiti a 0xedac2d8905bf2bf0033872d420c4ec6ef1ddd0c8.
Alle 14:40:47 UTC una terza transazione, inviata da 0xdab137f390df77caa97fd492540e973fd5e2f8c8, ha usato i seggi conquistati alle 14:35:59 per far passare altre quattro proposte. Il Freezer ha ritirato una posizione Uniswap che conteneva 550.012 X, e quei token sono usciti attraverso il pool PancakeSwap: 549.916 X e circa 1.909 USDT sono arrivati a 0x0a67804462f04b0be1c433fb1c2f7fb76e5166f2. Le cifre coincidono con quelle del resoconto di The Defiant sulla terza transazione. Etherscan mostra che l’indirizzo ricevente aveva inviato 0,1 ETH al wallet mittente il 1° ottobre. Due transazioni successive, alle 14:40:59 e alle 14:41:23 UTC, sono partite da un altro indirizzo ancora, hanno usato gli stessi seggi e hanno spostato meno di 300 dollari.
Dove sono finiti gli USDT rubati: scambiati con circa 2.022 ETH
Il grosso del bottino non è rimasto a lungo in USDT. Alle 14:16:35 e alle 14:17:47 UTC, il primo wallet ha venduto i suoi 4.749.726 USDT in due ordini da 2.000.000 e 2.749.726 tramite UniswapX, il sistema di ordini di Uniswap, dove un contratto di terzi li ha eseguiti. Ha ricevuto circa 851,5 e 1.170,5 ether. L’indirizzo che ha ricevuto gli USDT, 0x225a38bc71102999dd13478bfabd7c4d53f2dc17, è il contratto che ha eseguito quegli ordini, non un wallet in cui il denaro è fermo.
Alle 14:18:59 e alle 14:19:23 UTC il primo wallet ha inviato 1.000 ETH e 1.022,85 ETH a 0x8296721489d0a7E934edd66ea27159B1C88A42e5. Tra le 14:39:47 e le 14:43:59 UTC quell’indirizzo ha inviato quattro trasferimenti da 400 ETH ciascuno a quattro nuovi indirizzi, e alle 16:45 UTC circa deteneva ancora 422,86 ETH. Pochi minuti prima dell’attacco, alle 14:05:59 e alle 14:06:59 UTC, il primo wallet aveva ricevuto 0,86 ETH per le commissioni da un indirizzo che Etherscan etichetta come hot wallet di FixedFloat. FixedFloat è un servizio di scambio istantaneo; l’etichetta non dice nulla su chi abbia dato quell’ordine.
Poiché il bottino ora è in ether, un blocco da parte di Tether, la società che può bloccare gli indirizzi USDT, non lo raggiungerebbe. Non abbiamo trovato notizie di congelamenti né di exchange che abbiano bloccato i fondi.
| Passaggio (UTC, 24 ottobre) | Cosa si è mosso | Fonte |
|---|---|---|
| 14:11:47, prima transazione | 400.000 X in uscita dal Freezer; 4.749.726,10 USDT netti al wallet mittente | Ethereum, blocco 26263022 |
| 14:16:35 e 14:17:47 | 4.749.726 USDT venduti per circa 2.022 ETH tramite UniswapX | Ethereum, blocchi 26263046 e 26263052 |
| 14:35:59, seconda transazione | Posizioni Uniswap V3 del Freezer bruciate; circa 96.382 USDT e 9.895 X in uscita | Ethereum, blocco 26263143 |
| 14:40:47, terza transazione | 549.916 X e circa 1.909 USDT in uscita | Ethereum, blocco 26263167 |
| 14:49:33 | Allerta di Blockaid: circa 4,85 milioni di USDT in due transazioni | Blockaid su X |
| Circa 16:45 | 12.165.182 X ancora nel Freezer; 197,10 USDT rimasti nel pool principale | Ethereum, letture dei contratti |

Circa 12,2 milioni di X sono ancora nel Freezer
L’attacco non ha svuotato il contratto. Blockaid, tramite TechFlow, ha detto che nel Freezer restavano circa 12,2 milioni di X; la nostra lettura delle 16:45 UTC circa indicava 12.165.182 X. Di questi, 171.563 X sono in staking, compresi i 76.000 X che i quattro account degli attaccanti hanno messo in staking per vincere i seggi, e circa 11,99 milioni formano il fondo ricompense. Gran parte del fondo ricompense è arrivata proprio sabato, quando il wallet che ha finanziato il Freezer ha inviato 10.000.000 di X alle 13:16:47 UTC e 1.997.000 X alle 13:24:47 UTC.
Due dei tre seggi erano ancora in mano, alle 16:45 UTC circa, agli account registrati alle 14:35:59, stando all’elenco dei senatori del contratto. Il contatore del contratto che applica il tetto di mercato di 1.000.000 di X era a 999.999,999998 X, quasi al limite. Se questo blocchi altre mosse dipende da posizioni che il Freezer potrebbe ancora detenere e che non abbiamo mappato. Blockaid ha definito l’attacco in corso; tra le 14:41 e le 16:45 UTC non abbiamo visto altri prelievi dal Freezer.
Attacchi alla governance prima di X100: Beanstalk e Tornado Cash
Prendere il controllo della governance di un progetto per spostarne i fondi non è una novità. Il 17 aprile 2022 Beanstalk, un protocollo di stablecoin su Ethereum, ha perso circa 181 milioni di dollari quando un attaccante ha usato prestiti flash di Aave, Uniswap v2 e SushiSwap per ottenere potere di voto, ha fatto passare una proposta malevola, la BIP-18, e l’ha eseguita subito tramite una funzione di emergenza. L’attaccante ha tenuto circa 24.830 WETH, allora pari a circa 76 milioni di dollari, secondo il racconto di Rekt sull’attacco a Beanstalk.
A maggio 2023 la governance di Tornado Cash è caduta per una proposta che nascondeva una funzione in più. L’attaccante si è assegnato 1,2 milioni di voti contro circa 700.000 legittimi e ha preso 483.000 TORN, una perdita di circa 2,17 milioni di dollari, come ha riferito The Block.
X100 riunisce i due problemi in piccolo. Come a Beanstalk, denaro preso in prestito ha comprato il peso decisivo per la durata di una transazione. Ma qui bastavano due seggi, e l’asticella era la quota del secondo senatore, 19.000 X: gli attaccanti hanno speso circa 1,94 milioni di USDT presi in prestito per i 38.200 X delle loro due quote e hanno restituito il prestito nella stessa transazione. Senza ritardo tra voto ed esecuzione, nessuno ha avuto una finestra per reagire.
È stata una settimana ricca di exploit. Venerdì Initia ha fermato la sua chain e i rollup dopo un presunto exploit di mint illimitato, e Swell ha congelato swETH e rswETH per una sospetta fuga di una chiave di amministrazione. La nostra guida su dove avvengono davvero gli hack crypto spiega perché la maggior parte delle perdite nasce dalle applicazioni e dalle loro chiavi, non dalla blockchain in sé.
Cosa cambia per chi ha piccoli token
Per chi detiene X, il pool che dava un prezzo al token è stato svuotato, e dal team non arriva una parola su recuperi o rimborsi. Il sito definisce X un utility token; quell’etichetta non dà agli acquirenti alcun diritto verso nessuno.
Per chi in Italia guarda a un token privo di audit e senza team dichiarato, il caso X100 suggerisce prudenza prima ancora di aprire il contratto: sul sito non compaiono né nomi né revisioni di sicurezza. E se la liquidità di un token è gestita da un voto, il caso offre una breve lista di cose da leggere nel codice. Quanti voti serve per decidere, e quanto costa un seggio rispetto al denaro che controlla? Un seggio si può comprare e usare in una sola transazione? C’è un ritardo tra il voto approvato e la sua esecuzione, in cui gli holder potrebbero vedere arrivare il colpo? A X100 le risposte erano: due voti, 19.000 X, sì e no.
Domande aperte e cosa tenere d’occhio
- Un comunicato del team di X100, e se intenda cambiare le regole del Senato o spostare il fondo ricompense rimasto.
- I movimenti dei 422,86 ETH rimasti a 0x82967214… e dei quattro trasferimenti da 400 ETH partiti da lì.
- Qualsiasi nuova proposta del Senato dai due seggi ancora in mano agli account registrati alle 14:35:59 UTC.
- Un resoconto completo di Blockaid o di un’altra società di sicurezza. Alle 17:00 UTC non abbiamo trovato allerte di PeckShield, Cyvers, CertiK o SlowMist.
Aggiorneremo questo articolo se il progetto o Blockaid pubblicheranno altri dettagli.
