Ce qui s'est passé
Le 28 janvier 2022, Qubit Finance a été exploité pour environ 80 millions de dollars USD en actifs crypto. Cela reste l’un des plus grands piratages DeFi de l’histoire. Aucun fonds n’a jamais été restitué.
Contexte
Section intitulée « Contexte »Qubit Finance était un protocole de prêt DeFi sur Binance Smart Chain, construit par la société sud-coréenne Mound Inc. — la même équipe derrière PancakeBunny, qui avait déjà été exploité pour environ 45 millions de dollars en mai 2021. Qubit était leur deuxième tentative.
Le protocole incluait QBridge — un pont inter-chaînes qui permettait aux utilisateurs de déposer des ETH sur Ethereum et de recevoir des tokens qXETH équivalents sur BSC, pouvant être utilisés comme garantie pour emprunter d’autres actifs.
Qubit Finance était explicitement soutenu par Binance et opérait sur la Binance Smart Chain.
L’exploit
Section intitulée « L’exploit »Étape 1 — Deux fonctions, un seul événement
Section intitulée « Étape 1 — Deux fonctions, un seul événement »QBridge avait deux façons de déposer des ETH :
depositETH()— Fonction correcte. Nécessitait de véritables ETH (msg.value > 0). Émettait un événementDeposit.deposit()— Conçue pour les tokens ERC-20. AppelaitsafeTransferFrom()sur un contrat de token. Émettait également un événementDeposit— du même type exact.
Le relayer hors chaîne qui traitait les événements du pont n’avait aucun moyen de distinguer les deux.
Étape 2 — L’adresse zéro était sur liste blanche
Section intitulée « Étape 2 — L’adresse zéro était sur liste blanche »Pour l’ETH, puisque l’ETH natif n’a pas d’adresse de contrat ERC-20, QBridge utilisait l’adresse zéro (0x0000000000000000000000000000000000000000) comme substitut. L’adresse zéro avait été ajoutée à la liste blanche du contrat.
Étape 3 — Appeler un EOA réussit silencieusement
Section intitulée « Étape 3 — Appeler un EOA réussit silencieusement »Lorsque deposit() était appelée avec le resourceID de l’ETH, le contrat résolvait l’adresse du token vers l’adresse zéro et appelait safeTransferFrom() dessus.
Dans l’EVM, appeler n’importe quelle fonction sur une adresse sans code de contrat (un EOA) réussit silencieusement — pas de revert, pas d’erreur, pas de transfert réel. L’adresse zéro est un EOA. Donc safeTransferFrom() a « réussi », rien n’a bougé, et le contrat a émis un événement Deposit identique à un dépôt ETH légitime.
Ce comportement de l’EVM avait été documenté dans une mise à jour de sécurité du protocole 0x en 2019. L’équipe de Qubit ne le savait pas, ou l’a ignoré.
Étape 4 — Le relayer a émis de vrais tokens sur BSC
Section intitulée « Étape 4 — Le relayer a émis de vrais tokens sur BSC »Le relayer a vu l’événement Deposit, n’avait aucun moyen de savoir qu’il était faux, et a émis des tokens qXETH sur BSC pour l’attaquant — sans aucune contrepartie.
L’attaquant a répété ce processus à plusieurs reprises, accumulant une quantité massive de faux qXETH.
Étape 5 — Fausse garantie, vrais emprunts
Section intitulée « Étape 5 — Fausse garantie, vrais emprunts »En utilisant les qXETH frauduleusement émis comme garantie, l’attaquant a emprunté environ 80 millions de dollars en actifs réels depuis les pools de prêt BSC de Qubit Finance : WETH, BTCB, BNB, MATIC, CAKE, BUSD, et plus encore.
Le contrat de prêt vérifiait correctement la valeur de la garantie — mais la fraude avait déjà eu lieu au niveau du pont.
Le changement de paramètre suspect
Section intitulée « Le changement de paramètre suspect »Les enquêteurs ont découvert quelque chose qui n’a jamais été expliqué.
À l’origine, la fonction deposit() avec son resourceID était utilisée pour le pont WETH — un véritable token ERC-20 avec une vraie adresse de contrat. Cela fonctionnait correctement.
À un moment donné avant le piratage, une fonction réservée au propriétaire (onlyOwner) a été appelée pour réassigner le mapping du resourceID — remplaçant l’adresse du contrat WETH par l’adresse zéro. C’est ce changement qui a rendu l’exploit possible.
Faits clés :
- Seul le propriétaire du contrat pouvait effectuer ce changement
- Il n’y avait pas de timelock — le changement prenait effet immédiatement
- Il n’y a eu aucune annonce publique
- Aucune explication n’a jamais été fournie
La réponse de l’équipe
Section intitulée « La réponse de l’équipe »Ce que Mound Inc. a fait ensuite :
- A offert au pirate 250 000 $ pour restituer 80 millions de dollars (aucune réponse)
- A prétendu avoir déposé des plaintes — n’a jamais fourni de numéros de dossier
- A supprimé les victimes de Telegram via le modérateur @moleh
- Le CTO a supprimé son LinkedIn le 1er février 2022, quatre jours après le piratage
- N’a pas contacté la sécurité de Binance ni les principales plateformes d’échange pour mettre le portefeuille du pirate sur liste noire
- N’a pas répondu aux membres de la communauté qui se sont manifestés avec des informations sur le pirate
Pour un dossier complet, voir Réponse de l’équipe et Neuf questions sans réponse.
Portefeuille du pirate
Section intitulée « Portefeuille du pirate »0xd01ae1a708614948b2b5e0b7ab5be6afa01325c7Actifs volés estimés
Section intitulée « Actifs volés estimés »| Actif | Valeur approx. en USD |
|---|---|
| WETH | ~26,6 M$ |
| BTCB | ~15,3 M$ |
| BNB | ~9,5 M$ |
| MATIC | ~5,6 M$ |
| CAKE | ~8 M$ |
| BUSD + autres | ~15 M$ |
| Total | ~80 M$ |