Deux votes, des millions d'USDT et une pool presque vide: décryptage de l'attaque sur X100

Deux votes, des millions d'USDT et une pool presque vide: décryptage de l'attaque sur X100

Une avance de 0.000001 tokens a suffi pour remporter deux sièges au sénat de X100, après quoi environ 4.85M USDT ont quitté la pool légitime.

31 oct. 2026

Dans la première opération, le portefeuille initiateur a reçu environ 4.75M USDT après avoir remboursé un flash loan, tandis que les dépôts utilisés pour le vote sont restés verrouillés. Le 24 octobre 2026, des USDT empruntés ont été utilisés pour acheter suffisamment de tokens X pour s'emparer de deux des trois sièges au sénat de X100. La majorité obtenue a immédiatement approuvé des transactions de trésorerie via une liquidité contrôlée par le contrat exécutant. La vente des tokens X reçus a permis de rembourser le prêt et de verser les fonds restants. Sur les trois transactions principales, environ 4.848M USDT ont été versés à des destinataires. En incluant deux transactions supplémentaires, la sortie nette d'USDT du pool légitime a atteint environ 4.849M USDT.

Le mécanisme central est confirmé par l'historique des transactions. Le traçage couvre les itinéraires individuels des fonds reçus jusqu'au point de coupure indiqué; l'adresse finale du service a été identifiée grâce à une étiquette dans l'explorateur de blockchain.

Première transaction - une mise empruntée donne le contrôle du sénat, l'accès aux actifs de trésorerie et la possibilité de payer le destinataire. Visualisation: CertiK
Première transaction - une mise empruntée donne le contrôle du sénat, l'accès aux actifs de trésorerie et la possibilité de payer le destinataire. Visualisation: CertiK

Adresses et leurs rôles

Toutes les adresses ci-dessous se trouvent sur le réseau Ethereum. Les rôles décrivent le comportement observé des comptes, et non l'identité des personnes qui les contrôlent.

AdresseRôle établi
0x100a2c7f45fd48e217fdce72e658dc78fd43a100Le token X; six décimales
0x79f35a33fe2813414851c4ae8daeacd14d822a46Freezer: détient les dépôts, les pouvoirs du sénat et les actifs de trésorerie
0xcd5762ac6013fa762782ac1797ab09152c1028e8Module DEX de trésorerie
0x0d85edd90c94053fc5997551b1baa8a77aa02fa0Pool X/USDT légitime
0x7ec2afdf3ec5964899894f8d58afa95cbb8ffd63Expéditeur de la première transaction et destinataire des USDT
0x37541fc4a6f1ec86889ba506f51dc39f2bedd10aContrat exécutant de la première transaction; a conservé les tokens X

Contexte

Les utilisateurs de X100 verrouillent des tokens X dans le contrat Freezer. Le sénat classe les comptes enregistrés selon leur montant actuel de tokens verrouillés. Deux votes sur trois suffisent pour approuver des opérations impliquant la liquidité de trésorerie et des swaps. Les frais d'inscription sont facturés séparément des dépôts verrouillés.

Le Freezer détient des tokens X de trésorerie aux côtés des dépôts des utilisateurs. Une fois une opération exécutée, le contrat vérifie s'il reste suffisamment de X pour couvrir ses obligations sur les fonds gelés. Une limite distincte de tokens plafonne le montant des actifs pouvant être déployés sur le marché. Le retrait de positions de liquidité libère de la marge sous cette limite. Cependant, aucune de ces mesures ne garantit à elle seule que les transactions de trésorerie sont effectuées à des conditions équitables.

Comment l'attaque s'est déroulée

L'attaquant a mené une séquence complexe d'actions qui a permis d'exploiter une vulnérabilité dans le code source du contrat intelligent.

1. Prise de contrôle du sénat

À 14:11:47 UTC, la première transaction, incluse dans le bloc 26,263,022, a emprunté 1,942,457.637245 USDT auprès d'Aave et acheté environ 38,200 tokens X. Deux comptes auxiliaires ont chacun verrouillé 19,000.000001 X et payé séparément 100 X chacun pour être nominés.

Avant cela, la deuxième place du classement était occupée par un participant détenant 19,000 X.

Comme le vote reposait sur le classement en vigueur et que l'exécution d'une décision ne nécessitait pas d'attendre une période définie, la nouvelle majorité a réalisé l'opération au sein de la même transaction.

2. Transformation des pouvoirs en actifs de trésorerie

La majorité obtenue a approuvé un swap de 400,000 X contre environ 35.68 USDT via une liquidité créée et contrôlée par l'opération elle-même. Le contrat exécutant a reçu environ 399,987 X, puis a vendu environ 131,703 X sur le marché légitime pour environ 6.693M USDT.

