Cet article de blog révèle une menace contre le réseau Ethereum qui était présente depuis la fusion jusqu'au hard fork de Dencun.
Arrière-plan
Avant la fusion, différentes limites de taille de message pour la communication RPC étaient définies afin de protéger les clients contre les attaques par déni de service (DOS). Ces limites, appliquées aux messages reçus via les points de terminaison HTTP, ont été reportées sur l'API du moteur, qui joue un rôle crucial dans la connexion des clients des couches d'exécution et de consensus pendant la production de blocs. Grâce à l'implication de l'API du moteur dans la production de blocs, il est devenu possible de produire des blocs dépassant les limites de taille RPC de certains clients mais restant dans la plage acceptable pour d'autres.
Si un attaquant crée un message qui dépasse la limite de taille du client avec le paramètre le plus bas, tout en respectant les exigences de limite de gaz, puis attend qu'un bloc soit produit, cela pourrait entraîner une situation dans laquelle certains clients considèrent le bloc comme valide, tandis que d'autres le rejettent, émettant un code d'erreur HTTP « 413 : Contenu trop volumineux ».
Impact
Un attaquant capable de créer ces messages serait capable de forcer la majorité des nœuds (= geth) à rejeter les blocs qu'une minorité accepterait. Ces blocs seraient supprimés et le proposant manquerait de récompenses.
Au début, nous pensions qu'il n'était possible de créer ces blocs qu'en utilisant des constructeurs ou une version modifiée d'un client. Geth a une limite intégrée de 128 Ko pour les transactions, ce qui signifie qu'une grosse transaction comme celle en discussion ne finirait pas dans les pools de transactions d'un nœud Geth. Il était cependant possible de toujours déclencher la limite en demandant à un client avec une limite plus élevée de proposer le bloc et au CL de demander la validation de ce bloc plus grand proposé.
Nous avons proposé une solution consistant à abaisser temporairement la limite RPC sur tous les clients à la valeur la plus basse (5 Mo). Cela rendrait le bloc invalide et un attaquant serait très limité dans le chaos qu'il peut provoquer dans le réseau puisque la majorité des nœuds rejetteraient leurs blocs.
Cependant, le 7 février, nous avons découvert qu'il était possible de créer un bloc qui atteindrait la limite de 5 Mo avec un ensemble de transactions inférieures à la limite de 128 Ko et ne dépassant pas 30 millions de gaz.
Il s’agit d’un problème plus important, car nous avons réalisé qu’un attaquant pourrait créer un ensemble de transactions très rémunératrices et les envoyer sur le réseau. Puisqu'il paie plus que tout le monde dans le pool de mémoire, chaque nœud (même les nœuds geth) inclurait les transactions d'attaque dans son bloc, créant ainsi un bloc qui ne serait pas accepté par la majorité du réseau, ce qui entraînerait de nombreux forks (tous considérés comme valable par les nœuds minoritaires) et la chaîne continue de se réorganiser encore et encore.
Plus tard, le 7 février, nous sommes arrivés à la conclusion que l'alternative la plus sûre serait d'augmenter les limites du RPC pour tous.
Chronologie
- 2024-02-06 13h00 : Toni (EF), Pari (EF) et Justin (Besu) tentent de soumettre une transaction spécifiquement broyée au réseau. La transaction contribue jusqu'à 2,7 Mo de blocs lorsqu'elle est compressée de manière instantanée.
- 2024-02-06 13:25 : Pari reçoit des erreurs de son nœud Geth local bien que la transaction doive être valide.
- 2024-02-06 15:14 : Justin a réussi à mettre la transaction dans un bloc et à la soumettre via le client Besu.
- 2024-02-06 20:46 : Sam (EF) alerte Pari (merci spécial à mystiqueryuujin sur X), Toni et Alex à propos de certains nœuds Sepolia en difficulté.
- 2024-02-06 21:05 : L'équipe vérifie avec Marius de Geth et confirme le bug.
- 2024-02-06 21:10 : Le gang se réunit pour le déboguer
- 2024-02-07 23:40 : Nous avons décidé pour tous les clients de limiter leur limite de requêtes RPC à 5 Mo.
- 07/02/2024 6h40 : Nous avons découvert qu'il pourrait y avoir un problème plus important et que l'attaque peut être exécutée avec des transactions inférieures à 128 Ko.
- 2024-02-07 10h00 : Nous avons décidé pour tous les clients d'augmenter la limite de requêtes RPC.
- 2024-02-07 21h00 : le correctif a été fusionné dans Geth.
- 09/02/2024 : Geth est sorti
Bien que Geth soit le seul client affecté par ce bug, d'autres clients ont également mis à jour leurs paramètres par défaut pour se protéger de cette attaque même si les limites de gaz sont augmentées. Les équipes clientes ont indiqué que les mises à jour suivantes ont les limites rpc sûres :
Geth : v1.13.12
Esprit néant : v1.25.4
Bésu : 24.1.2
Érigon : v2.58.0
Reth : v0.1.0-alpha.18
Source https://blog.ethereum.org/en/2024/03/21/sepolia-incident