Rapport d'audit de contrat intelligent pour 1 pouce

Résumé de gestion

1inch a contacté Sayfer pour réaliser un audit de sécurité sur son 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 1inch. Nous avons appliqué une combinaison d'outils d'inspection manuelle et d'analyse automatisée

Au cours de la période de recherche de 15 jours d'audit, nous avons découvert 3 vulnérabilités et 1 note d'information dans le contrat audité.
Aucun de ces constats n’est considéré comme critique, le contrat peut être déployé tel quel. Toutes les découvertes ont été adressées et corrigées par l'équipe de 1inch.

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
0
Moyenne
2
Faible
1
D'information
1
Critical
0

Approche

Introduction

1inch a contacté Sayfer pour réaliser un audit de sécurité sur son 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 1inch, nous avons défini le contrat suivant comme la portée du projet. Hachage de validation : 81e1f5190c391fbb929aa74a67d43245f3f662dc

Contract Sha-256
DécompresseurExtension.sol bc852b286a487711699128f1124beb69a37a75658730486ce681b5cef1e5ba11

Nos tests ont été réalisés entre mai et juin 2023.

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 avait été 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'un acteur malveillant à provoquer un DoS ou à créer un comportement inattendu dans l'algorithme de compression.

Qu'il ne soit pas trop tard !

Commencez votre audit avec Sayfer

Présentation du protocole

1 pouce améliorant l’efficacité des opérations dans l’environnement blockchain de couche 2. Étant donné que les opérations avec des données d'appel plus volumineuses ont tendance à être plus coûteuses dans la couche 2, l'objectif central est de réduire la taille des données d'appel. Pour ce faire, une stratégie de compression des données d'appel est utilisée. Cette stratégie implique principalement des opérations hors chaîne et utilise un mécanisme appelé DecompressorExtension, qui permet la récupération des données d'appel compressées.

Plusieurs techniques clés sont utilisées pour la compression des données d'appel :

  1. Compression des octets zéro consécutifs : cette technique réduit la taille globale des données d'appel en consolidant les octets zéro séquentiels dans un format plus compact.
  2. Copie d'octets consécutifs : dans certains cas, la réplication d'octets séquentiels est utilisée comme stratégie de compression de données.
  3. Remplacement basé sur un dictionnaire : deux méthodes distinctes sont utilisées pour remplacer un segment des données d'appel par un index tiré d'un dictionnaire prédéfini, conduisant à une représentation plus efficace des données.

É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

    Risque de centralisation

    ID DIRE-01
    Statut Fixé
    Analyse Moyenne
    Localisation DécompresseurExtension.sol
    Outils Test manuel

    Description

    Si la _setData La fonction est exposée au propriétaire du contrat, ce qui semble être la manière prévue d'utiliser le contrat selon le README, cela introduit un risque de centralisation pour chaque projet qui utilise DecompressorExtension.

    function _setData(uint256 offset, bytes32 data) internal
    validDictAccess(offset) {
        unchecked {
            _dict[offset] = data;
        }
    }

    Un propriétaire peut lancer un appel d'un utilisateur et modifier la clé de dict correspondante avant l'exécution de l'appel, ce qui lui permet de modifier arbitrairement les données d'appel. Par conséquent, il devient impossible pour un utilisateur de vérifier les données d'appel (décompressées) avant un appel.

    La mutabilité des entrées dict signifie également que les autres contrats intelligents qui appellent la décompression ne peuvent pas stocker les données d'appel compressées de manière immuable, car leur interprétation peut changer.

    Atténuation

    Une solution à ce problème serait d’interdire la modification des entrées de dictionnaire existantes, mais une meilleure compréhension des besoins et des options de l’entreprise est nécessaire.

     

    Aucune implémentation propriétaire

    ID DIRE-02
    Statut Fixé
    Analyse Moyenne
    Localisation DécompresseurExtension.sol
    Outils Test manuel

    Description

    Le README indique à plusieurs reprises la mise en œuvre Forme propriétaire OpenZeppelin. En réalité, le contrat ne met pas en œuvre ni n’étend Owneable, ce qui pourrait prêter à confusion et induire en erreur les propriétaires de projets.

    Extrait du README :

    This contract provides a `DecompressorExtension` abstract
    contract that extends `Ownable` from the OpenZeppelin
    library.

    Ceci est dangereux car les propriétaires du projet pourraient supposer qu'il existe un mécanisme de contrôle d'accès, ce qui n'existe pas.

    Atténuation

    Implémentez la fonctionnalité de propriété en héritant d'Ownable ou mettez à jour le README pour indiquer que l'utilisateur est celui qui doit s'occuper du contrôle d'accès.

     

    Attaque DoS au gaz

    ID DIRE-03
    Statut Fixé
    Analyse Faible
    Localisation DécompresseurExtension.sol
    Outils Test manuel

    Description

    Il est très facile de soumettre une (courte) contribution à decompress cela se traduit par d'énormes données d'appel décompressées, c'est à dire l'équivalent d'un bombe zippée.

    Par exemple, de nombreux octets 00111111 suivis de quelques autres données peuvent être soumis en utilisant case 0, ce qui entraîne d'énormes coûts d'extension de mémoire :

    case 0 {
        let size := add(byte(0, data), 1)
        calldatacopy(outptr, calldatasize(), size)
        inptr := add(inptr, 1)
        outptr := add(outptr, size)
        continue
    }

    Si l'utilisateur effectue lui-même cette transaction, cela ne pose pas de problème, car il gaspille simplement ses propres fonds, d'où le faible risque accordé à cette conclusion.

    Cependant, il existe certains scénarios dans lesquels cela pourrait permettre une attaque. Par exemple, nous pourrions avoir un contrat de relais qui appelle un contrat intelligent dans lequel les développeurs veillent à ce que la consommation de gaz de chaque fonction soit limitée. Si ce contrat intelligent commence maintenant à utiliser l'extension, la consommation de gaz devient illimitée, car le data La variable est une entrée contrôlée par l'utilisateur.

    Atténuation

    Il sera difficile d’éviter cette vulnérabilité ; il est nécessaire de mieux comprendre les besoins de l’entreprise.

    Une solution consiste à introduire une limite de longueur facultative pour les données d'appel décompressées, bien que cela puisse être difficile/impossible à définir en fonction des fonctions.
    Outre cette solution technique, nous pensons que cela devrait au moins être documenté dans le README ou dans un commentaire en ligne.

     

    Incompatibilité avec ERC-2771/méta transactions

    ID DIRE-04
    Statut Fixé
    Analyse D'information
    Localisation DécompresseurExtension.sol
    Outils Test manuel

    Description

    L'extension est incompatible avec la norme ERC-2771 où le relais ajoute l'expéditeur d'origine aux données d'appel (car cela entraînerait des erreurs de compression).

    Cela ne devrait pas poser de gros problème car les contrats prennent toujours en charge les appels normaux (non compressés), mais cela signifie que la compression ne peut pas être utilisée conjointement avec les méta-transactions.

    Notre hypothèse est qu'à un moment donné, ce contrat constituera un élément de base pour d'autres protocoles, que ces protocoles pourraient utiliser ERC-2771, qui ne fonctionnerait alors plus lors de l'utilisation de données d'appel compressées.

    Atténuation

    Si cela est pertinent, implémentez ERC-2771

    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