Résumé de gestion
Qtum a contacté Sayfer Security afin d'effectuer des tests d'intrusion sur MetaMask Snap de Qtum en 05/2024.
Avant d'évaluer les services ci-dessus, nous avons organisé une réunion de lancement avec l'équipe technique de Qtum et avons reçu un aperçu du système et des objectifs de cette recherche.
Au cours de la période de recherche de 2 semaines, nous avons découvert 5 vulnérabilités dans le système, dont aucune n'est critique.
En conclusion, plusieurs correctifs devraient être mis en œuvre suite au rapport, mais la posture de sécurité du système est compétente.
Après examen par l'équipe Sayfer, nous certifions que tous les problèmes de sécurité mentionnés dans ce rapport ont été résolus par l'équipe Qtum.
Méthodologie des risques
Chez Sayfer, nous nous engageons à fournir à nos clients des tests d'intrusion de la plus haute qualité. C'est pourquoi nous avons mis en œuvre un modèle complet d'évaluation des risques pour évaluer la gravité de nos constatations et fournir à nos clients les meilleures recommandations possibles pour les atténuer.
Notre modèle d’évaluation des risques repose sur deux facteurs clés : IMPACT et PROBABILITÉ. L'impact fait référence au préjudice potentiel qui pourrait résulter d'un problème, tel qu'une perte financière, une atteinte à la réputation ou un système non opérationnel. La probabilité fait référence à la probabilité qu'un problème se produise, en tenant compte de facteurs tels que la complexité de l'attaque et le nombre d'attaquants potentiels.
En combinant ces deux facteurs, nous pouvons créer une compréhension globale du risque posé par un problème particulier et fournir à nos clients une évaluation claire et exploitable de la gravité du problème. Cette approche nous permet de prioriser nos recommandations et de garantir que nos clients reçoivent les meilleurs conseils possibles sur la façon de protéger leur entreprise.
Le risque est défini comme suit :

