Rapport d'audit de contrat intelligent pour Dimo

Résumé de gestion

Dimo a contacté Sayfer pour réaliser un audit de sécurité sur leur contrat intelligent.

Ce rapport documente les recherches effectuées par Sayfer ciblant les ressources sélectionnées définies dans le cadre de la recherche. En particulier, ce rapport affiche l'examen de la posture de sécurité du contrat intelligent de Dimo.

Au cours d'une période de recherche de 40 heures, nous avons découvert 14 vulnérabilités dans le contrat. Aucun d’eux 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 Dimo.

Méthodologie des risques

Chez Sayfer, nous nous engageons à fournir à nos clients des audits de contrats intelligents 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 ainsi que 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é du contrat 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 leurs contrats intelligents.

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.
Faible – 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.

Gravité
# de problèmes
Haute
3
Moyenne
1
Faible
5
D'information
5
Critical
0

Approche

Introduction

Dimo a contacté Sayfer pour réaliser un audit de sécurité sur leur contrat intelligent.

Ce rapport documente les recherches effectuées par Sayfer ciblant les ressources sélectionnées définies dans le cadre de la recherche. En particulier, ce rapport affiche l'examen de la posture de sécurité pour les contrats susmentionnés.

Aperçu de la portée

En collaboration avec l'équipe du client, nous avons défini le contrat suivant comme la portée du projet.
Commit hash: 14ce58aa499e3672fb0b61da13948a6ea51fb879

 

Contract Sha-256
Récompense.sol 86cffc0108ebe977ac55650da60cccc5f790013332186a2cb4dab47d7d38ac87

 

Nos tests ont été réalisés en janvier 2024.

Qu'il ne soit pas trop tard !

Commencez votre audit avec Sayfer

Validation de la portée

Nous avons commencé par nous assurer que le périmètre qui nous était défini par le client était techniquement logique.
Décider quelle portée convient à un système donné fait partie de la discussion initiale.

Modèle de menace

Nous avons défini que la plus grande menace actuelle pour le système est la capacité d'utilisateurs malveillants à voler les fonds du contrat.

Qu'il ne soit pas trop tard !

Commencez votre audit avec Sayfer

Présentation du protocole

Présentation du protocole

DIMO est une société Web3 IoT qui permet aux utilisateurs et aux développeurs d'exploiter le riche flux de données généré par les véhicules modernes. Sa solution est un écosystème appartenant aux utilisateurs qui permet aux conducteurs de tirer des avantages économiques de leurs données et de créer des applications telles que l'assurance paramétrique, le partage de voiture peer-to-peer et les marchés de véhicules. La plate-forme décentralisée offre également aux développeurs une tranquillité d'esprit, sachant que leur accès aux données n'est pas soumis aux caprices d'un contrôleur d'accès centralisé. Cette solution est construite sur Polygon.

Évaluation de la sécurité

Les cas de test suivants ont été la ligne directrice lors de l'audit du système. Cette liste de contrôle est une version modifiée de la SCSVS v1.2, avec une grammaire améliorée, de la clarté, de la concision et des critères supplémentaires. Lorsqu'il y a une lacune dans la numérotation, un critère initial a été supprimé. Les critères marqués d'un astérisque ont été ajoutés par nos soins.

Architecture, conception et modélisation des menaces

Architecture, conception et modélisation des menaces Nom du test
G1.2 Chaque modification de conception introduite est précédée d'une modélisation des menaces.
G1.3 La documentation définit clairement et précisément toutes les frontières de confiance dans le contrat (relations de confiance avec les autres contrats et flux de données importants).
G1.4 Le SCSVS, les exigences ou la politique de sécurité sont disponibles pour tous les développeurs et testeurs.
G1.5 Les événements pour les opérations (changement d'état/cruciales pour l'entreprise) sont définis.
G1.6 Le projet inclut un mécanisme qui peut stopper temporairement les fonctionnalités sensibles en cas d'attaque. Ce mécanisme ne doit pas bloquer l'accès des utilisateurs à leurs actifs (par exemple, les jetons).
G1.7 La quantité de crypto-monnaies non utilisées conservées sur le contrat est contrôlée et au niveau minimum acceptable afin de ne pas devenir une cible potentielle d'attaque.
G1.8 Si la fonction de secours peut être appelée par n'importe qui, elle est incluse dans le modèle de menace.
G1.9 La logique métier est cohérente. Des changements importants dans la logique doivent être appliqués dans tous les contrats.
G1.10 Des outils d'analyse de code automatique sont utilisés pour détecter les vulnérabilités.
G1.11 La dernière version majeure de Solidity est utilisée.
G1.12 Lors de l'utilisation d'une implémentation externe d'un contrat, la version la plus récente est utilisée.
G1.13 Lorsque les fonctions sont remplacées pour étendre les fonctionnalités, le mot-clé super est utilisé pour conserver les fonctionnalités précédentes.
G1.14 L'ordre d'héritage est soigneusement spécifié.
G1.15 Il existe un composant qui surveille l'activité du contrat à l'aide d'événements.
G1.16 Le modèle de menace inclut les transactions de baleines.
G1.17 La fuite d'une clé privée ne compromet pas la sécurité de l'ensemble du projet.

