Analyse de la nouvelle vulnérabilité de débordement d'entiers dans le langage Move : de la sécurité des références aux attaques DoS

robot
Création du résumé en cours

Analyse approfondie d'une autre vulnérabilité critique du langage Move

Nous avons récemment découvert une grave vulnérabilité dans Aptos Moveevm, et après une étude approfondie, nous avons également trouvé une nouvelle vulnérabilité d'overflow entier. Le processus de déclenchement de cette vulnérabilité est encore plus intéressant. Ci-dessous, nous allons analyser en profondeur cette vulnérabilité, tout en introduisant quelques connaissances de base sur le langage Move. Nous sommes convaincus qu'à travers cette explication, vous aurez une compréhension plus approfondie du langage Move.

Comme tout le monde le sait, le langage Move vérifie les unités de code avant d'exécuter le bytecode. Le processus de validation se divise en 4 étapes, et cette vulnérabilité apparaît lors de l'étape reference_safety.

Le module reference_safety définit une fonction de transfert utilisée pour vérifier la sécurité des références du corps du processus. Ses vérifications comprennent la validation de l'absence de références suspendues, la sécurité d'accès aux références mutables, et la sécurité d'accès aux références de stockage global, etc.

La fonction d'entrée de la vérification de sécurité appelle analyze_function. Dans analyze_function, la fonction va valider chaque bloc de base. Un bloc de base est une séquence de code sans instructions de branchement, à l'exception des entrées et sorties.

Le langage Move détermine les blocs de base en parcourant le bytecode, en recherchant toutes les instructions de branchement et les séquences d'instructions de boucle. Un exemple typique de bloc de code IR Move peut contenir 3 blocs de base, déterminés respectivement par les instructions BrTrue, Branch et Ret.

Numen Cyber a découvert une autre vulnérabilité critique dans le langage move

Sécurité des références dans Move

S'inspirant de la pensée du langage Rust, Move prend en charge deux types de références : la référence immuable ( et la référence mutable )&mut (. La référence immuable est utilisée pour lire des données à partir d'une structure, tandis que la référence mutable est utilisée pour modifier des données. Une utilisation raisonnable des types de références aide à maintenir la sécurité et à identifier les modules de lecture.

Le module de sécurité des références de Move scanne les instructions en bytecode des blocs de base de chaque fonction, vérifiant la légalité de toutes les opérations de référence. Le processus de vérification implique principalement la structure AbstractState, qui contient le graphe de prêt et les locaux, afin d'assurer la sécurité des références dans la fonction.

Le processus de vérification compare l'état avant et après l'exécution du bloc de base, puis fusionne les résultats pour mettre à jour l'état du bloc, tout en diffusant les conditions postérieures du bloc aux blocs suivants. Ce processus est similaire à l'idée de Sea of Nodes dans V8 turbofan.