Aave a reçu environ 1.943M USDT, dont des frais de financement d'environ 971.23 USDT. Le portefeuille initiateur a reçu environ 4.75M USDT, et le contrat exécutant a conservé environ 268,284 X. Les dépôts utilisés pour le vote sont restés verrouillés: les fonds reçus ont permis de rembourser le prêt sans déverrouiller les tokens. Les registres de règlement montrent des étapes successives dans le mouvement des mêmes fonds; ces montants ne peuvent pas être additionnés, car cela reviendrait à comptabiliser les pertes deux fois.

3. Récupération et réutilisation des pouvoirs

À 14:35:59, la deuxième transaction a utilisé un prêt flash de 1.95M USDT de Morpho pour créer deux dépôts de 19,000.000002 X et déplacer la première paire de participants. Cinq retraits de positions de liquidité de la trésorerie ont restitué environ 50,000 X, libérant de la marge sous la limite avant le swap d'auto-négociation suivant. Après le remboursement du prêt, le destinataire a reçu environ 96,382 USDT et 9,895 X.

À 14:40:47, la troisième transaction a utilisé les pouvoirs déjà détenus par les contrats auxiliaires de la deuxième opération, sans acquérir de nouveaux tokens verrouillés. Pour ce faire, elle a contracté un prêt flash de 300 USDT et retiré une importante position de liquidité de la trésorerie. Le paiement final s'est élevé à environ 1,909 USDT et 549,916 X. L'historique des appels de contrats montre que l'opération a utilisé des comptes auxiliaires pour soumettre des propositions et voter avec les sièges du sénat déjà obtenus. Selon Bitquery, cette réutilisation a été possible parce que les fonctions des contrats auxiliaires donnant accès à la gouvernance ne limitaient pas les adresses autorisées à les appeler. Cependant, cette explication relative au contrôle d'accès n'a pas été vérifiée de manière indépendante dans le cadre de cette analyse. Le fait que des portefeuilles différents aient initié les opérations ne prouve pas en soi que des personnes différentes en étaient à l'origine.

Deux autres transactions ont suivi à 14:40:59 et 14:41:23. Elles ont augmenté la sortie nette de USDT du pool d'environ 168.61 USDT. Les deux transactions ont été envoyées par la même adresse, et leurs numéros de séquence (nonces) étaient consécutifs.

Transaction principaleUSDT versés au destinataireSortie nette de USDT du pool légitime
Première4,749,726.0969734,750,733.001112
Deuxième96,381.88349196,381.884163
Troisième1,909.3587581,873.897121
Total des trois transactions principales4,848,017.3392224,848,988.782396

Le troisième paiement a également utilisé des USDT précédemment reçus de la trésorerie. Le montant du paiement dépasse donc la réduction des fonds du pool directement causée par cette transaction. En ajoutant les deux transactions suivantes, la sortie combinée du pool sur l'ensemble des cinq transactions s'élève à 4,849,157.396718 USDT. Les fonds empruntés, les paiements, les swaps et les actifs restant sur les adresses se rapportent en partie aux mêmes flux financiers. Les tokens X invendus ne sont pas inclus dans l'estimation en dollars.

4. Échange et déplacement des fonds reçus

Le premier destinataire a échangé environ 4.75M USDT contre 2,022.016 ETH. Une adresse de consolidation a ensuite reçu ces ETH ainsi que les fonds qu'elle détenait déjà et a envoyé quatre lots de 400 ETH. Au moment de la collecte des données, le 26 octobre à 01:20:23 UTC, les cinq adresses de détention vérifiées détenaient environ 2,022.857 ETH, y compris de petits soldes sans rapport avec les fonds issus de cette conversion.

Le second destinataire a échangé environ 96,382 USDT contre 40.908 ETH. Deux adresses intermédiaires ont transféré environ 40.900 ETH vers une adresse qu'Etherscan identifie comme ChangeNOW Dep. C'est là que le traçage des fonds s'arrête: l'identité du client, les règlements ultérieurs et la question de savoir si l'argent a finalement été retiré n'ont pas été confirmés.

Itinéraires vérifiés des fonds et adresses où ils ont été trouvés. Visualisation: CertiK
Itinéraires vérifiés des fonds et adresses où ils ont été trouvés. Visualisation: CertiK
Une envolée de 100x, un prêt de $75M et un retour en arrière de la blockchain: que s'est-il passé avec Tectonic?5 sept. 2026En savoir plus

La vulnérabilité

Le coût de la prise de contrôle de la gouvernance n'avait presque aucun rapport avec la valeur marchande des actifs ni avec le montant du dépôt nécessaire pour voter. La majorité obtenue a pu retirer suffisamment de fonds liquides pour rembourser le prêt utilisé pour acheter ce contrôle, même si les dépôts de vote sont restés verrouillés.

