La protection contre l’attaque par canal caché via le nonce a été publiée pour le BitBox02 dans la mise à jour 01.2021 Monte Rosa.

De quoi s’agit-il ?

Les hardware wallets comme le BitBox02 créent des signatures numériques pour autoriser vos transactions. Pour cela, ils utilisent des clés privées. Sans connaître la bonne clé privée, il est pratiquement impossible de falsifier une signature. Une signature est construite mathématiquement à l’aide d’un nonce, un nombre secret que le hardware wallet peut choisir librement.

Un hardware wallet malveillant peut divulguer des clés privées via les signatures qu’il crée en manipulant ces nonces. Comme les signatures font partie des transactions enregistrées dans la blockchain publique, un attaquant distant peut les lire et reconstruire vos clés privées, prenant ainsi le contrôle de tous vos fonds.

Nous pouvons atténuer cette attaque en incluant de manière vérifiable une contribution de nonce provenant du logiciel hôte, comme la BitBoxApp, ce qui empêche toute manipulation de ce type.

Cette attaque est particulièrement intéressante à deux égards :

  • Même si vous vérifiez chaque détail de la transaction dans un environnement totalement sûr et utilisez un système complètement air gap pour signer la transaction, vous n’êtes toujours pas protégé, sauf si le protocole anti-klepto est actif.
  • Cette attaque contourne toute implication des ordinateurs et des téléphones mobiles. Elle s’applique même si l’ordinateur ou le wallet mobile que vous utilisez pour interagir avec votre hardware wallet n’est pas compromis.

Le protocole anti-klepto peut empêcher cette attaque en permettant à votre ordinateur ou à votre wallet mobile de vérifier qu’aucune manipulation malveillante des signatures n’a eu lieu, et de réagir correctement s’il détecte une manipulation.

Pourquoi est-ce utile ?

Nous croyons fortement à la défense en profondeur et au slogan « ne faites pas confiance, vérifiez ! ».

Dans le cadre de nos efforts pour accroître la transparence et réduire la confiance que vous devez accorder à la chaîne d’approvisionnement, nous avons déployé en continu des fonctionnalités et des outils qui vous aident à vérifier l’intégrité et la sécurité de votre BitBox02 et de votre seed, par exemple :

  • Seul un firmware officiellement signé par Shift Crypto peut s’exécuter sur le BitBox02.
  • Chaque wallet sur ordinateur et mobile effectue automatiquement une vérification d’attestation (vérification d’authenticité) pour s’assurer que le BitBox02 a été programmé en usine par Shift, avant de procéder au déverrouillage de l’appareil.
  • Tout notre code est open source, y compris le firmware BitBox02, la BitBoxApp et toutes nos bibliothèques utilisées dans les intégrations avec des wallets tiers.
  • Vous pouvez vérifier que les fichiers binaires de firmware que nous publions sont bien construits à partir du code source publié. Pour les instructions, consultez notre guide sur les « compilations reproductibles ».
  • Vous pouvez configurer le BitBox02 pour afficher une somme de contrôle du firmware à l’écran avant qu’il n’exécute le firmware, et vérifier indépendamment qu’elle correspond à la version officielle.
  • Depuis la version 01.2021 Monte Rosa, vous pouvez générer votre propre seed sans dépendre du processus de génération de nombres aléatoires du BitBox02, par exemple en lançant des dés. Suivez notre guide « Lancez les dés pour générer votre propre seed Bitcoin ».

Le protocole anti-klepto est notre dernier ajout à cette liste. Comme les autres fonctionnalités, il augmente le coût et les efforts nécessaires pour mener avec succès une attaque de la chaîne d’approvisionnement.

Manipuler la génération du seed et divulguer le seed dans un canal caché via le nonce sont probablement parmi les moyens les plus efficaces de mener une attaque à grande échelle. Ces deux problèmes sont traités dans notre récente version 01.2021 Monte Rosa.

Petit rappel : clés privées et clés publiques

Une clé privée est simplement un grand nombre, suffisamment grand pour ne pas pouvoir être deviné, par exemple :

92193805913277071008055984303319191614197341949664602874511898854633635443214

Pour chaque clé privée, il existe une clé publique correspondante, qui se traduit par votre adresse Bitcoin. Les fonds envoyés à une adresse ne peuvent être déplacés qu’en connaissant la clé privée correspondante. Connaître uniquement une clé publique ne révèle aucune information sur sa clé privée.

