Aller au contenu

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é.


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.


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énement Deposit.
  • deposit() — Conçue pour les tokens ERC-20. Appelait safeTransferFrom() sur un contrat de token. Émettait également un événement Deposit — 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.

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.


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

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.


0xd01ae1a708614948b2b5e0b7ab5be6afa01325c7

ActifValeur 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$