Vulnérabilités par risque
Haute – Menace directe sur les processus métier clés.
Moyenne – Menace indirecte sur les processus métier clés ou menace partielle sur les processus métier.
Low – Aucune menace directe n'existe. La vulnérabilité peut être exploitée à l'aide d'autres vulnérabilités.
D'information – Cette constatation n'indique pas de vulnérabilité, mais énonce un commentaire qui signale des défauts de conception et une mise en œuvre incorrecte qui pourraient causer un problème à long terme.
Approche
Méthodologie d'évaluation de la sécurité
Sayfer utilise OWASP WSTG comme norme technique lors de l'examen des applications Web. Après avoir acquis une compréhension approfondie du système, nous avons décidé quels tests OWASP sont nécessaires pour évaluer le système.
Évaluation de sécurité
Après avoir compris et défini la portée, effectué une modélisation des menaces et évalué les tests corrects requis afin de vérifier complètement l'application pour les failles de sécurité, nous avons effectué notre évaluation de sécurité.
Description de la table de problématique
Titre du problème
| ID | DIRE-??: Un identifiant pour communiquer facilement sur chaque vulnérabilité |
| Statut | Ouvert/Corrigé/Acquitté |
| Analyse | Représente le facteur de risque du problème. Pour une description plus détaillée, reportez-vous au Vulnérabilités par risque . |
| Impact sur les entreprises | Le principal risque de vulnérabilité au niveau de l’entreprise. |
| Lieu | L'URL ou le fichier dans lequel ce problème a été détecté. Les problèmes sans localisation n'ont pas de localisation particulière et font référence au produit dans son ensemble. |
Description
Nous fournissons ici une brève description du problème et de la manière dont il s'est formé, des étapes que nous avons suivies pour le trouver ou l'exploiter, ainsi que d'une preuve de concept (le cas échéant) et de la manière dont ce problème peut affecter le produit ou ses utilisateurs.
Mesures
Options de résolution suggérées pour ce problème et liens vers des sites conseillés pour des mesures correctives ultérieures.
Évaluation de la sécurité
Les tests suivants ont été effectués lors de l'audit du système
La collecte d'informations
| La collecte d'informations | Nom du test |
| WSTG-INFO-01 | Effectuer une reconnaissance de découverte de moteur de recherche pour les fuites d'informations |
| WSTG-INFO-02 | Serveur Web d'empreintes digitales |
| WSTG-INFO-03 | Examiner les métafichiers du serveur Web pour détecter les fuites d'informations |
| WSTG-INFO-04 | Énumérer les applications sur le serveur Web |
| WSTG-INFO-05 | Examiner le contenu de la page Web pour détecter les fuites d'informations |
| WSTG-INFO-06 | Identifier les points d'entrée de l'application |
| WSTG-INFO-07 | Mapper les chemins d'exécution via l'application |
| WSTG-INFO-08 | Cadre d'application Web d'empreintes digitales |
| WSTG-INFO-09 | Application Web d'empreintes digitales |
| WSTG-INFO-10 | Architecture des applications cartographiques |
Configuration et déploiement des tests de gestion
| Configuration et déploiement des tests de gestion | Nom du test |
| WSTG-CONF-01 | Tester la configuration de l'infrastructure réseau |
| WSTG-CONF-02 | Tester la configuration de la plate-forme d'application |
| WSTG-CONF-03 | Tester la gestion des extensions de fichiers pour les informations sensibles |
| WSTG-CONF-04 | Examiner l'ancienne sauvegarde et les fichiers non référencés pour les informations sensibles |
| WSTG-CONF-05 | Énumérer les interfaces d'administration d'infrastructure et d'application |
| WSTG-CONF-06 | Tester les méthodes HTTP |
| WSTG-CONF-07 | Tester la sécurité du transport strict HTTP |
| WSTG-CONF-08 | Tester la stratégie interdomaine RIA |
| WSTG-CONF-09 | Autorisation de fichier de test |
| WSTG-CONF-10 | Test de reprise de sous-domaine |
| WSTG-CONF-11 | Tester le stockage en nuage |
Test de gestion des identités
| Test de gestion des identités | Nom du test |
| WSTG-IDNT-01 | Définitions des rôles de test |
| WSTG-IDNT-02 | Tester le processus d'enregistrement des utilisateurs |
| WSTG-IDNT-03 | Tester le processus de provisionnement de compte |
| WSTG-IDNT-04 | Test d'énumération de compte et de compte d'utilisateur devinable |
| WSTG-IDNT-05 | Test de la politique de nom d'utilisateur faible ou non appliquée |
Test d'authentification
| Test d'authentification | Nom du test |
| WSTG-ATHN-01 | Test des informations d'identification transportées sur un canal crypté |
| WSTG-ATHN-02 | Test des informations d'identification par défaut |
| WSTG-ATHN-03 | Test de mécanisme de verrouillage faible |
| WSTG-ATHN-04 | Test de contournement du schéma d'authentification |
| WSTG-ATHN-05 | Test de mémorisation du mot de passe vulnérable |
| WSTG-ATHN-06 | Test des faiblesses du cache du navigateur |
| WSTG-ATHN-07 | Test de la politique de mot de passe faible |
| WSTG-ATHN-08 | Test de réponse à la question de sécurité faible |
| WSTG-ATHN-09 | Test des fonctionnalités de modification ou de réinitialisation de mot de passe faibles |
| WSTG-ATHN-10 | Test d'authentification plus faible dans un canal alternatif |
Test d'autorisation
| Test d'autorisation | Nom du test |
| WSTG-ATHZ-01 | Test de l'inclusion du fichier de traversée de répertoires |
| WSTG-ATHZ-02 | Test du schéma d'autorisation de contournement |
| WSTG-ATHZ-03 | Test d'élévation de privilèges |
| WSTG-ATHZ-04 | Test des références d'objet directes non sécurisées |
Test de gestion de session
| Test de gestion de session | Nom du test |
| WSTG-SESS-01 | Test du schéma de gestion de session |
| WSTG-SESS-02 | Test des attributs des cookies |
| WSTG-SESS-03 | Test de fixation de session |
| WSTG-SESS-04 | Test des variables de session exposées |
| WSTG-SESS-05 | Test de falsification de requête intersite |
| WSTG-SESS-06 | Test de la fonctionnalité de déconnexion |
| WSTG-SESS-07 | Expiration de la session de test |
| WSTG-SESS-08 | Test de Session Puzzling |
| WSTG-SESS-09 | Test de piratage de session |
Test de validation des données
| Test de validation des données | Nom du test |
| WSTG-INPV-01 | Test des scripts intersites réfléchis |
| WSTG-INPV-02 | Test des scripts intersites stockés |
| WSTG-INPV-03 | Test de falsification de verbe HTTP |
| WSTG-INPV-04 | Test de la pollution des paramètres HTTP |
| WSTG-INPV-05 | Test d'injection SQL |
| WSTG-INPV-06 | Test d'injection LDAP |
| WSTG-INPV-07 | Test d'injection XML |
| WSTG-INPV-08 | Test d'injection SSI |
| WSTG-INPV-09 | Test d'injection XPath |
| WSTG-INPV-10 | Test de l'injection SMTP IMAP |
| WSTG-INPV-11 | Test d'injection de code |
| WSTG-INPV-12 | Test d'injection de commande |
| WSTG-INPV-13 | Test d'injection de chaîne de format |
| WSTG-INPV-14 | Test de vulnérabilité incubée |
| WSTG-INPV-15 | Test de contrebande de fractionnement HTTP |
| WSTG-INPV-16 | Test des requêtes entrantes HTTP |
| WSTG-INPV-17 | Test de l'injection d'en-tête d'hôte |
| WSTG-INPV-18 | Test d'injection de modèle côté serveur |
| WSTG-INPV-19 | Test de falsification de requête côté serveur |
Gestion des erreurs
| Gestion des erreurs | Nom du test |
| WSTG-ERRH-01 | Test de la gestion incorrecte des erreurs |
| WSTG-ERRH-02 | Test des traces de pile |
Cryptographie
| Cryptographie | Nom du test |
| WSTG-CRYP-01 | Test de sécurité de la couche de transport faible |
| WSTG-CRYP-02 | Test de rembourrage Oracle |
| WSTG-CRYP-03 | Test des informations sensibles envoyées via des canaux non cryptés |
| WSTG-CRYP-04 | Test de chiffrement faible |
Test de la logique métier
| Test de la logique métier | Nom du test |
| WSTG-BUSL-01 | Tester la validation des données de la logique métier |
| WSTG-BUSL-02 | Tester la capacité à falsifier des requêtes |
| WSTG-BUSL-03 | Vérifications de l'intégrité des tests |
| WSTG-BUSL-04 | Tester la synchronisation du processus |
| WSTG-BUSL-05 | Tester le nombre de fois qu'une fonction peut être utilisée Limites |
| WSTG-BUSL-06 | Tests de contournement des flux de travail |
| WSTG-BUSL-07 | Tester les défenses contre l'utilisation abusive des applications |
| WSTG-BUSL-08 | Tester le téléchargement de types de fichiers inattendus |
| WSTG-BUSL-09 | Tester le téléchargement de fichiers malveillants |
Test côté client
| Test côté client | Nom du test |
| WSTG-CLNT-01 | Test des scripts intersites basés sur DOM |
| WSTG-CLNT-02 | Tester l'exécution de JavaScript |
| WSTG-CLNT-03 | Test d'injection HTML |
| WSTG-CLNT-04 | Test de la redirection d'URL côté client |
| WSTG-CLNT-05 | Test d'injection CSS |
| WSTG-CLNT-06 | Test de la manipulation des ressources côté client |
| WSTG-CLNT-07 | Tester le partage des ressources entre les origines |
| WSTG-CLNT-08 | Test du clignotement intersite |
| WSTG-CLNT-09 | Tester le détournement de clic |
| WSTG-CLNT-10 | Tester les WebSockets |
| WSTG-CLNT-11 | Tester la messagerie Web |
| WSTG-CLNT-12 | Test du stockage du navigateur |
| WSTG-CLNT-13 | Test d'inclusion de scripts intersites |
Test d'API
| Test d'API | Nom du test |
| WSTG-APIT-01 | Tester GraphQL |
Commandez l'audit de Sayfer
Résultats de l'évaluation de la sécurité
Aucune méthode pour supprimer les réseaux ajoutés
| ID | DIRE-01 |
| Statut | Parfaitement fixé |
| Analyse | Low |
| Impact sur les entreprises | Il n'est pas possible de supprimer les réseaux individuels ajoutés à partir du snap. |
| Lieu | – packages/snap/src/helpers.ts:105 |
Description
Le code implémente la possibilité d'ajouter des réseaux supplémentaires, étendant leur liste au-delà de celle par défaut. Cependant, il a été noté qu'il n'existe aucun moyen de les supprimer sauf en réinstallant le composant logiciel enfichable. Cette fonctionnalité était probablement prévue, car il existe une fonction removeNetwork(), mais il n'est pas possible de l'appeler à partir de méthodes accessibles au public.
export const networks = {
get: getNetworks,
setCurrent: setCurrentNetwork,
add: addNetwork,
remove: removeNetwork,
};
Mesures
Nous recommandons de mettre en œuvre cette méthode, comme cela était probablement prévu.
Invite de confirmation manquante pour l'exportation de clés privées
| ID | DIRE-02 |
| Statut | Parfaitement fixé |
| Analyse | Low |
| Impact sur les entreprises | Risque de fuite de la clé privée lorsqu'elle est affichée par erreur sur un écran, par exemple dans un lieu public. |
| Lieu | – packages/snap/src/index.ts:145 |
Description
Dans les fonctions les plus critiques du snap, une boîte de dialogue, qui informe l'utilisateur de l'action en cours et demande son approbation, s'affiche.
Cependant, cette mesure de sécurité n'est pas présente dans la méthode WalletExportPrivateKey, celle utilisée pour afficher la clé privée sur l'écran snap. S'il est invoqué par erreur, il affichera immédiatement la clé privée.
Mesures
Avant d'afficher la clé privée, ajoutez une invite de confirmation demandant l'approbation de l'utilisateur.
Plusieurs méthodes non implémentées
| ID | DIRE-03 |
| Statut | Parfaitement fixé |
| Analyse | Low |
| Impact sur les entreprises | Il existe un risque que certaines des méthodes non mises en œuvre soient importantes pour la fonctionnalité du snap et soient accidentellement négligées. |
| Lieu | – packages/snap/src/index.ts :163, 169, 260, 266, 272, 278, 284, 290, 296, 302, 308, 314, 320, 326, 472, 509, 541, 568, 574, 580 , 586, 592, 609, 615, 637, 643, 649, 655, 696, 735, 741, 747, 753, 759, 765, 771, 777, 783 |
Description
Une grande partie des méthodes présentes dans le snap semblent rester inutilisées. Seul le passe-partout qui les entoure existe, mais aucune logique concrète.
Mesures
Nous vous recommandons de revoir les méthodes que vous souhaitez implémenter dans votre snap et de vous assurer qu'elles contiennent toutes une logique réelle. Il ne doit pas être possible pour l'utilisateur d'appeler des méthodes inutiles que vous n'avez pas l'intention d'implémenter.
Code redondant
| ID | DIRE-04 |
| Statut | Parfaitement fixé |
| Analyse | D'information |
| Impact sur les entreprises | Les méthodes qui font la même chose et renvoient les mêmes données augmentent inutilement la taille de la base de code du snap. |
| Lieu | – packages/snap/src/index.ts:332, 338 |
Description
Au cours de notre analyse, nous avons remarqué que deux méthodes RPC, EthRequestAccounts et EthAccounts, semblent faire la même chose et renvoyer les mêmes valeurs.
case RPCMethods.EthRequestAccounts: {
const wallet = await getWallet();
return [wallet.address];
}
case RPCMethods.EthAccounts: {
console.log('RPCMethods.EthAccounts');
console.log('request.params', JSON.stringify(request.params));
const wallet = await getWallet();
return [wallet.address];
}
Dans les deux cas, ces méthodes récupèrent les données du portefeuille actif en utilisant getWallet() puis renvoient son adresse. Actuellement, la seule différence est qu'EthAccounts enregistre, contrairement à EthRequestAccounts.
Mesures
Envisagez soit de supprimer l'une des méthodes, soit d'en modifier une pour la différencier de l'autre.
Commentaires TODO restants
| ID | DIRE-05 |
| Statut | Parfaitement fixé |
| Analyse | D'information |
| Impact sur les entreprises | Les commentaires TODO et les sections de code commentées peuvent fournir aux attaquants potentiels des informations précieuses, en plus de paraître peu professionnels. |
| Lieu | – packages/snap/src/index.ts:460, 550 – packages/snap/src/polyfill.ts:7 – packages/snap/src/helpers/parsers/tx.ts:55 |
Description
La base de code contient plusieurs commentaires TODO ainsi que des sections de code commenté qui ne sont plus utilisées.
Bien que cela soit acceptable dans un environnement de test, cela devrait être éliminé en production. De tels commentaires peuvent fournir à une partie prenante potentielle des informations précieuses sur les fonctionnalités manquantes, les mesures de sécurité et les réflexions des développeurs, qui peuvent être utilisées pour profiler les attaques.
Mesures
Nous vous suggérons de supprimer les commentaires marqués comme TODO et les fragments de code inutilisés dans votre branche de production.