Aujourd’hui, au lieu de gérer de nombreuses clés privées, un wallet ne gère qu’un seul seed, dont il dérive des sous-clés à la demande. Le seed est ce que vous sauvegardez sur votre carte microSD lorsque vous initialisez votre BitBox02, ou ce que vous écrivez sur papier sous la forme de 24 mots de récupération.

La formule pour dériver une clé publique à partir d’une clé privée est publicKey = privateKey×G, où G est une valeur prédéfinie.

Les valeurs font techniquement partie d’un groupe mathématique, où l’addition a une signification particulière. Si vous souhaitez en savoir plus à ce sujet, une excellente introduction se trouve dans la série d’articles de blog « Cryptographie sur courbe elliptique : une introduction en douceur ».

Mis à part le fait que la division est impossible ici (sinon vous pourriez calculer la clé privée à partir de la clé publique !), l’essentiel des mathématiques usuelles fonctionne de la même manière. Des lois familières comme la distributivité restent valables : (a + b)×G = a×G + b×G. C’est cette loi qui permet au wallet sur ordinateur d’empêcher l’attaque par canal caché via le nonce, comme nous le verrons plus loin.

Attaque par canal caché via le nonce

Une partie d’une signature numérique est le nonce. Le nonce est comme une clé privée, mais il est créé aléatoirement à chaque fois qu’une signature est produite. Comme pour toute clé privée, il existe une clé publique correspondante nonce×G. Cette clé publique fait partie de la signature, qui est finalement enregistrée dans la blockchain avec la transaction.

En raison des nombreux pièges liés à l’utilisation de nonces aléatoires, la plupart des wallets sont passés à des nonces déterministes. Ils ne reposent pas sur des générateurs de nombres aléatoires, mais sont dérivés en hachant la clé privée, le message à signer et d’éventuelles données supplémentaires. Malheureusement, en observant un tel nonce seul, il est impossible de savoir s’il a été généré aléatoirement, de manière déterministe ou, dans le cas de l’attaque par canal caché, de manière malveillante.

Pour qu’un hardware wallet malveillant puisse extraire le seed du wallet (dont toutes les autres clés privées sont dérivées), il lui suffit d’encoder des parties de ce seed dans la clé publique du nonce, qui sera enregistrée dans la blockchain publique dans le cadre d’une signature de transaction. Après qu’un certain nombre de ces signatures malveillantes ont été inscrites sur la chaîne, l’attaquant peut les rechercher et recomposer votre seed.

Le hardware wallet malveillant rencontre quelques obstacles :

  • Il doit essayer aléatoirement de nombreux nonces différents jusqu’à ce que la clé publique du nonce présente le motif souhaité. Comme ce processus est lent, seuls quelques octets de la signature complète peuvent être influencés à la fois par le hardware wallet malveillant.
  • La signature doit également contenir une sorte de marqueur caché, afin que l’attaquant (et lui seul) puisse les reconnaître lors de l’analyse de la blockchain.

Par conséquent, le seed ne peut pas être extrait à l’aide d’une seule signature ; plusieurs sont nécessaires. Selon la méthode et l’environnement, quelques dizaines de signatures peuvent suffire pour extraire le seed complet.

Prévention : le protocole anti-klepto

L’attaque est déjouée en limitant la capacité du hardware wallet à choisir librement le nonce. Pour cela, la BitBoxApp (ou tout autre logiciel qui interagit avec le BitBox02) demandera au hardware wallet de choisir un nonce comme auparavant, mais l’obligera aussi à y ajouter un nonce choisi par la BitBoxApp elle-même.

Le protocole se déroule comme suit et est exécuté pour chaque signature.

Notez que je vais décrire un protocole simplifié, destiné à expliquer le concept à un niveau élevé. Le protocole complet avec tous les détails est documenté avec son implémentation dans le code et peut être consulté ici.

Entrons dans le vif du sujet :

Le hardware wallet doit d’abord s’engager sur le nonce qu’il compte utiliser en envoyant la clé publique du nonce de l’appareil au wallet hôte :

deviceNoncePublicKey = deviceNonce × G

En révélant cela au wallet hôte, le hardware wallet ne peut plus le modifier par la suite.

Le wallet hôte choisit un nonce aléatoire, hostNonce, et l’envoie au hardware wallet.