Trois caractéristiques de conception ont rendu cette situation possible:

  • Les pouvoirs apparaissaient immédiatement après un nouveau dépôt. Les fonctions Freezer._stakeOf et Senate._tally utilisaient le montant actuel de tokens verrouillés et le classement des participants. La période de validité d'une proposition limitait la fenêtre durant laquelle elle pouvait être exécutée, mais le chemin d'exécution examiné ne comportait aucun délai minimal avant l'exécution. Deux nouveaux comptes ont obtenu une majorité et l'ont utilisée immédiatement.
  • Les votes en faveur d'une proposition valide permettaient des transactions d'auto-négociation. Le module DEX vérifiait si les tokens concernés étaient autorisés et si le pool existait, puis acceptait le rendement minimal spécifié dans la proposition. Il ne fournissait pas de vérification indépendante de l'équité des conditions de la transaction et n'excluait pas l'utilisation de liquidités contrôlées par l'exécutant. Ainsi, une opération formellement approuvée a permis de retirer des actifs de la trésorerie selon des conditions fixées par l'opération elle-même.
  • Les vérifications de quantité ne protégeaient qu'une condition plus restreinte. La vérification que le montant total des fonds gelés était couvert maintenait les obligations enregistrées en tokens X alignées. Dans le même temps, le retrait des positions de liquidité libérait de la marge sous la limite de déploiement d'actifs sur le marché. Aucune de ces vérifications ne limitait les pertes acceptables sur la valeur de la trésorerie. De plus, les contrats auxiliaires permettaient de réutiliser des pouvoirs déjà obtenus lors d'une opération précédente.

Réponse et récupération

Les documents collectés ne contiennent aucune confirmation indépendante que les fonds ont été restitués ou que la vulnérabilité a été effectivement corrigée. Au point de référence enregistré, environ 1.97 USDT restaient dans le pool légitime, et les trois adresses d'exécution et de paiement vérifiées détenaient environ 826,902 X. Ces soldes illiquides en X ne peuvent pas être évalués de manière fiable en dollars compte tenu de l'état d'un marché asséché.

Le Freezer couvrait toujours les obligations enregistrées sur les dépôts gelés, et le sénat détenait toujours les deux sièges obtenus lors de la seconde opération et contrôlés par des contrats. Seuls 0.000002 X restaient avant la limite de déploiement observée. Toutefois, cet instantané ne prouve pas que le contrôle de la gouvernance a été restauré ou que son mécanisme a été corrigé.

Rétrospective: le prix du contrôle

D'autres attaques visant des mécanismes de gouvernance permettent de comparer le montant nécessaire pour obtenir le contrôle, les pouvoirs que ce contrôle conférait et la part de la valeur des actifs réellement réalisée.

IncidentDatePréjudice signalé
BonkDAO6 juillet 20264.426 mille milliards de BONK transférés, évalués à environ $19.3M
Term Finance23 août 2026Environ $8.46M en ETH et USDC
Astroport / Neutron22 septembre 2026Environ $9.4M de valeur totale des actifs; $1.96M en actifs liquides
Arkadiko22 octobre 2026Environ $1.09M dans le cadre du siphonnage d'Arkadiko

Ces cas et estimations reposent sur des rapports publiés; la séquence complète des actions de chaque attaque n'a pas été reconstituée de manière indépendante. Les calculs utilisent différentes méthodes d'évaluation, et la valeur déclarée des tokens ne prouve pas, à elle seule, qu'ils pouvaient être vendus pour le montant correspondant.

Exposition financière. Dans le cas de BonkDAO, les tokens de vote ont été restitués, et dans le cas d'Arkadiko, les tokens DIKO ont été revendus. Cela diffère de la situation de X100, où les dépôts sont restés verrouillés. Le capital nécessaire pour obtenir le contrôle et les fonds qui restent à risque par la suite sont des indicateurs différents. Le coût net complet de l'obtention du contrôle dans ces cas n'a pas été reconstitué de manière indépendante. Selon les rapports, chez Term Finance le contrôle a été obtenu via un wrapper autour du token de gouvernance, dont seul un petit nombre a été émis; l'exécution a suivi la période de vote.

Pouvoirs. Selon les données publiées, la séquence des événements chez Astroport / Neutron a compris onze réaffectations des administrateurs de contrats, suivies de dix migrations malveillantes et retraits d'actifs. Chez Arkadiko, un contrat privilégié a été approuvé dont les fonctions publiques de retrait et de création n'effectuaient aucune vérification des autorisations de l'appelant. Chez X100, la majorité a au contraire approuvé des opérations de trésorerie en conflit d'intérêts. Dans tous ces cas, les droits de vote donnaient accès à différentes manières de contrôler les actifs.

Valeur réalisable. Seule une partie des BONK volés a été transférée vers une plateforme d'échange; déposer des tokens sur une adresse de plateforme d'échange ne prouve pas, à lui seul, qu'ils ont été vendus. X100 a conservé des tokens X invendus dont le produit potentiel ne peut pas être déterminé de manière fiable. La destruction des tokens USDA chez Arkadiko a réduit l'offre non garantie mais n'a pas restitué la garantie. La valeur estimée des tokens de trésorerie, la quantité de tokens émis et les fonds réellement perçus lors d'une vente sont des indicateurs différents.

#Tether#Piratage#Ethereum#DeFi
Près de $4.85M ont quitté la pool X100: ce que révèlent cinq transactions