Les politiques et les procédures

Les politiques et les procédures Nom du test
G2.2 La sécurité du système fait l'objet d'une surveillance constante (par exemple, le niveau de financement attendu).
G2.3 Il existe une politique pour suivre les nouvelles vulnérabilités de sécurité et mettre à jour les bibliothèques vers la dernière version sécurisée.
G2.4 Le service de sécurité peut être contacté publiquement et que la procédure de traitement des bogues signalés (par exemple, une prime de bogue approfondie) est bien définie.
G2.5 Le processus d'ajout de nouveaux composants au système est bien défini.
G2.6 Le processus de modifications majeures du système implique la modélisation des menaces par une société externe.
G2.7 Le processus d'ajout et de mise à jour des composants du système comprend un audit de sécurité par une société externe.
G2.8 En cas de piratage, une procédure d'atténuation claire et bien connue est en place.
G2.9 La procédure en cas de piratage définit clairement quelles personnes doivent exécuter les actions requises.
G2.10 La procédure consiste à alerter d'autres projets sur le piratage via des canaux de confiance.
G2.11 Une procédure d'atténuation des fuites de clé privée est définie.

Évolutivité

Évolutivité Nom du test
G3.2 Avant la mise à jour, une émulation est faite dans un fork du réseau principal et tout fonctionne comme prévu sur la copie locale.
G3.3 Le processus de mise à niveau est exécuté par un contrat multisig où plus d'une personne doit approuver l'opération.
G3.4 Les timelocks sont utilisés pour les opérations importantes afin que les utilisateurs aient le temps d'observer les changements à venir (veuillez noter que la suppression des vulnérabilités potentielles dans ce cas peut être plus difficile).
G3.5 initialiser() ne peut être appelé qu'une seule fois.
G3.6 initialiser() ne peut être appelé que par un rôle autorisé via des modificateurs appropriés (par exemple initialiseur, seul propriétaire).
G3.7 Le processus de mise à jour est effectué en une seule transaction afin que personne ne puisse l'exécuter en amont.
G3.8 Les contrats évolutifs ont réservé un espace sur les créneaux horaires pour éviter l'écrasement.
G3.9 Le nombre d'emplacements réservés (en tant qu'écart) a été réduit de manière appropriée si de nouvelles variables ont été ajoutées.
G3.10 Il n'y a aucun changement dans l'ordre dans lequel les variables d'état du contrat sont déclarées, ni leurs types.
G3.11 Les nouvelles valeurs renvoyées par les fonctions sont les mêmes que dans les versions précédentes du contrat (par exemple propriétaire(), balanceOf(adresse)).
G3.12 L'implémentation est initialisée.
G3.13 L'implémentation ne peut pas être détruite.

 

Logique métier

