Définition
Signature replay : définition
Le signature replay, ou rejeu de signature, est une attaque qui consiste à réutiliser une signature valide dans un contexte non prévu, par exemple sur une autre chaîne, sur un autre contrat ou plusieurs fois de suite, pour déclencher une action non voulue.
Thème : Sécurité et arnaques
Une signature prouve qu'un détenteur de clé a approuvé un message précis. Elle ne dit rien du contexte si ce contexte n'est pas inclus dans le message signé. Un attaquant qui intercepte une signature peut donc la présenter à nouveau ailleurs : sur un autre réseau, dans un autre contrat qui vérifie le même format de message, ou une seconde fois dans le même contrat.
Plusieurs protections se complètent. Pour les transactions Ethereum, l'EIP-155 intègre l'identifiant de chaîne dans la signature, ce qui empêche de rejouer une transaction sur un autre réseau. Pour les messages signés hors chaîne, l'EIP-712 définit un séparateur de domaine qui peut contenir le nom de l'application, l'identifiant de chaîne et l'adresse du contrat vérificateur. Ces mesures ne suffisent pas contre un rejeu dans le même contrat. Celui-ci doit enregistrer les signatures déjà utilisées ou exiger un nonce, un numéro à usage unique incrémenté à chaque opération, et idéalement une date d'expiration. L'oubli de l'un de ces éléments est une faille récurrente dans les audits de smart contracts.
Un exemple concret
Imaginons un contrat qui permet de retirer des fonds sur présentation d'une signature de l'administrateur indiquant un destinataire et un montant. Si le contrat ne mémorise pas les signatures déjà utilisées, le destinataire peut soumettre la même signature dix fois et retirer dix fois le montant prévu.
Les risques à connaître
Un rejeu peut vider un contrat ou exécuter plusieurs fois une autorisation. Les utilisateurs sont aussi exposés lorsqu'une application leur fait signer des messages sans domaine clair. Il est prudent de vérifier dans le portefeuille le nom du domaine, la chaîne et le contrat avant de signer.
Questions fréquentes sur Signature replay
Comment un contrat se protège-t-il contre le rejeu ?
En liant chaque signature à une chaîne et à un contrat via un domaine, en utilisant un nonce à usage unique et en refusant toute signature déjà consommée ou expirée.
Une transaction peut-elle être rejouée sur une autre blockchain ?
Sur les réseaux compatibles avec Ethereum, l'identifiant de chaîne introduit par l'EIP-155 l'empêche pour les transactions qui l'utilisent. Le risque subsiste pour les messages signés mal conçus.