CHC-based Automated Verification of WebAssembly Programs
Cet article propose une méthode de vérification statique automatisée pour un sous-ensemble de WebAssembly utilisant des clauses de Horn contraintes, qui traite efficacement les appels de fonctions indirects par un filtrage basé sur les types et gère les gestionnaires de panique volumineux via la résumé de l'analyse du flux de contrôle.
Article original sous licence CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Ceci est une explication générée par l'IA de l'article ci-dessous. Elle n'a pas été rédigée ni approuvée par les auteurs. Pour une précision technique, consultez l'article original. Lire la clause de non-responsabilité complète
Imaginez l'internet comme une ville immense et bouillonnante où chaque bâtiment est un site web. Pendant des années, ces bâtiments ont été construits avec un ensemble de plans spécifiques et lourds qui les rendaient sûrs mais parfois lents à construire. Puis, un nouveau langage super efficace appelé WebAssembly est arrivé. C'est comme un système de drones de livraison universel et à haute vitesse qui peut voler partout sur le web, transportant des charges lourdes de code pour exécuter des jeux, des outils et des applications directement dans votre navigateur. Parce que ces drones sont si rapides et puissants, nous devons nous assurer qu'ils ne s'écrasent jamais contre un bâtiment ou ne lâchent pas leur cargaison au mauvais endroit. C'est le travail de la « vérification » — un mot sophistiqué pour désigner la preuve mathématique qu'un programme est sûr avant même qu'il ne s'exécute.
Pour ce faire, les informaticiens utilisent souvent un outil appelé « solveur de satisfaisabilité ». Considérez ce solveur comme un détective super intelligent qui peut regarder un ensemble de règles et dire instantanément si un scénario est possible ou impossible. Si les règles disent « Le drone doit être dans le ciel » et « Le drone doit être au sol » en même temps, le détective sait que c'est une contradiction et que le plan est dangereux. Ce document prend ce détective et lui apprend à comprendre les règles spécifiques et délicates de WebAssembly, en particulier les parties impliquant l'appel d'autres fonctions de manière indirecte et la gestion de messages d'erreur massifs.
Le mystère de l'appel métamorphe
Les auteurs, Akihisa Yagi, Ken Sakayori et Naoki Kobayashi de l'Université de Tokyo, ont fait face à un puzzle complexe. Les programmes WebAssembly sont comme une immense bibliothèque où des livres (fonctions) peuvent être retirés des étagères de manière dynamique. Parfois, le code ne dit pas « Ouvrez le Livre A » ; il dit plutôt « Ouvrez le livre situé à l'étagère numéro 5 ». C'est ce qu'on appelle un appel de fonction indirect.
Le problème est que si vous essayez de vérifier chaque livre de la bibliothèque pour voir ce qui pourrait se trouver sur l'étagère numéro 5, le détective (le solveur) est submergé. C'est comme essayer de tester chaque combinaison possible d'un million de serrures pour trouver la bonne clé. L'approche naïve consisterait à lister chaque possibilité, mais cela crée une montagne de paperasse qu'aucun ordinateur ne peut résoudre dans un délai raisonnable.
La solution des auteurs a été d'agir comme un bibliothécaire très strict. Ils ont réalisé que WebAssembly a une règle : vous ne pouvez retirer un livre d'une étagère que s'il correspond au genre (type) spécifique que vous recherchez. Ainsi, au lieu de vérifier chaque livre de la bibliothèque, leur méthode examine le « genre » requis au point d'appel et filtre tous les livres qui ne correspondent pas. Cela réduit considérablement la liste des candidats, rendant la tâche du détective beaucoup plus facile. Ils ont également ajouté un second truc : si les étagères de la bibliothèque sont verrouillées et ne changent jamais (en lecture seule), ils peuvent pré-calculer exactement quel livre se trouve où, transformant un puzzle complexe en une simple liste de règles « si ceci, alors cela ».
Le bouton de panique géant
Le second défi était le « gestionnaire de panique » (panic handler). Imaginez un programme qui, lorsqu'il commet une erreur, ne se contente pas de s'arrêter ; il se lance dans un discours massif de 10 000 étapes expliquant exactement ce qui s'est mal passé, avec des graphiques de diagnostic et des codes d'erreur, avant de finalement abandonner. Dans WebAssembly, ces gestionnaires de panique sont de gros blocs de code déclenchés lorsque les choses tournent mal.
Pour le vérificateur de sécurité, ces discours massifs sont une distraction. La seule chose qui importe est que le programme finisse par s'arrêter de manière sûre (atteigne une instruction « inaccessible »). Le long chemin sinueux de construction du message d'erreur ne change pas le fait que le programme plante. Cependant, si le détective essaie de tracer chaque étape de ce discours de 10 000 étapes, il s'enlise.
Les auteurs ont introduit une technique de « résumé ». Ils ont réalisé que si un bloc de code mène simplement à un plantage, ils peuvent supprimer l'intermédiaire. Ils ont utilisé une analyse de flux de contrôle pour identifier ces chemins longs et sinueux et les ont remplacés par un raccourci simple : « Si vous entrez dans cette pièce, vous finirez par planter ». C'est comme dire à un guide touristique : « Sautez la conférence d'histoire de 50 minutes sur le hall ; dites-nous simplement que la sortie est bloquée. » Cela permet de maintenir la vérification concentrée sur les problèmes de sécurité critiques sans se perdre dans le bruit du message d'erreur.
Les résultats : Un travail en cours
Pour tester leurs idées, l'équipe a construit un prototype d'outil appelé WASMVERIFIER. Ils l'ont nourri de 90 programmes différents, dont certains écrits en Rust et en C, et leur ont demandé de prouver qu'ils étaient sûrs.
Les résultats sont prometteurs mais pas parfaits. En utilisant deux solveurs de détective différents (Z3 Spacer et Eldarica), l'outil a réussi à vérifier ou à infirmer la sécurité d'environ 54 à 56 programmes. Cependant, il s'est heurté à un mur sur environ 20 à 22 programmes, manquant de temps (un « timeout ») ou de mémoire. Dans environ 11 à 12 cas, il a déclenché une « fausse alerte », pensant qu'un programme était dangereux alors qu'il était en fait correct. Les auteurs expliquent que ces fausses alertes se sont produites parce que leur outil devait remplacer certaines instructions non supportées par un substitut de « plantage », ce qui rendait la vérification de sécurité trop prudente.
L'article suggère que, bien que cette approche soit une étape importante vers des vérifications de sécurité entièrement automatisées, elle n'est pas encore une baguette magique. Les auteurs notent que la méthode est encore en cours de perfectionnement, particulièrement dans sa façon de gérer les calculs complexes sur les bits (vecteurs de bits) et de traiter les instructions qu'elle ne comprend pas encore totalement. Ils soupçonnent que la méthode est saine et complète, mais ils n'ont pas encore rédigé la preuve mathématique formelle pour cela, laissant cela comme une tâche pour l'avenir.
En bref, l'article montre qu'en étant plus intelligents sur la façon de filtrer les appels indirects et en résumant les parties désordonnées de la gestion des erreurs, nous pouvons rendre les vérifications de sécurité automatisées pour WebAssembly beaucoup plus pratiques. C'est une base solide, mais le détective a encore besoin de plus d'entraînement pour résoudre tous les cas.
Noyé(e) sous les articles dans votre domaine ?
Recevez des digests quotidiens des articles les plus récents correspondant à vos mots-clés de recherche — avec des résumés techniques, dans votre langue.