Le hardware wallet utilisera alors un nonce combiné

nonce = deviceNonce + hostNonce pour la signature finale. La clé publique du nonce résultante dans la signature est alors :

nonce×G = (deviceNonce + hostNonce) × G

Le wallet hôte peut vérifier que sa contribution de nonce a bien été utilisée et est présente dans la clé publique finale du nonce en vérifiant que :

nonce×G = deviceNonce × G + hostNonce × G (loi distributive)
= deviceNoncePublicKey + hostNonce × G

L’hôte peut le faire en utilisant le deviceNoncePublicKey reçu plus tôt. Si cette vérification échoue, le wallet hôte annulera l’opération et ne diffusera pas la transaction, empêchant ainsi toute fuite cachée de secrets par l’appareil.

Il y a quelques détails très importants à bien traiter dans l’implémentation réelle :

  • Le hardware wallet ne doit pas connaître le nonce de l’hôte avant d’avoir révélé son nonce d’origine, sinon il retrouve une liberté totale pour choisir le nonce final. Le wallet hôte doit s’en assurer.
  • Le hardware wallet ne doit pas utiliser le même nonce pour deux nonces hôtes différents, sinon la clé privée fuitera immédiatement vers l’hôte. Pour l’éviter, un engagement de hachage du nonce hôte est envoyé à l’appareil à l’avance. L’appareil peut s’en servir pour créer des nonces différents selon les nonces hôtes.

Déploiement

Jonas Nick a d’abord implémenté le protocole anti-klepto pour une utilisation avec les signatures Schnorr, un soft fork à venir. En m’appuyant sur ce travail, j’ai implémenté la même chose pour les signatures ECDSA et ouvert une pull request pour revue dans la bibliothèque secp256k1. ECDSA est le schéma de signature actuellement utilisé dans Bitcoin et de nombreux autres altcoins ; sa prise en charge est donc nécessaire pour utiliser le protocole anti-klepto dès aujourd’hui.

Nous avons publié la prise en charge de cette mise à jour du protocole dans la version 9.4.0 du firmware BitBox02 avec la mise à jour 01.2021 Monte Rosa. La BitBoxApp, à partir de la version 4.25, ajoute sa propre contribution de nonce et vérifie que le BitBox02 l’utilise lors de la signature d’une transaction Bitcoin ou Litecoin. Dans de futures versions, nous prévoyons également d’ajouter la prise en charge du protocole anti-klepto lors de la signature de transactions Ethereum, ainsi que lors de la signature de messages Bitcoin et Ethereum. À terme, nous aimerions rendre ce protocole obligatoire, ce qui nécessitera une mise à niveau du firmware.

Toutes nos bibliothèques logicielles BitBox02 open source ont aussi été mises à jour pour prendre en charge le protocole anti-klepto. Cela signifie que les intégrations du BitBox02 dans des wallets tiers comme HWI, Electrum, MyEtherWallet, etc. bénéficieront automatiquement de cette prise en charge avec le temps.

Remerciements et un mot sur la collaboration open source

Un grand merci à Stepan Snigirev d’avoir attiré l’attention sur ce sujet et d’en avoir fourni une excellente explication dans son article de blog. Il a largement contribué à me motiver à travailler sur une implémentation de niveau production de ce protocole pour le BitBox02 et d’autres hardware wallets.

Le BitBox02 s’appuie sur la bibliothèque cryptographique open source secp256k1, la même qui alimente aussi le nœud complet et le wallet Bitcoin Core.

Un grand merci à Jonas Nick, qui a généreusement passé en revue de nombreuses itérations de ma contribution. Le processus a été interrompu pendant un moment, car Jonas était occupé par BIP-Schnorr, MuSig2 et d’autres projets intéressants. Merci à Andrew Poelstra d’avoir repris mon travail et de l’avoir mené jusqu’à ce qu’il soit finalement fusionné dans secp256k1-zkp. Merci aussi à Tim Ruffing pour sa relecture supplémentaire.

L’un des grands avantages est que ce travail est open source et fait partie d’une bibliothèque largement auditée, de sorte qu’il peut être utilisé par tous. Nous nous attendons, et nous espérons, que de nombreux autres hardware wallets et signataires hors ligne adopteront ce protocole. Blockstream a déjà annoncé qu’elle ajoutera la prise en charge à son hardware wallet Jade récemment lancé.