La boucle principale exécutera le code du bloc, puis essaiera de fusionner l'état précédent et l'état suivant. Si l'état change et que le bloc actuel a une arête rétroactive pointant vers lui-même ), cela indique qu'il y a une boucle (, il retournera alors au début de la boucle et continuera à exécuter ce bloc de base jusqu'à ce que l'état suivant soit égal à l'état précédent ou qu'il soit interrompu en raison d'une erreur.

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-eb6397a8a98b556071724d98a4837b59.webp(

Analyse des vulnérabilités

Le problème survient lors de la vérification si le résultat du join a changé. La fonction join_ est utilisée pour mettre à jour les variables locales et le graphe des relations d'emprunt. Lorsque la longueur des paramètres de la fonction ajoutée à la longueur des variables locales dépasse 256, en raison du type u8 des variables locales, un débordement se produit lors de l'itération sur les locals.

Bien que Move ait un processus de vérification du nombre de locals, le module de vérification des limites ne vérifie que les locals et n'inclut pas la longueur des paramètres. Les développeurs semblent avoir réalisé qu'il était nécessaire de vérifier la somme des paramètres et des valeurs locales, mais le code ne vérifie en réalité que le nombre de variables locales.

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-6952376046c901dfae2b19d5144746b5.webp(

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-92892f2a9dffea9f805f3a1952e82703.webp(

De l'overflow d'entier à l'attaque DoS

La boucle principale va scanner le bloc de code et appeler la fonction execute_block, puis fusionner l'état avant et après l'exécution. Lorsque le code contient une boucle, il sautera au début du bloc de code pour l'exécuter à nouveau.

Si nous construisons un bloc de code en boucle et utilisons un dépassement pour modifier l'état du bloc, de sorte que la nouvelle carte locals soit différente de l'ancienne, alors lors de l'exécution de execute_block, l'analyse de la séquence d'instructions dans le bloc de base accédera à la nouvelle carte locals. À ce moment-là, si l'index requis par l'instruction n'existe pas dans la nouvelle carte, cela entraînera un DoS.

Dans le module de sécurité de référence, les codes d'opération MoveLoc/CopyLoc/FreeRef peuvent atteindre cet objectif. Prenons l'exemple de la fonction copy_loc, qui essaie d'obtenir la valeur locale via LocalIndex. Si LocalIndex n'existe pas, cela entraînera un panic, provoquant ainsi l'effondrement de tout le nœud.

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-1347ef8b31983109babdf8ef29270c67.webp(

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-ac937ab4f426d30a476feb32520a95b4.webp(

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-a18dcf64108d1a75b728ffe8391100f1.webp(

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-7c8fe4e4cf376ad49d729a6f80df6f08.webp(

Démonstration PoC

Nous pouvons construire un bloc de base contenant des instructions de branchement inconditionnelles, permettant des appels multiples aux fonctions execute_block et join. En réglant les paramètres appropriés et le nombre de variables locales, il est possible de réduire la longueur de la nouvelle map de locals à 8 après la première exécution.

Lors de la deuxième exécution, tenter d'accéder à un offset inexistant entraînera un panic, déclenchant ainsi un DoS.

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-c598d61833550ec5494f9a5a4ee2a760.webp(

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-12c60c225a5629f6d927982a7585fc5b.webp(

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-94b0c97bb9e287ed715cddb5165f129d.webp(

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-095e2b585c45a86b0a689214ca673619.webp(

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-5ebaa03263f7a87edd78d146c5beadd2.webp(

![Numen Cyber a découvert une autre vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-fe905356cbee596e8aba08ec14f5d508.webp(

Résumé

Cette vulnérabilité montre qu'il existe des risques de sécurité même dans le langage Move, qui a été soumis à une vérification statique rigoureuse. Les vulnérabilités de dépassement peuvent contourner les vérifications de limites, ce qui souligne l'importance de l'audit de code.

En tant que leader dans la recherche sur la sécurité du langage Move, nous recommandons aux concepteurs de langage d'ajouter davantage de vérifications de code dans l'exécution de Move, afin de prévenir les situations inattendues. Actuellement, Move effectue principalement des vérifications de sécurité au stade de vérification, mais il manque de renforcement de sécurité suffisant au stade d'exécution, ce qui pourrait entraîner des problèmes plus graves.

Nous avons également découvert une autre vulnérabilité dans le langage Move, que nous partagerons avec vous dans les prochaines communications.

![Numen Cyber a découvert une nouvelle vulnérabilité critique dans le langage move])https://img-cdn.gateio.im/webp-social/moments-ae25cc7d31726e2e1477e6d112b7aa75.webp(

MOVE3.57%
Voir l'original
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.
  • Récompense
  • 5
  • Partager
Commentaire
0/400
ConsensusDissentervip
· 08-05 10:34
En effet, ce n'est toujours pas sûr.
Voir l'originalRépondre0
DefiPlaybookvip
· 08-05 10:31
Étapes de validation à optimiser
Voir l'originalRépondre0
MEVHunterWangvip
· 08-05 10:26
Qui comprend les failles fait de l'argent.
Voir l'originalRépondre0
tokenomics_truthervip
· 08-05 10:23
Je ne trouve pas ça fiable.
Voir l'originalRépondre0
staking_grampsvip
· 08-05 10:05
Déplacer le grand trou à remplir
Voir l'originalRépondre0
  • Épingler
Trader les cryptos partout et à tout moment
qrCode
Scan pour télécharger Gate app
Communauté
Français (Afrique)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)