Analyse des vulnérabilités du compilateur Solidity et stratégies de réponse
Le compilateur est l'un des composants fondamentaux des systèmes informatiques modernes, sa principale fonction étant de convertir le code source des langages de programmation de haut niveau en code d'instructions exécutable par l'ordinateur.
Bien que la plupart des développeurs et des professionnels de la sécurité se concentrent davantage sur la sécurité du code des applications, la sécurité du compilateur lui-même ne doit pas être négligée. En tant que programme informatique, le compilateur peut également présenter des vulnérabilités de sécurité, ce qui peut, dans certains cas, entraîner des risques de sécurité graves. Par exemple, lorsque le navigateur compile et exécute du code JavaScript côté client, des vulnérabilités dans le moteur de parsing JavaScript peuvent permettre à un utilisateur de subir des attaques d'exécution de code à distance en visitant des pages Web malveillantes, ce qui peut finalement conduire à ce que l'attaquant prenne le contrôle du navigateur de la victime voire de son système d'exploitation.
Le compilateur Solidity ne fait pas exception, plusieurs versions du compilateur Solidity présentent des vulnérabilités de sécurité. Le rôle du compilateur Solidity est de convertir le code des contrats intelligents en code d'instructions (EVM) pour la machine virtuelle Ethereum, ces instructions seront finalement exécutées dans l'EVM.
Il est important de noter que les vulnérabilités du compilateur Solidity diffèrent des vulnérabilités de l'EVM elle-même. Les vulnérabilités de l'EVM font référence à des problèmes de sécurité survenant lors de l'exécution des instructions par la machine virtuelle, ce qui peut affecter l'ensemble du réseau Ethereum. En revanche, les vulnérabilités du compilateur Solidity se produisent lors de la conversion du code Solidity en code EVM, sans affecter directement le réseau Ethereum, mais pouvant entraîner une divergence entre le code EVM généré et les attentes du développeur.
Une des dangers des vulnérabilités du compilateur Solidity est qu'elles peuvent conduire à une incohérence entre le code EVM généré et les attentes des développeurs de contrats intelligents. Étant donné que les contrats intelligents sur Ethereum impliquent généralement des actifs cryptographiques des utilisateurs, tout bug causé par le compilateur peut entraîner des pertes d'actifs pour les utilisateurs, avec des conséquences graves.
Les développeurs et les auditeurs de contrats se concentrent souvent davantage sur la mise en œuvre logique du code du contrat et les problèmes de sécurité au niveau de Solidity, en négligeant les vulnérabilités du compilateur. Il est difficile de découvrir les vulnérabilités du compilateur uniquement par l'audit du code source du contrat, une analyse doit être effectuée en tenant compte des versions spécifiques du compilateur et des modèles de code spécifiques.
Voici quelques exemples réels de vulnérabilités des compilateurs Solidity :
SOL-2016-9 HighOrderByteCleanStorage
Cette vulnérabilité existe dans les versions précoces du compilateur Solidity (>=0.1.6 <0.4.4). Dans certains cas, le compilateur ne nettoie pas correctement les octets de poids fort, ce qui entraîne l'écriture d'un bit de poids fort à 1 dans le stockage après un débordement d'entier, écrasant ainsi la valeur des variables adjacentes. Ce comportement inattendu peut avoir de graves conséquences lorsqu'il s'agit de vérification des autorisations ou de comptabilisation des actifs.
SOL-2022-4 Effets secondaires de mémoire InlineAssembly
Cette vulnérabilité existe dans les versions 0.8.13 à 0.8.15 du compilateur. En raison d'un problème lié à la stratégie d'optimisation du compilateur, dans certains cas, les instructions d'écriture en mémoire peuvent être supprimées incorrectement, entraînant un retour de valeur de fonction qui ne correspond pas aux attentes. Ce bug lié à l'optimisation est difficile à détecter par une simple révision de code.
SOL-2022-6 Débordement de tête d'AbiReencoding avec nettoyage de tableau statique
Cette vulnérabilité affecte les compilateurs des versions 0.5.8 à 0.8.16. Lors de l'opération abi.encode sur un tableau de type calldata, le compilateur nettoie incorrectement certaines données, entraînant la modification de données adjacentes et provoquant une incohérence des données après encodage et décodage. Ce problème peut également survenir lors d'appels externes et d'événements émis, car ces opérations exécutent implicitement abi.encode.
Sur la base de l'analyse des vulnérabilités du compilateur Solidity, voici les recommandations de sécurité suivantes :
Pour les développeurs:
Utilisez une version plus récente du compilateur Solidity, les problèmes de sécurité connus sont généralement moins fréquents.
Améliorer les cas de test unitaire, augmenter la couverture du code, aide à détecter les problèmes causés par le compilateur.
Évitez d'utiliser des assemblages en ligne, des opérations complexes de codage et de décodage ABI, et utilisez prudemment les nouvelles fonctionnalités et les fonctionnalités expérimentales.
Pour le personnel de sécurité :
Considérer les risques de sécurité que le compilateur pourrait introduire lors de l'audit.
Pousser à la mise à niveau de la version du compilateur dans le processus SDL, envisager d'introduire une vérification automatique de la version dans le CI/CD.
Évaluer l'impact réel des vulnérabilités du compilateur en fonction des spécificités du projet, afin d'éviter une inquiétude excessive.
Quelques ressources utiles :
Avertissement de sécurité publié par les officiels de Solidity
Liste des bugs mise à jour régulièrement dans le dépôt Solidity
Liste des bugs des compilateurs de chaque version, pouvant être utilisée pour un contrôle automatique
Avertissement de vulnérabilité du compilateur sur la page de code de contrat Etherscan
En résumé, bien que les vulnérabilités des compilateurs Solidity soient rares, elles peuvent avoir des conséquences graves. Les développeurs et les experts en sécurité doivent rester vigilants et prendre des mesures appropriées pour réduire les risques.
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
20 J'aime
Récompense
20
5
Partager
Commentaire
0/400
AltcoinAnalyst
· 07-21 10:23
Soyez prudent, c'est un vieux problème de la version 0.8.x.
Voir l'originalRépondre0
MemecoinResearcher
· 07-21 10:12
rekt en attente de se produire fr basé sur mon analyse (p\u003c0.01)
Voir l'originalRépondre0
just_another_wallet
· 07-21 10:12
Jeunes développeurs, regardez vite !
Voir l'originalRépondre0
FarmHopper
· 07-21 10:11
Wow, cette faille a l'air effrayante.
Voir l'originalRépondre0
YieldWhisperer
· 07-21 10:10
j'ai vu ce même modèle d'exploitation de compilateur depuis 2021... les développeurs n'apprennent jamais smh
Analyse des vulnérabilités du compilateur Solidity : risques de sécurité et moyens d'y faire face
Analyse des vulnérabilités du compilateur Solidity et stratégies de réponse
Le compilateur est l'un des composants fondamentaux des systèmes informatiques modernes, sa principale fonction étant de convertir le code source des langages de programmation de haut niveau en code d'instructions exécutable par l'ordinateur.
Bien que la plupart des développeurs et des professionnels de la sécurité se concentrent davantage sur la sécurité du code des applications, la sécurité du compilateur lui-même ne doit pas être négligée. En tant que programme informatique, le compilateur peut également présenter des vulnérabilités de sécurité, ce qui peut, dans certains cas, entraîner des risques de sécurité graves. Par exemple, lorsque le navigateur compile et exécute du code JavaScript côté client, des vulnérabilités dans le moteur de parsing JavaScript peuvent permettre à un utilisateur de subir des attaques d'exécution de code à distance en visitant des pages Web malveillantes, ce qui peut finalement conduire à ce que l'attaquant prenne le contrôle du navigateur de la victime voire de son système d'exploitation.
Le compilateur Solidity ne fait pas exception, plusieurs versions du compilateur Solidity présentent des vulnérabilités de sécurité. Le rôle du compilateur Solidity est de convertir le code des contrats intelligents en code d'instructions (EVM) pour la machine virtuelle Ethereum, ces instructions seront finalement exécutées dans l'EVM.
Il est important de noter que les vulnérabilités du compilateur Solidity diffèrent des vulnérabilités de l'EVM elle-même. Les vulnérabilités de l'EVM font référence à des problèmes de sécurité survenant lors de l'exécution des instructions par la machine virtuelle, ce qui peut affecter l'ensemble du réseau Ethereum. En revanche, les vulnérabilités du compilateur Solidity se produisent lors de la conversion du code Solidity en code EVM, sans affecter directement le réseau Ethereum, mais pouvant entraîner une divergence entre le code EVM généré et les attentes du développeur.
Une des dangers des vulnérabilités du compilateur Solidity est qu'elles peuvent conduire à une incohérence entre le code EVM généré et les attentes des développeurs de contrats intelligents. Étant donné que les contrats intelligents sur Ethereum impliquent généralement des actifs cryptographiques des utilisateurs, tout bug causé par le compilateur peut entraîner des pertes d'actifs pour les utilisateurs, avec des conséquences graves.
Les développeurs et les auditeurs de contrats se concentrent souvent davantage sur la mise en œuvre logique du code du contrat et les problèmes de sécurité au niveau de Solidity, en négligeant les vulnérabilités du compilateur. Il est difficile de découvrir les vulnérabilités du compilateur uniquement par l'audit du code source du contrat, une analyse doit être effectuée en tenant compte des versions spécifiques du compilateur et des modèles de code spécifiques.
Voici quelques exemples réels de vulnérabilités des compilateurs Solidity :
Cette vulnérabilité existe dans les versions précoces du compilateur Solidity (>=0.1.6 <0.4.4). Dans certains cas, le compilateur ne nettoie pas correctement les octets de poids fort, ce qui entraîne l'écriture d'un bit de poids fort à 1 dans le stockage après un débordement d'entier, écrasant ainsi la valeur des variables adjacentes. Ce comportement inattendu peut avoir de graves conséquences lorsqu'il s'agit de vérification des autorisations ou de comptabilisation des actifs.
Cette vulnérabilité existe dans les versions 0.8.13 à 0.8.15 du compilateur. En raison d'un problème lié à la stratégie d'optimisation du compilateur, dans certains cas, les instructions d'écriture en mémoire peuvent être supprimées incorrectement, entraînant un retour de valeur de fonction qui ne correspond pas aux attentes. Ce bug lié à l'optimisation est difficile à détecter par une simple révision de code.
Cette vulnérabilité affecte les compilateurs des versions 0.5.8 à 0.8.16. Lors de l'opération abi.encode sur un tableau de type calldata, le compilateur nettoie incorrectement certaines données, entraînant la modification de données adjacentes et provoquant une incohérence des données après encodage et décodage. Ce problème peut également survenir lors d'appels externes et d'événements émis, car ces opérations exécutent implicitement abi.encode.
Sur la base de l'analyse des vulnérabilités du compilateur Solidity, voici les recommandations de sécurité suivantes :
Pour les développeurs:
Pour le personnel de sécurité :
Quelques ressources utiles :
En résumé, bien que les vulnérabilités des compilateurs Solidity soient rares, elles peuvent avoir des conséquences graves. Les développeurs et les experts en sécurité doivent rester vigilants et prendre des mesures appropriées pour réduire les risques.