Ressources utiles

Vous n’avez pas encore de BitBox ?

Garder vos cryptos en sécurité n’a pas besoin d’être compliqué. Le hardware wallet BitBox02 stocke hors ligne les clés privées de vos cryptomonnaies. Vous pouvez donc gérer vos coins en toute sécurité.

Le BitBox02 existe aussi en version Bitcoin-only, avec un firmware radicalement focalisé : moins de code signifie moins de surface d’attaque, ce qui améliore encore votre sécurité si vous ne stockez que du Bitcoin.

Procurez-vous-en une dans notre boutique !

Questions fréquentes (FAQ)

Qu’est-ce que l’attaque par canal caché via le nonce ? L’attaque par canal caché via le nonce consiste pour un hardware wallet malveillant à divulguer des clés privées à travers les signatures qu’il crée en manipulant les nonces. Ces signatures font partie des transactions enregistrées dans la blockchain publique, ce qui permet à un attaquant distant de les lire, de reconstruire vos clés privées et de prendre le contrôle de tous vos bitcoins.

Comment fonctionne le protocole anti-klepto ? Le protocole anti-klepto empêche l’attaque par canal caché via le nonce en permettant à votre ordinateur ou à votre wallet mobile de vérifier qu’aucune manipulation malveillante des signatures n’a eu lieu. Pour cela, il exige que le hardware wallet choisisse un nonce, puis l’oblige à y ajouter un nonce choisi par le logiciel hôte, comme la BitBoxApp. Cela garantit que le hardware wallet ne peut pas choisir librement le nonce, empêchant ainsi toute fuite cachée de secrets.

Pourquoi le protocole anti-klepto est-il important ? Même si vous vérifiez chaque détail d’une transaction dans un environnement totalement sûr et utilisez un système air gap pour signer la transaction, vous n’êtes toujours pas protégé contre l’attaque par canal caché via le nonce, sauf si le protocole anti-klepto est actif. Le protocole contourne toute implication des ordinateurs et des téléphones mobiles, assurant une protection même si vos appareils sont compromis.

Qu’est-ce qu’un nonce dans le contexte des signatures numériques ? Un nonce est un nombre secret utilisé dans la création de signatures numériques. Il peut être choisi librement par le hardware wallet et est construit mathématiquement pour autoriser les transactions. Un hardware wallet malveillant peut manipuler ces nonces pour divulguer des clés privées à travers les signatures qu’il crée.

Comment le BitBox02 garantit-il l’intégrité et la sécurité de ses opérations ? Le BitBox02 dispose de plusieurs fonctionnalités pour garantir son intégrité et sa sécurité : seul un firmware officiellement signé par Shift Crypto peut s’exécuter sur le BitBox02. Chaque wallet sur ordinateur et mobile effectue automatiquement une vérification d’attestation pour s’assurer que le BitBox02 a été programmé en usine par Shift. Tout le code est open source, y compris le firmware BitBox02, la BitBoxApp et toutes les bibliothèques utilisées dans les intégrations avec des wallets tiers. Les utilisateurs peuvent vérifier que les fichiers binaires du firmware sont construits à partir du code source publié. Le BitBox02 peut afficher une somme de contrôle du firmware à l’écran pour vérification. Les utilisateurs peuvent générer leur propre seed sans dépendre du processus de génération de nombres aléatoires du BitBox02.

Quelle est la différence entre une clé privée et une clé publique ? Une clé privée est un grand nombre qui ne peut pas être deviné, et pour chaque clé privée, il existe une clé publique correspondante qui se traduit par une adresse Bitcoin. Les fonds envoyés à une adresse ne peuvent être déplacés qu’en connaissant la clé privée correspondante. Connaître uniquement une clé publique ne révèle aucune information sur sa clé privée.

Shift Crypto est une entreprise privée basée à Zurich, en Suisse. Notre équipe internationale de spécialistes en ingénierie, en sécurité cryptographique et en développement Bitcoin Core conçoit les produits BitBox et fournit des services de conseil. Le BitBox02, hardware wallet de deuxième génération, permet aux particuliers de stocker, protéger et utiliser facilement des cryptomonnaies. Son compagnon, la BitBoxApp, fournit une solution tout-en-un pour gérer vos actifs numériques en toute sécurité et avec simplicité.

This post was translated with the help of AI