Breakdown: How the hacker stole 80k ETH from the Solana Wormhole bridge

Décomposition : Comment le pirate a volé 80k ETH sur le pont du vortex de Solana.

L’un des pires hacks contre la blockchain Solana s’est produit mercredi lorsqu’un pirate a réussi à transférer 80 000 éthers (ETH), soit plus de 214 millions de dollars au moment de la rédaction de cet article, du système Solana vers la blockchain Ethereum par le biais du pont Wormhole – un service permettant de transférer des fonds entre les différentes blockchains.

Expliqué dans un tweet fil de discussion par le pseudo-profil Twitter smartcontractsle pirate a finalisé l’exploit en transférant les 80 000 ETH hors du contrat intelligent Wormhole sur Ethereum en une seule fois. transaction. Il s’est avéré que ce n’était que le dernier geste d’une série de piratages qui ont permis au pirate de voler les fonds.

« Bien qu’elle soit dramatique, cette transaction n’est que la toute fin d’une série d’événements intéressants. J’ai dû commencer à travailler à rebours pour comprendre comment cela était possible », a tweeté smartcontracts.

Les gardiens ont signé un faux transfert

Le trou de ver est un soi-disant pont, un contrat intelligentsur Ethereum en l’occurrence, qui permet de déplacer des crypto-actifs entre différentes blockchains. Selon smartcontracts, d’un point de vue de haut niveau, Wormhole dispose spécifiquement d’un ensemble de co-appelés gardiens qui signent les transferts entre les blockchains.

Les gardiens de Wormhole ont en quelque sorte signé ce transfert de 80 000 ETH comme s’il était 100% légitime.

« La transaction qui a retiré 80 000 ETH était en fait l’attaquant qui transférait 80 000 ETH de Solana vers Ethereum. J’ai d’abord pensé que le contrat pouvait avoir mal validé les signatures sur le transfert, mais les signatures [were] ont été complètement vérifiées. »

Selon smartcontracts, la première percée et explication partielle est venue d’un transaction sur Solana qui, d’une manière ou d’une autre, a frappé 120 000 « Wormhole ETH », de l’éther enveloppé sur Solana, sorti de nulle part. Puisque le pirate a pu frapper Wormhole ETH sur Solana, il a pu le retirer correctement vers Ethereum.

« Solana est un peu bizarre »

En examinant l’historique des transactions du hacker, on trouve une transaction qui a eu lieu juste avant la frappe des 120 000 ETH de Wormhole. Dans cette transactionle pirate ne monnaye que 0,1 ETH Wormhole, comme si le pirate testait la fonction avec un petit montant.

Un examen plus approfondi de l’historique des transactions du pirate révèle que ce dernier a effectué un dépôt de 0,1 ETH d’Ethereum en Solana. Bien que l’attaquant n’ait pas effectué un dépôt de 120 000 ETH dans le contrat intelligent Wormhole sur Ethereum, il y a quelque chose d’intéressant dans ce dépôt.

Comme l’explique smartcontract dans son tweet, les transactions qui ont permis de frapper les ETH de Wormhole sur Solana ont déclenché un contrat intelligent Wormhole. fonction appelée « complete_wrapped ». L’un des paramètres que prend cette fonction est un « message de transfert », en fait un message signé par les gardiens du pont qui dit quel jeton frapper et combien.

« Solana est un peu bizarre, donc ces paramètres sont en fait des contrats intelligents eux-mêmes. Mais l’important est de savoir comment ces contrats de « messages de transfert » sont créés. Voici le transaction qui a fait le message de transfert de 0,1 ETH », tweete smartcontracts.

Qui vérifie les pions ?

Ce contrat de « message de transfert » est créé par le déclenchement d’un fonction appelée « post_vaa ». La chose la plus importante est que post_vaa vérifie si le message est valide en vérifiant les signatures des gardiens. Cette partie semble assez raisonnable, selon smartcontracts, mais c’est cette étape de vérification des signatures qui a tout cassé.

La fonction « post_vaa » ne vérifie pas réellement les signatures. Au lieu de cela, dans le style typique de Solana, il y a un autre contrat intelligent qui est créé en appelant la fonction « verify_signatures ». fonction. L’un des entrées à la fonction « verify_signatures » est un programme « système » intégré à Solana qui contient divers utilitaires que le contrat peut utiliser.

Dans la fonction « verify_signatures », le programme Wormhole tente de vérifier que l’exécution qui s’est produite juste avant le déclenchement de cette fonction, était que le contrat Secp256k1 La fonction de vérification de signature a été exécutée.

« Cette fonction de vérification est un outil intégré qui est censé vérifier que les signatures données sont correctes. Donc la vérification des signatures a été externalisée à ce programme. Mais c’est là que le bug intervient », tweete smartcontracts.

Les contrats Wormhole utilisaient la fonction load_instruction_at pour vérifier que la fonction Secp256k1 a été appelée en premier, mais la fonction load_instruction_at a été dépréciée relativement récemment parce qu’elle ne vérifie pas qu’elle s’exécute par rapport à l’adresse réelle du système.!

Fin de partie

D’après les smartcontracts, l’appelant est censé fournir en tant que entrée l’adresse du système au programme en cours d’exécution, mais le pirate a fourni une adresse système différente.

Voici l’adresse système utilisée comme entrée pour le « verify_signatures » pour le dépôt légitime de 0,1 ETH :

Correction de l’entrée de l’adresse du système

Mais voici la transaction « verify_signatures » pour le faux dépôt de 120k ETH :

Entrée de l'adresse système
Fausse entrée d’adresse système

Ce n’est pas l’adresse du système !

« En utilisant ce « faux » programme système, l’attaquant pouvait effectivement mentir sur le fait que le programme de vérification des signatures était exécuté. Les signatures n’ont pas été vérifiées du tout ! », tweete smartcontracts.

« Après ce point, la partie était terminée. L’attaquant a fait croire que les gardiens avaient signé un dépôt de 120k sur Wormhole on Solana, alors que ce n’était pas le cas. Tout ce que l’attaquant devait faire maintenant, c’était de rendre réel l’argent du « jeu » en le retirant vers l’Ethereum. Et un retrait de 80k ETH + 10k ETH plus tard (tout dans le pont sur Ethereum), tout avait disparu. »