Logique métier Nom du test
G4.2 La mise en œuvre de la logique du contrat et des paramètres du protocole correspond à la documentation.
G4.3 La logique métier procède dans un ordre d'étape séquentiel et il n'est pas possible de sauter des étapes ou de le faire dans un ordre différent de celui conçu.
G4.4 Le contrat a correctement appliqué les limites commerciales.
G4.5 La logique métier ne repose pas sur les valeurs récupérées à partir de contrats non approuvés (en particulier lorsqu'il y a plusieurs appels au même contrat dans un seul flux).
G4.6 La logique métier ne repose pas sur le solde du contrat (par exemple, solde == 0).
G4.7 Les opérations sensibles ne dépendent pas des données de bloc (par exemple, bloc de hachage, horodatage).
G4.8 Le contrat utilise des mécanismes qui atténuent les attaques de commande de transaction (front-running) (par exemple, les schémas de pré-engagement).
G4.9 Le contrat n'envoie pas de fonds automatiquement, mais permet aux utilisateurs de retirer des fonds dans des transactions distinctes à la place.

Contrôle d'accès

Contrôle d'accès Nom du test
G5.2 Le principe du moindre privilège est respecté. Les autres contrats ne devraient pouvoir accéder qu'aux fonctions et données pour lesquelles ils disposent d'une autorisation spécifique.
G5.3 Les nouveaux contrats ayant accès au contrat audité respectent le principe des droits minimaux par défaut. Les contrats doivent avoir un minimum ou aucune autorisation jusqu'à ce que l'accès aux nouvelles fonctionnalités soit explicitement accordé.
G5.4 Le créateur du contrat respecte le principe du moindre privilège et ses droits suivent strictement ceux décrits dans la documentation.
G5.5 Le contrat applique les règles de contrôle d'accès spécifiées dans un contrat de confiance, en particulier si le contrôle d'accès côté client dApp est présent et peut être contourné.
G5.6 Les appels à des contrats externes ne sont autorisés qu'en cas de nécessité.
G5.7 Le code modificateur est clair et simple. La logique ne doit pas contenir d'appels externes à des contrats non approuvés.
G5.8 Tous les attributs d'utilisateur et de données utilisés par les contrôles d'accès sont conservés dans des contrats de confiance et ne peuvent pas être manipulés par d'autres contrats, sauf autorisation spécifique.
G5.9 Les contrôles d'accès échouent en toute sécurité, y compris lorsqu'un retour se produit.
G5.10 Si l'entrée (paramètres de la fonction) est validée, l'approche de validation positive (liste blanche) est utilisée dans la mesure du possible.

Communication

Communication Nom du test
G6.2 Les bibliothèques qui ne font pas partie de l'application (mais dont le contrat intelligent dépend pour fonctionner) sont identifiées.
G6.3 L'appel délégué n'est pas utilisé avec les contrats non approuvés.
G6.4 Les contrats de tiers n'occultent pas les fonctions spéciales (par exemple, revenir).
G6.5 Le contrat ne vérifie pas si l'adresse est un contrat utilisant l'opcode extcodesize.
G6.6 Les attaques de réentrance sont atténuées en bloquant les appels récursifs provenant d'autres contrats et en suivant le modèle Check-Effects-Interactions. N'utilisez pas la fonction d'envoi sauf si c'est indispensable.
G6.7 Le résultat d'appels de fonction de bas niveau (par exemple envoyer, déléguer appeler, appeler) d'autres contrats est cochée.
G6.8 Le contrat repose sur les données fournies par le bon expéditeur et non sur la valeur tx.origin.

Arithmétique

Arithmétique Nom du test
G7.2 Les valeurs et les opérations mathématiques résistent aux débordements d'entiers. Utilisez la bibliothèque SafeMath pour les opérations arithmétiques avant Solidity 0.8.*.
G7.3 Les extraits de code non cochés de Solidity ≥ 0.8.* n'introduisent pas de sous/débordements entiers.
G7.4 Les valeurs extrêmes (par exemple, les valeurs maximales et minimales du type de variable) sont prises en compte et ne modifient pas le flux logique du contrat
G7.5 L'inégalité non stricte est utilisée pour l'égalité d'équilibre.
G7.6 Les ordres de grandeur corrects sont utilisés dans les calculs.
G7.7 Dans les calculs, la multiplication est effectuée avant la division pour plus de précision.
G7.8 Le contrat ne suppose pas une précision en virgule fixe et utilise un multiplicateur ou stocke à la fois le numérateur et le dénominateur.

Déni de service

Déni de service Nom du test
G8.2 Le contrat n'itère pas sur des boucles non liées.
G8.3 La fonctionnalité d'autodestruction n'est utilisée que si nécessaire. S'il est inclus dans le contrat, il doit être clairement décrit dans la documentation.
G8.4 La logique métier n'est pas bloquée si un acteur (par exemple contrat, compte, oracle) est absent.
G8.5 La logique métier ne décourage pas les utilisateurs d'utiliser des contrats (par exemple, le coût de la transaction est supérieur au profit).
G8.6 Les expressions de fonctions assert ou require ont une variante passante.
G8.7 Si la fonction de secours ne peut être appelée par personne, elle ne bloque pas les fonctionnalités du contrat.
G8.8 Il n'y a pas d'opérations coûteuses en boucle.
G8.9 Il n'y a pas d'appels à des contrats non approuvés dans une boucle.
G8.10 S'il existe une possibilité de suspendre l'exécution du contrat, il est également possible de le reprendre.
G8.11 Si des listes blanches et des listes noires sont utilisées, elles n'interfèrent pas avec le fonctionnement normal du système.
G8.12 Il n'y a pas de DoS causé par les débordements et les débordements.

Données de la chaîne de blocs

Données de la chaîne de blocs Nom du test
G9.2 Toutes les données enregistrées dans les contrats ne sont pas considérées comme sécurisées ou privées (même les variables privées).
G9.3 Aucune donnée confidentielle n'est stockée dans la blockchain (mots de passe, données personnelles, token etc.).
G9.4 Les contrats n'utilisent pas de littéraux de chaîne comme clés pour les mappages. Les constantes globales sont utilisées à la place pour empêcher l'attaque homoglyphe.
G9.5 Le contrat ne génère pas trivialement des nombres pseudo-aléatoires basés sur les informations de la blockchain (par exemple, l'ensemencement avec le numéro de bloc).

Utilisation du gaz et limites

Utilisation du gaz et limites Nom du test
G10.1 L'utilisation du gaz est anticipée, définie et a des limites claires qui ne peuvent pas être dépassées. La structure du code et les entrées malveillantes ne doivent pas provoquer d'épuisement des gaz.
G10.2 L'exécution et la fonctionnalité des fonctions ne dépendent pas des frais de gaz codés en dur (ils sont susceptibles de varier).

Clarté et lisibilité

Clarté et lisibilité Nom du test
G11.2 La logique est claire et modularisée en plusieurs contrats et fonctions simples.
G11.3 Chaque contrat comporte un court commentaire de 1 à 2 phrases qui explique son objectif et sa fonctionnalité.
G11.4 Des implémentations prêtes à l'emploi sont utilisées, cela est clairement indiqué dans les commentaires. Si ces implémentations ont été modifiées, les modifications sont notées tout au long du contrat.
G11.5 L'ordre d'héritage est pris en compte dans les contrats qui utilisent plusieurs fonctions d'héritage et de duplication.
G11.6 Dans la mesure du possible, les contrats utilisent du code testé existant (par exemple, des contrats de jeton ou des mécanismes tels que propriétaire) au lieu d'implémenter les leurs.
G11.7 Des modèles de dénomination cohérents sont suivis tout au long du projet.
G11.8 Les variables ont des noms distinctifs.
G11.9 Toutes les variables de stockage sont initialisées.
G11.10 Les fonctions avec le type de retour spécifié renvoient une valeur de ce type.
G11.11 Toutes les fonctions et variables sont utilisées.
G11.12 exigent est utilisé au lieu de revenir in if Déclarations.
G11.13 La affirmer La fonction est utilisée pour tester les erreurs internes et le exigent La fonction est utilisée pour garantir une condition valide dans les entrées des utilisateurs et des contrats externes.
G11.14 Le code d'assemblage n'est utilisé que si nécessaire.

Couverture de test

Couverture de test Nom du test
G12.2 Les récits d'abus détaillés dans le modèle de menace sont couverts par des tests unitaires
G12.3 Les fonctions sensibles dans les contrats vérifiés sont couvertes par des tests en phase de développement.
G12.4 La mise en œuvre des contrats vérifiés a été vérifiée pour les vulnérabilités de sécurité à l'aide d'analyses statiques et dynamiques.
G12.5 La spécification du contrat a été formellement vérifiée
G12.6 La spécification et les résultats de la vérification formelle sont inclus dans la documentation.

Finance décentralisée

Finance décentralisée Nom du test
G13.1 Le contrat du prêteur ne suppose pas que son solde (utilisé pour confirmer le remboursement du prêt) soit modifié uniquement avec ses propres fonctions.
G13.2 Les fonctions qui modifient le solde des prêteurs et/ou prêtent de la crypto-monnaie sont non réentrantes si le contrat intelligent permet d'emprunter la crypto-monnaie de la plateforme principale (par exemple Ethereum). Il bloque les attaques qui mettent à jour le solde de l'emprunteur lors de l'exécution du prêt flash.
G13.3 Les fonctions de prêt Flash ne peuvent appeler que des fonctions prédéfinies sur le contrat de réception. Si cela est possible, définissez un sous-ensemble de contrats de confiance à appeler. Habituellement, le contrat d'envoi (d'emprunt) est celui à rappeler.
G13.4 Si cela inclut des opérations potentiellement dangereuses (par exemple, renvoyer plus d'ETH/tokens qu'emprunté), la fonction du destinataire qui gère les ETH ou les tokens empruntés ne peut être appelée que par le pool et dans le cadre d'un processus initié par le propriétaire du contrat destinataire ou une autre source de confiance (par exemple multisig).
G13.5 Les calculs de la part du pool de liquidités sont effectués avec la plus grande précision possible (par exemple, si la contribution est calculée pour ETH, elle doit être effectuée avec une précision de 18 chiffres - pour Wei, pas Ether). Le dividende doit être multiplié par 10 à la puissance du nombre de chiffres décimaux (par exemple dividende * 10^18 / diviseur).
G13.6 Les récompenses ne peuvent pas être calculées et distribuées dans le même appel de fonction qui dépose des jetons (il doit également être défini comme non réentrant). Cela protège des fluctuations momentanées des actions.
G13.7 Les contrats de gouvernance sont protégés contre les attaques de prêts flash. Une technique d'atténuation possible consiste à exiger que le processus de dépôt de jetons de gouvernance et de proposition d'un changement soit exécuté dans différentes transactions incluses dans différents blocs.
G13.8 Lors de l'utilisation d'oracles en chaîne, les contrats peuvent suspendre les opérations en fonction du résultat des oracles (en cas d'oracle compromis).
G13.9 Les contrats externes (même ceux de confiance) qui sont autorisés à modifier les attributs d'un contrat de projet (par exemple, le prix du jeton) ont les limitations suivantes mises en œuvre : des seuils pour le changement (par exemple, pas plus/moins de 5 %) et une limite de mises à jour (par exemple une mise à jour par jour).
G13.10 Les attributs de contrat pouvant être mis à jour par les contrats externes (même ceux de confiance) sont surveillés (par exemple à l'aide d'événements) et une procédure de réponse aux incidents est mise en place (par exemple lors d'une attaque en cours).
G13.11 Les opérations mathématiques complexes qui consistent à la fois en opérations de multiplication et de division effectuent d'abord des multiplications, puis des divisions.
G13.12 Lors du calcul des prix d'échange (par exemple ETH à jeton ou vice versa), le numérateur et le dénominateur sont multipliés par les réserves (voir le getInputPrice fonction de l' UniswapExchange Contrat).

 

Commandez l'audit de Sayfer





    Ce site est protégé par reCAPTCHA et Google Données privées ainsi que Conditions d'utilisation s'appliquent.

    Constatations des audits

    [H] Changer l'heure de Genesis peut potentiellement perturber la distribution des récompenses

    ID DIRE-01
    Statut Fixé
    Analyse Haute
    La Brochure Impact rewardsGenesisTime est une variable critique qui suit l'heure à laquelle les récompenses ont commencé et régit ainsi la distribution des récompenses.

    Le taux de récompense continue de diminuer au fil du temps, pour atteindre 85 % du cycle précédent à un moment donné dans le futur. Par conséquent, réinitialiser le temps de genèse après le début de la distribution des récompenses peut perturber l’ensemble du système.

    Localisation – Récompense.sol; réinitialiserRewardsGenesisTime()
    – Récompense.sol; manuellementSetRewardsGenesisTime (uint256)

    Description

    Changer rewardsGenesisTime plus tard dans le cycle, cela aura un impact sur les variables cruciales currentWeek et weekLimit et pourrait potentiellement gâcher l'ensemble du système de distribution des récompenses et son calendrier prévu.

    Atténuation

    Une atténuation possible consiste à réviser ces fonctions de telle sorte que la réinitialisation du temps de genèse ne soit possible qu'avant le début de la distribution des récompenses :

     function resetRewardsGenesisTime() external onlyRole(ADMIN_ROLE) {
            require(dimoTotalSentOutByContract==0,"Reward Distribution already started");
            rewardsGenesisTime = block.timestamp;
      }

    Si la réinitialisation ou la modification de la variable après coup est nécessaire, elle peut peut-être être gérée de manière contrôlée et prévisible en chaîne, plutôt que de permettre un contrôle arbitraire aux administrateurs.

     

    [H] Retrait de l'administrateur non vérifié

    ID DIRE-02
    Statut Fixé
    Analyse Haute
    Impact sur les entreprises Bien que les comptes d'administrateur bénéficient par définition d'une certaine mesure de confiance, s'ils sont compromis, ils peuvent être utilisés pour vider le contrat de ses fonds en utilisant cette fonction.
    Localisation – Récompense.sol; adminWithdraw (adresse, uint256)

    Description

    La fonction adminWithdraw(address, uint256) permet aux administrateurs d'envoyer des fonds de contrat aux utilisateurs sans limitation. Selon la documentation, ceci est utilisé si les utilisateurs envoient DIMO au contrat sans mise. Cependant, nous pensons que cette fonction peut être sujette à des abus, comme expliqué dans la section sur l'impact commercial.

    Atténuation

    Une façon envisageable d'augmenter la sécurité consiste à soumettre une demande au nom d'un utilisateur, peut-être en utilisant un compte avec le rôle Oracle. Un administrateur doit ensuite approuver la transaction. Cela nécessite au moins deux comptes pour approuver de telles transactions, offrant ainsi un autre niveau de sécurité.

     

    [H] Les administrateurs peuvent réinitialiser le registre à volonté

    ID DIRE-03
    Statut Reconnu
    Analyse Haute
    Impact sur les entreprises Le registre est l'endroit où les données utilisateur sont stockées et les validations sont effectuées. Si le registre est réinitialisé, les utilisateurs existants cesseront de recevoir des récompenses à moins que les données ne soient migrées vers le nouveau registre.
    Localisation – Récompense.sol; setRegistryContractAddress (adresse)

    Description

    setRegistryContractAddress(address) permet aux administrateurs de réinitialiser l'adresse du registre à volonté.

    Atténuation

    Une solution consiste à s'assurer que cette fonction est rétablie à moins que le registre ne soit pas défini en premier lieu.

      function setRegistryContractAddress(
        address registryContractAddress
      ) external onlyRole(ADMIN_ROLE) {
        require(
            registryContractAddress != address(0),
            "registryContractAddress is an invalid zero address"
        );
        require(address(registry)==address(0)),"already set, cannot be set again")
        registry = IRegistry(registryContractAddress);
      }

    Une autre solution consiste à mettre en place une procédure de migration des données. Si une telle procédure est déjà en place, cette découverte peut alors être ignorée en toute sécurité.

     

    [I] Le déployeur a à la fois des rôles d'administrateur et d'Oracle

    ID DIRE-04
    Statut Reconnu
    Analyse D'information
    Impact sur les entreprises Nous avons décidé de qualifier ce résultat d’informatif car il s’agit principalement d’un corollaire aux principales préoccupations de centralisation détaillées ci-dessus. Avec la manière actuelle dont le système est construit, il est nécessaire que quelqu'un attribue et gère les rôles Oracle et Administrateur. Cependant, il n’est pas nécessaire que ce compte assume lui-même ces rôles.
    Localisation – Récompense.sol : 108-111 ; initialiser(adresse, adresse, adresse)

    Description

    Lors de l'initialisation, le déployeur reçoit les rôles d'administrateur, d'administrateur par défaut et d'oracle :

    _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    
    _setupRole(ORACLE_ROLE, msg.sender);
    _setupRole(ADMIN_ROLE, msg.sender);

    Atténuation

    Envisagez de donner uniquement le rôle d'administrateur par défaut, hérité des OA AccessControlUpgradeable, au déployeur, lui permettant de gérer les rôles des autres utilisateurs.

     

    [M] Utiliser AccessControlDefaultAdminRulesUpgradeable

    ID DIRE-05
    Statut Reconnu
    Analyse Moyenne
    Impact sur les entreprises Compte tenu de la centralisation inhérente du contrat et de l’importance des rôles administratifs (et donc de leur gestion), nous avons décidé de qualifier ce constat de risque moyen.
    Localisation -

    Description

    Reward.sol utilise actuellement AccessControlUpgradable pour accorder et gérer l'accès aux fonctions critiques. Dans le système de contrôle d'accès d'OZ, le compte possédant DEFAULT_ADMIN_ROLE est capable d'accorder et de retirer tous les autres rôles. En l'état actuel du contrat, il est remis au déployeur lors de l'initialisation.

    AccessControlDefaultAdminRulesUpgradeable S'étend AccessControlUpgradable avec deux fonctionnalités de sécurité cruciales :

    • Un seul compte peut détenir DEFAULT_ADMIN_ROLE.
    • DEFAULT_ADMIN_ROLE ne peut être transféré qu’en deux étapes. Un délai paramétrable entre les deux étapes, changeDefaultAdminDelay, est appliqué.

    Atténuation

    Passer de AccessControlUpgradable à AccessControlDefaultAdminRulesUpgradeable.

     

    [L] Validation d'entrée insuffisante dans manualSetRewardsGenesisTime (uint256)

    ID DIRE-06
    Statut Fixé
    Analyse Faible
    Impact sur les entreprises Nous considérons ce problème comme faible, car une valeur erronée pourrait être rectifiée par l'administrateur aussi facilement qu'elle a été donnée.
    Localisation – Récompense.sol; manuellementSetRewardsGenesisTime (uint256)

    Description

    En plus de poser un risque de centralisation, comme détaillé ci-dessus, manuallySetRewardsGenesisTime(uint256) ne parvient pas non plus à valider l'horodatage donné par l'administrateur. Il accepterait volontiers une date future, conduisant à _getNumberOfWeeksSinceGenesis() revenir:

      function _getNumberOfWeeksSinceGenesis()
        private
        view
        returns (uint256 unixTimeDiff)
      {
        unixTimeDiff = (block.timestamp - rewardsGenesisTime) / 7 days;
      }

    Atténuation

    Assurez-vous que l'entrée est égale ou inférieure à l'horodatage actuel.

     

    [L] Validation d'entrée insuffisante dans setMinimumTimeForRewards (uint256)

    ID DIRE-07
    Statut Fixé
    Analyse Faible
    Impact sur les entreprises Tout comme le résultat ci-dessus, nous avons décidé de considérer ce résultat comme étant à faible risque car il peut facilement être rectifié en appelant à nouveau la fonction.
    Localisation – Récompense.sol; setMinimumTimeForRewards(uint256)

    Description

    Cette constatation est très similaire en substance à celle qui se trouve juste au-dessus. Une valeur trop élevée empêchera les utilisateurs de réclamer leurs récompenses. Ceci, en tandem avec le fait que les récompenses sont diminuées sur une base hebdomadaire de _limitForWeek(uint256), neutralisera l’avantage conféré par une adoption précoce.

    Atténuation

    Définir une plage de valeurs acceptable pour minimumTimeForRewards et appliquez-le via la fonction. En raison de l’influence directe de cette valeur sur l’ensemble de la structure de récompense de la plateforme, il est primordial de la gérer avec soin.

     

    [L] Erreur inutilisée

    ID DIRE-08
    Statut Fixé
    Analyse Faible
    Impact sur les entreprises Nous avons décidé de noter ce problème comme étant faible plutôt qu'informatif. Cette omission apparemment accidentelle a un certain impact sur la logique du contrat.
    Localisation – Récompense.sol : 12

    Description

    L'erreur InvalidArrayLegnth() est déclaré à la ligne 12, mais jamais utilisé.

    Atténuation

    Nous émettons l'hypothèse que cette erreur était censée être générée batchTransfer(TransferInfo[]) si le tableau fourni ne comporte pas huit membres :

    if(transferInfos.length != 8) revert InvalidArrayLength();

     

    [L] Valeur de retour non cochée

    ID DIRE-09
    Statut Fixé
    Analyse Faible
    Impact sur les entreprises La fonction de transfert des jetons ERC20 renvoie le succès ou l'échec du transfert sous forme booléenne. Il est considéré comme une bonne pratique de vérifier cette valeur et de ne continuer qu'en cas de succès. Cependant, comme la documentation implique que batchTransfer(TransferInfo[]) n'est utilisé que pour transférer des jetons Dimo, nous considérons ce résultat comme faible.
    Localisation – Récompense.sol : 232 ; transfert par lots(TransferInfo[])

    Description

    Sur la ligne indiquée, un transfert dimoToken est effectué, mais la valeur de retour n'est pas cochée.

    Atténuation

    Revenir avec une erreur si le transfert échoue :

    if (!dimoToken.transfer(user, amount)) revert TokenTransferFailed();

     

    [L] Appel API obsolète

    ID DIRE-10
    Statut Reconnu
    Analyse Faible
    Impact sur les entreprises Contrairement à grantRole(bytes32, address), _setupRole(bytes32, address) n'effectue aucune vérification sur le compte appelant. Il est donc obsolète.
    Localisation – Récompense.sol : 108-111 ; initialiser(adresse, adresse, adresse)

    Description

    La fonction _setupRole(bytes32, address), utilisé à l'emplacement spécifié, est obsolète dans OpenZepplin 5.0. Appel grantRole(bytes32, address) à la place est maintenant recommandé.

    Atténuation

    Remplacer les appels à _setupRole(bytes32, address) comprenant grantRole(bytes32, address).

     

    [I] Émission d'événement insuffisante

    ID DIRE-11
    Statut Fixé
    Analyse D'information
    Impact sur les entreprises De nombreux outils de surveillance, frontends, outils hors chaîne et services de reporting s'appuient sur des événements pour capturer les activités en temps réel des contrats. De plus, les protocoles peuvent réagir rapidement aux émissions d’événements suspects.
    Localisation – Récompense.sol; setRegistryContractAddress (adresse)
    – Récompense.sol; setMinimumTimeForRewards(uint256)
    – Récompense.sol; setSyntheticProxyAddress (adresse)
    – Récompense.sol; réinitialiserRewardsGenesisTime()
    – Récompense.sol; manuellementSetRewardsGenesisTime()
    – Récompense.sol : 267-268 ; transfert par lots(TransferInfo[])

    Description

    Les fonctions susmentionnées n'émettent pas d'événements pour les mises à jour d'état importantes.

    Atténuation

    Ajoutez des émissions d’événements.

     

    [I] Gestion des versions Solidity

    ID DIRE-12
    Statut Reconnu
    Analyse D'information
    Impact sur les entreprises Le contrat peut être compilé et testé avec différentes versions du compilateur pendant le développement et la révision et avec une autre version différente du compilateur lors du déploiement sur le réseau principal. Cela peut conduire à des résultats inattendus.
    Localisation Récompense.sol:2

    Description

    Le contrat précise son pragma comme pragma solidity ^0.8.13;. Cela permet d'utiliser n'importe quelle version de Solidity à partir de la 0.8.13. De plus, la 0.8.13 n'est pas la version la plus récente.

    Atténuation

    Choisissez une seule version de Solidity à utiliser. La dernière version stable (et donc recommandée) est la 0.8.19.

     

    [I] Indexer le paramètre de la semaine dans TokensTransferredForConnectionStreak()

    ID DIRE-13
    Statut Fixé
    Analyse D'information
    Impact sur les entreprises L'indexation est utile pour filtrer les événements dans les journaux Ethereum. Chaque paramètre indexé dans un événement ajoute une rubrique au journal des événements, ce qui facilite la recherche d'événements spécifiques à l'aide de ces paramètres.
    Localisation – Récompense.sol : 81

    Description

    Le paramètre week représente la semaine actuelle au cours de laquelle le largage a été distribué. Étant donné que l'indexation permet aux applications frontales de filtrer plus facilement des événements spécifiques, l'indexation de ce paramètre facilitera le filtrage des utilisateurs ayant reçu des parachutages au cours d'une semaine donnée.

    Atténuation

    Pensez à indexer le paramètre spécifié.

     

    [I] Adhésion au guide de style Solidity

    ID DIRE-14
    Statut Fixé
    Analyse D'information
    Impact sur les entreprises Ce problème est purement informatif. Il n’y a aucun impact sur la posture de sécurité du contrat ou autre.
    Localisation – Récompense.sol : 36

    Description

    TransferInfo[], une structure, est définie à la ligne 36, directement après les variables d'état. Le guide de style Solidity recommande de placer les déclarations struct avant.

    Atténuation

    Déplacez la déclaration de la structure directement au début du contrat, avant les variables d'état.

    Nous contacter

    Restez à l'écoute

    Téléphone
    Localisation
    Tel Aviv, Israël
    Messagers:
    N'hésitez pas à nous contacter, nous nous ferons un plaisir de vous répondre !





      Ce site est protégé par reCAPTCHA et Google Données privées ainsi que Conditions d'utilisation s'appliquent.
      Passer au contenu