Sur le modèle de sécurité des portefeuilles logiciels
Blog
Un portefeuille de cryptomonnaies est un appareil ou une application capable de gérer des cryptomonnaies et d'effectuer des transactions pour une ou plusieurs cryptomonnaies. Ses principales fonctionnalités de sécurité sont de stocker les clés privées des utilisateurs et de les utiliser pour signer des transactions.
On distingue deux types de portefeuilles courants : les portefeuilles logiciels et les portefeuilles matériels. Ils remplissent la même fonction, mais de manière différente. Les portefeuilles logiciels sont considérés comme plus simples à utiliser : un seul programme suffit à créer, valider et signer les transactions. Avec un portefeuille logiciel, il n'est pas nécessaire de créer la transaction sur le logiciel et de la confirmer sur un périphérique matériel.
Il y a deux semaines, Forbidden Stories dévoilait une attaque ciblée contre des milliers de personnes à travers le monde. Cette attaque exploitait des vulnérabilités sur Android et iOS, pour installer un logiciel espion développé par le groupe NSO : Pegasus. Ce malware est capable de surveiller toute l'activité de l'appareil, et d'exfiltrer des informations personnelles : SMS, conversations WhatsApp et Signal, appels téléphoniques, etc. Cet article explique comment, dans ces conditions, un tel malware serait capable d'extraire tous les secrets d'un portefeuille logiciel, et les différences d'un point de vue sécurité entre les portefeuilles logiciels sur téléphones mobiles et sur ordinateurs de bureau.
Cet article ne se veut pas trop technique. Pour le garder relativement simple, seules les fonctionnalités de base seront abordées.
Protéger les secrets
Qu'est-ce qui est stocké dans un portefeuille cryptographique ?
Les portefeuilles ne stockent pas réellement les cryptomonnaies des utilisateurs : ils ne stockent que les secrets, notamment les clés privées, qui permettent d'accéder aux cryptomonnaies et de pouvoir les dépenser. Ces clés privées sont pour la plupart des clés privées ECC (elliptic curve cryptography) sur des courbes différentes selon la blockchain. Les courbes les plus courantes sont secp256k1 (Bitcoin, Ethereum…), Ed25519 (Monero), ou encore BLS12-381 (Ethereum 2).
Ces clés sont utilisées pour signer des transactions, et plus généralement pour interagir avec les actifs de la blockchain.
Le stockage de ces clés dépend du type de portefeuille : déterministe ou non. Un portefeuille déterministe hiérarchique (HD) permet de créer un arbre de clés à partir d'un seul secret maître appelé seed (cf. BIP44). Ce seed est souvent issu d'une séquence mnémonique de 12, 18 ou 24 mots générés aléatoirement ou choisis par l'utilisateur (cf. BIP39). Ces mnémoniques permettent de limiter le nombre de clés à stocker : elles peuvent être recalculées à tout moment à partir du seed. Les portefeuilles HD ne stockent que ce mnémonique ou le seed.
Les portefeuilles non déterministes génèrent une nouvelle clé à chaque utilisation et doivent toutes les stocker. Les portefeuilles non déterministes ne peuvent pas être facilement migrés vers un autre portefeuille car les sauvegardes ne sont pas compatibles.
Les principales caractéristiques de sécurité d'un portefeuille consistent à générer, stocker et utiliser correctement ces secrets. Il existe différents niveaux de sécurité contre différents types de menaces :
Protection contre les attaques de type « evil maid » : Un attaquant disposant d'un accès temporaire au portefeuille ne doit pas pouvoir ajouter une porte dérobée à l'intérieur du portefeuille permettant de voler le code PIN ou le mot de passe protégeant les secrets.
Matériel cryptographique sécurisé : Les clés et nonces générés par le portefeuille ne doivent jamais être prévisibles. De plus, la connaissance des secrets (à l'exception du seed) générés à un moment donné ne doit pas permettre de prédire le secret qui sera généré dans le futur.
Protection au repos : Si un attaquant obtient des données persistantes d’un portefeuille logiciel, il ne doit pas pouvoir extraire les clés.
Protection lors d'une utilisation secrète : Lorsque le portefeuille est déverrouillé, les clés ne doivent pas être accessibles par un attaquant ou un malware.
Portefeuilles matériels
Le modèle de sécurité d'un portefeuille matériel vise à éviter ces menaces de sécurité. Les portefeuilles matériels protègent contre les malwares par conception. Ce sont des appareils indépendants qui signent eux-mêmes les transactions. Les matériaux cryptographiques restent toujours à l'intérieur de l'appareil et ne sont jamais envoyés à l'application logicielle avec laquelle ils communiquent. L'interface de communication est toujours simple, ce qui réduit considérablement la surface d'attaque. Il peut s'agir d'une clé USB, d'une Micro SD ou d'un appareil photo + écran (via un code QR), ou encore du Bluetooth Low Energy.
De plus, les portefeuilles matériels intègrent un écran directement dans l'appareil permettant à l'utilisateur de vérifier les actions qu'il s'apprête à effectuer lorsqu'il interagit avec ses clés secrètes. Ces vérifications manuelles sur les appareils constituent une contre-mesure très efficace contre les logiciels malveillants sur l'ordinateur/le mobile. Alors que les logiciels malveillants sur un ordinateur/appareil mobile peuvent accéder aux secrets (seed ou clés privées) ou même échanger/modifier des adresses ou des montants lorsque l'utilisateur effectue une transaction, cela n'est pas possible avec un portefeuille matériel.
Les portefeuilles matériels sont également conçus pour protéger contre les attaques de type « evil maid » et contre un attaquant disposant d'un accès physique. Selon le portefeuille matériel, ils ont différents niveaux de sécurité, mais dans tous les cas, ils sont conçus pour se protéger contre ces menaces. Une description détaillée des modèles de menace Ledger Nano est disponible ici .
Portefeuilles logiciels
Les portefeuilles logiciels classiques protègent les secrets avec des moyens classiques : les mécanismes de sécurité du système d'exploitation sur lequel ils fonctionnent et parfois un contrôle d'accès basé sur un code PIN ou un mot de passe.
Dans ce qui suit, nous allons considérer les portefeuilles de bureau (Windows, macOS, Linux) et les portefeuilles mobiles. Les principales différences entre eux reposent principalement sur les mécanismes de sécurité offerts par le système d'exploitation.
Portefeuilles logiciels sur un ordinateur
Plusieurs portefeuilles populaires, tels que Electrum, Exodus, Atomic ou Bitcoin core, fonctionnent sur des ordinateurs.
Sur un ordinateur, les mécanismes de sécurité offerts par le système d'exploitation pour isoler un processus de portefeuille des autres processus sont limités. La plupart des applications sont exécutées par le même utilisateur et les applications sont autorisées à lire les données des autres applications.
La sécurité de ces portefeuilles logiciels repose principalement sur la sécurité du mot de passe qui les protège, et également sur le fait qu'aucun malware ne tourne sur l'OS (ce qui est assez difficile à garantir, voir les actualités récentes concernant Pegasus).
La plupart du temps, la seed est stockée dans un conteneur chiffré protégé par un mot de passe. Une attaque simple consiste, pour un malware ou un outil d'administration à distance, à récupérer ce conteneur chiffré et à l'envoyer à l'attaquant. Le mot de passe peut alors être soit obtenu par force brute, soit obtenu à l'aide d'un keylogger .
Dans un scénario où un attaquant parvient uniquement à accéder au conteneur chiffré (l'attaquant trouve une clé USB contenant un portefeuille, ou installe un malware sur un ordinateur, mais la victime n'ouvre jamais son application de portefeuille), l'attaquant doit forcer le mot de passe.
La plupart des mots de passe sont mauvais. Des milliards de mots de passe ont fuité sur le Web et de nombreuses personnes ont tendance à réutiliser leurs mots de passe pour plusieurs services. Des outils prêts à l'emploi permettent de récupérer les mots de passe des portefeuilles de crypto-monnaies, tels que btcrecover ou hashcat . Les mots de passe peuvent être complexes, mais derrière chaque portefeuille se cache de l'argent réel, c'est pourquoi les attaquants n'hésiteront pas à investir des ressources pour casser ces mots de passe.
Deux principes de sécurité de base pour sécuriser vos mots de passe sont d'utiliser un gestionnaire de mots de passe et de ne jamais réutiliser votre mot de passe à des fins différentes.
La menace la plus préoccupante pour les portefeuilles logiciels est constituée de malwares et de voleurs, développés spécifiquement pour drainer vos fonds. De tels malwares, tels que KPOT ou ElectroRAT , n'ont même pas besoin de forcer votre mot de passe : ils peuvent le capturer directement lorsque vous le saisissez, décrypter les données de configuration du portefeuille et exfiltrer la seed.
Voici une application jouet, développée pour cet article, qui cible le portefeuille Electrum (même s'il aurait pu s'agir d'un autre portefeuille logiciel). Elle simule un malware qui vole le mot de passe de l'utilisateur lorsqu'il est saisi par la victime. Le mot de passe est ensuite utilisé pour décrypter les données du portefeuille et pour afficher la seed :
Comme vous le voyez, même si le mot de passe est complexe, l'application est capable de le récupérer car elle le renifle directement en mémoire.
Cet exemple est très similaire aux récentes campagnes de malware .SCR utilisées pour voler des cryptomonnaies. Les criminels ont utilisé des techniques d'ingénierie sociale pour inciter les utilisateurs à télécharger un économiseur d'écran malveillant. Cet économiseur d'écran volait en réalité des informations sur l'ordinateur de la victime, notamment des informations sur son portefeuille et sur l'échange de cryptomonnaies.
Pour conclure sur les portefeuilles logiciels exécutés sur les ordinateurs :
Dans la plupart des cas, les portefeuilles logiciels exécutés sur les ordinateurs protègent la graine de l'utilisateur à l'aide d'un mot de passe.
Le contrôle d'accès à ces fichiers de portefeuille repose principalement sur la sécurité de l'ordinateur. Dans la pratique, il est difficile de protéger les ordinateurs contre les logiciels malveillants, et à mesure que les crypto-monnaies deviennent courantes, les attaques contre les portefeuilles deviendront de plus en plus sophistiquées.
Utiliser de tels portefeuilles logiciels pour sécuriser les actifs numériques n'est pas une bonne idée. Tout logiciel malveillant spécialisé sera en mesure d'obtenir les fichiers du portefeuille et de trouver les mots de passe hors ligne, ou d'obtenir le mot de passe via un enregistreur de frappe.
Portefeuilles logiciels sur smartphone
Les smartphones Android et iOS offrent par défaut des fonctionnalités de sécurité qui ne sont pas largement utilisées sur les systèmes d’exploitation de bureau.
Les systèmes d'exploitation mobiles offrent une protection des données des applications et des utilisateurs. En particulier, les sandboxes d'applications sont obligatoires pour toutes les applications. Ce n'est pas le cas, par exemple, sous Windows : par défaut, n'importe quelle application peut accéder aux données des utilisateurs.
Par conséquent, une application malveillante ne peut pas lire les données d’une autre application, sauf si :
Il trouve une vulnérabilité sur cette application.
Ou bien il parvient à augmenter ses privilèges, par exemple en exploitant une vulnérabilité du noyau lui permettant d'obtenir un accès root au système.
Malheureusement, de telles attaques existent. Elles sont bien plus faciles à utiliser sur les versions obsolètes d'Android et d'iOS, ainsi que sur les appareils anciens ou bon marché où le code tiers est souvent moins sécurisé.
Sur un système d’exploitation à jour, ces attaques sont plus difficiles à mettre en œuvre, mais pas pour autant irréalisables. Par exemple, Ian Beer a montré une attaque zero-click extrêmement impressionnante sur iOS 13.5 en décembre 2020. Guang Gong a présenté une chaîne d’exploitation permettant de rooter à distance une large gamme d’appareils Android basés sur Qualcomm en juin 2020. Et, il y a deux semaines, Forbidden Stories a révélé que NSO Group avait utilisé une chaîne d’exploitation pour cibler des appareils iOS et Android récents en utilisant des vulnérabilités zero-day.
Les attaquants moins sophistiqués peuvent exploiter des vulnérabilités locales leur permettant d'extraire les données du portefeuille d'une application malveillante. Les courtiers en vulnérabilités tels que Zerodium paient jusqu'à 200 000 $ pour une élévation des privilèges vers le root sur Android et iOS, mais jusqu'à 1 500 000 $ pour des attaques à distance.
Nous avons étudié quelques portefeuilles Android/iOS. Leur sécurité dépend de l'application elle-même, mais aussi des fonctionnalités de sécurité du système d'exploitation sous-jacent. Bien entendu, lorsque la sécurité du système d'exploitation est compromise, l'application n'est plus sécurisée
Deux méthodes sont couramment utilisées pour protéger les semences :
Protection par mot de passe – les données du portefeuille sont protégées par un mot de passe saisi par l’utilisateur. La conception est la même que pour les portefeuilles de bureau. En pratique, les données sont plus difficiles à extraire que depuis un ordinateur, car récupérer les données d’une application malveillante est techniquement plus difficile, pour les raisons expliquées ci-dessus. Cependant, récupérer le mot de passe une fois les données volées est en pratique plus facile : la saisie de mots de passe complexes sur les téléphones mobiles est fastidieuse, c’est pourquoi les utilisateurs ont tendance à choisir des mots de passe plus simples. De plus, les mécanismes de dérivation de clés (utilisés pour créer une clé à partir d’un mot de passe) sur les appareils mobiles sont généralement plus simples à casser, car ils sont souvent plus légers pour des raisons de performances.
Coinomi et Metamask sont des exemples de tels portefeuilles.
Dans la vidéo suivante, nous présentons une autre application jouet développée pour cet article. Il s'agit d'un malware déguisé en un faux widget de ticker Bitcoin. Le malware exploite une vulnérabilité connue sur un appareil non corrigé pour obtenir un accès root sur l'appareil et pour exfiltrer la graine cryptée vers un serveur distant. Le serveur utilise ensuite le mot de passe par force brute pour décrypter la seed.
Cette méthode n'est pas spécifique à un portefeuille. Elle peut être (plus ou moins) facilement adaptée à n'importe quel portefeuille protégé par mot de passe. Voici le même exemple avec Coinbase Wallet :
Sécurité basée sur le Keystore Android (ou le trousseau iOS) – Dans ce cas, les données du portefeuille sont chiffrées avec une clé de chiffrement stockée dans le Keystore Android (porte-clés iOS). Ces services ont été initialement conçus pour stocker de manière sécurisée les clés de chiffrement, et de nombreuses applications les utilisent pour générer une clé qui chiffrera toutes les données sensibles de l'utilisateur. Les applications utilisant le Keystore implémentent le mécanisme suivant :
L'application demande au Keystore de générer une clé de chiffrement pour un identifiant donné. Le Keystore génère la clé et la stocke en toute sécurité.
Lorsque l'application souhaite crypter ou décrypter un blob, elle envoie le blob avec l'identifiant de clé au Keystore.
Enfin, le keystore vérifie si l'application dispose réellement des droits d'utilisation de cette clé et renvoie ensuite les données de sortie à l'application.
Avec ce modèle, l'application ne peut pas connaître la valeur de la clé mais peut l'utiliser. Il est également possible d'associer des contrôles d'accès supplémentaires à la clé : par exemple, l'accès à la clé peut être conditionné à une authentification de l'utilisateur ( demande d'un code PIN ou d'un schéma de déverrouillage ).
Ce mécanisme peut apporter une sécurité supplémentaire, par rapport à la protection par mot de passe. En effet, sur les téléphones récents, le Keystore est adossé à un Trusted Execution Environment (TEE), ou parfois à un Secure Element.
Cela signifie qu'un attaquant disposant des privilèges root ne pourra pas extraire les clés de chiffrement du keystore. Néanmoins, il pourra utiliser le keystore comme un oracle de déchiffrement et chiffrer ou déchiffrer toutes les données qu'il souhaite.
Keystore propose des services de chiffrement, mais aussi de signature. Alors, un portefeuille pourrait-il protéger ses clés de chiffrement, les rendant difficiles à extraire ? La réponse est malheureusement non : les portefeuilles logiciels n'utilisent pas Keystore pour signer les transactions, et les clés privées sont toujours manipulées en clair par l'application .
La raison est simple : KeyStore et KeyChain proposent des services génériques de signature et de chiffrement, mais ne prennent pas en charge la cryptographie utilisée dans les cryptomonnaies. Par exemple, KeyStore implémente la signature ECDSA mais uniquement sur les courbes NIST définies dans la norme FIPS 186-4 (P-224, P-256, P-384 et P-521). Bitcoin utilise une autre courbe, secp256k1 , qui n'est pas encore prise en charge.
Pour résumer, Keystore et Keychain sont de bons services pour protéger les clés secrètes et privées . Ils peuvent offrir une certaine sécurité en chiffrant les données sensibles : certaines classes de vulnérabilités (lecture arbitraire de fichiers, par exemple) seront traitées par le chiffrement Keystore. Cependant, si une escalade des privilèges root ne suffit pas à extraire les valeurs de clés d'un Keystore matériel, elle est suffisante pour déchiffrer les données sensibles. Un attaquant capable d'instrumenter l'application est en mesure de récupérer ses secrets.
Pour conclure sur les portefeuilles mobiles :
Le mécanisme d’isolation entre les applications fourni par iOS/Android élève la barre en matière de sécurité par rapport à un portefeuille logiciel exécuté sur un ordinateur. L’attaquant doit d’abord obtenir une élévation de privilèges pour accéder aux données de l’application. Cela est possible sur des appareils obsolètes. Des attaquants qualifiés (Ian Beer l’a fait en 6 mois seulement mais… c’est Ian Beer) peuvent également le faire sur des appareils récents et corrigés.
Les services de protection de clés (KeyStore, KeyChain) peuvent ajouter une couche de sécurité supplémentaire pour protéger les secrets au repos. Néanmoins, comme ils ne prennent pas en charge les algorithmes cryptographiques pour les applications de cryptomonnaie, la clé peut toujours être extraite.
Dans tous les cas, un attaquant disposant d'un accès root peut soit récupérer la graine au repos, lorsqu'elle est utilisée, soit exploiter les droits de l'utilisateur pour vider le portefeuille en utilisant le portefeuille logiciel comme oracle.
Voici un dernier exemple d'un logiciel espion ciblant le portefeuille Blockchain.com (bien que cela puisse être fait sur de nombreux autres portefeuilles tout aussi facilement). Il est installé à distance et surveille le portefeuille. Une fois que l'utilisateur s'est authentifié à l'aide de son empreinte digitale, la clé de cryptage est déverrouillée et les données du portefeuille sont décryptées. Le logiciel espion instrumente l'application pour récupérer cette clé de cryptage. Il exfiltre ensuite la clé et les données du portefeuille vers un serveur distant :
Conclusion
En conclusion, les portefeuilles logiciels ont différents niveaux de sécurité. Cependant, leur modèle de menace ne couvre pas le cas d'un malware exécuté sur le système d'exploitation avec une élévation de privilèges. C'est voulu : l'application de portefeuille ne peut pas être plus sécurisée que le système d'exploitation sur lequel elle s'exécute.
Le mécanisme d'isolation entre les applications fourni par iOS/Android augmente la barre en matière de sécurité par rapport à un portefeuille logiciel exécuté sur un ordinateur. L'attaquant doit d'abord obtenir une élévation de privilèges pour accéder aux données de l'application.
Les services de protection de clés (KeyStore, KeyChain) pourraient ajouter une couche de sécurité supplémentaire pour protéger les secrets au repos. Néanmoins, comme ils ne prennent pas en charge les algorithmes cryptographiques pour les applications de cryptomonnaie, les clés doivent être manipulées directement depuis l'application, ce qui leur offre une protection limitée.
Dans tous les cas, un attaquant disposant d'un accès root peut soit récupérer la graine au repos, lorsqu'elle est utilisée, soit exploiter les droits de l'utilisateur pour vider le portefeuille en utilisant le portefeuille logiciel comme oracle.
Traduit de l'article de Ledger, auteurs Charles Guillemet, Jean-Baptiste Bedrune.