Preuve de concept éducative reproduisant CVE-2021-38297, un débordement de tampon Go WASM menant à un XSS stocké. Comprend la configuration d'une application vulnérable, les étapes de reproduction de l'exploit et un guide de correction pour la recherche en sécurité.
WebAssembly (WASM) 🌍, un format d'instructions binaires de pointe, permet l'exécution transparente de langages de haut niveau tels que C, C++, Rust et GO dans les navigateurs web modernes. Cependant, la découverte de CVE-2021-38297 🚩 a révélé une faille critique dans le processus de compilation et de chargement des binaires WASM compilés par GO. Cette vulnérabilité, trouvée dans le chargeur WASM JavaScript (wasm_exec.js) fourni par GO, permettait l'inclusion sans restriction de données dans l'argument argv. Avec argv stocké dans la mémoire linéaire de WASM, des acteurs malveillants pouvaient potentiellement l'exploiter pour écraser la mémoire linéaire du programme WASM compilé par GO avec une entrée argv surdimensionnée, conduisant à des résultats imprévisibles et potentiellement dangereux. Cette vulnérabilité était une préoccupation majeure dans les versions de GO antérieures à 1.17.2.
En résumé :
argv et les publications à l'adresse mémoire 0x5000.toLeetSpeak et processSharedVar sont utilisées respectivement pour le contenu des commentaires et des publications.Dans notre preuve de concept, nous introduisons « Vuln-Twitter », une plateforme de médias sociaux fictive qui permet du contenu généré par les utilisateurs via des publications et des commentaires. Utilisant un serveur web Node.js et SQLite pour le stockage des données, le front-end de Vuln-Twitter exploite du JavaScript simple ainsi qu'un module GO WASM nommé wordprocessor.wasm pour le rendu dynamique du contenu. Ce module inclut notamment des méthodes comme toLeetSpeak, transformant les entrées utilisateur en « LeetSpeak » stylisé pour une expérience utilisateur engageante.

Notre exploration révèle un point critique d'exploitation lors de la phase de rendu du contenu, où chaque commentaire subit une transformation par le module GO WASM. Un commentaire surdimensionné spécialement conçu peut déclencher la vulnérabilité, conduisant à un dépassement de tampon qui manipule le contenu de la publication originale, démontrant un vecteur d'attaque XSS stocké classique. Cette vulnérabilité souligne non seulement le potentiel de manipulation malveillante des données, mais met également en lumière les implications plus larges des pratiques de programmation sécurisée dans le contexte du développement web et des applications WASM. Référez-vous à la section de code faisant de même :

Diagramme de la mémoire linéaire WASM lors du rendu d'un commentaire :

Pour les passionnés et chercheurs désireux d'explorer cette vulnérabilité plus en détail, nous fournissons des étapes détaillées pour reproduire l'environnement d'exploitation en utilisant une version vulnérable spécifique de GO. Cette approche pratique facilite une compréhension plus approfondie des mécanismes de la vulnérabilité et des stratégies d'atténuation potentielles.
Remarque : Pour reproduire cela, vous devez installer la version go1.17.1 de go localement, qui est la version vulnérable utilisée dans ce scénario. Vous pouvez vous référer à la documentation officielle de go pour savoir comment installer des versions spécifiques de go.
Essayons maintenant de reproduire le scénario ci-dessus :
git clone [email protected]:gkrishnan724/CVE-2021-38297.git && cd vuln-twitternpm install pour installer toutes les dépendancesnpm run resetDB qui initialisera la base de données avec quelques publications et commentaires.npm run dev qui démarrera le serveur local, ouvrez localhost:3000 dans un navigateur et vous devriez voir une page de connexion.Maintenant, connectons-nous avec un compte malveillant en utilisant les identifiants nom d'utilisateur : I_CANT_HACK, mot de passe : hacker, une fois connecté, vous devriez voir le fil d'actualité avec quelques publications.
Cette publication semble assez intéressante :
Amazon: ready 4 black friday? https://www.amazon.com/blackfriday
Et si, en utilisant la technique ci-dessus, nous pouvions écraser la publication d'Amazon.com pour pointer vers un lien malveillant ?.
Référez-vous au fichier exploit.txt, il contient le commentaire rempli d'un bourrage de « A » de sorte que nous écrasons tout jusqu'à l'adresse 0x5000, à la fin vous pouvez voir le texte ready for black friday? https://evil.com/blackfriday. Si nous copions ce texte et le commentons sur la publication ci-dessus, nous devrions pouvoir écraser la publication originale avec le texte ci-dessus.
Essayez par vous-même et voyez :)

Reconnaissant la gravité de cette vulnérabilité, nous décrivons également une stratégie de correctif complète, utilisant une version mise à jour et sécurisée de GO pour atténuer le risque. Cette section sert de guide pour les développeurs et administrateurs système afin de renforcer leurs applications contre de telles vulnérabilités, soulignant l'importance des mises à jour logicielles régulières et des pratiques de sécurité vigilantes.
Dans cette application, j'ai également fourni un script de correctif. Qui utilise une version plus récente de go :
npm run patchServerCela devrait recompiler le fichier go avec la nouvelle version et démarrer le serveur avec la version corrigée
Vous devriez maintenant remarquer que la publication n'est pas écrasée et si vous observez la console, nous voyons une erreur à la place : Argument length too long.

Notre parcours à travers l'exploitation et l'atténuation de CVE-2021-38297 offre des perspectives précieuses sur les défis et opportunités présentés par l'intégration de langages de programmation de haut niveau dans les environnements web via WASM. Il incite à un examen critique des pratiques de sécurité dans le développement logiciel, exhortant à une approche proactive de la gestion des vulnérabilités et à l'adoption de normes de codage sécurisées. Sur la base de notre compréhension, nous pensons que l'agencement de la mémoire linéaire de GO est illustré ci-dessous :

En tant qu'étudiants de l'Université Carnegie Mellon, notre enquête sur CVE-2021-38297 contribue au discours académique et professionnel plus large sur la cybersécurité, offrant une étude de cas pratique sur les implications des technologies émergentes sur la sécurité logicielle. Nos supports de présentation, disponibles pour examen, élucident davantage nos conclusions et méthodologies, invitant au dialogue et à la collaboration au sein de la communauté de la cybersécurité.
Ce projet témoigne d'une recherche collaborative et d'une enquête académique, mené par une équipe dévouée d'étudiants et de chercheurs :
Cette preuve de concept présente une application de médias sociaux, Vuln-Twitter, permettant à plusieurs utilisateurs de publier du contenu et des commentaires. Le serveur web, construit sur Node.js, utilise SQLite pour stocker les données des publications et des commentaires.
Le front-end utilise du JS simple ainsi qu'un module GO WASM nommé wordprocessor.wasm. Ce module expose des méthodes comme toLeetSpeak, qui transforme les chaînes d'entrée en « LeetSpeak » (par exemple, « Hello! » devient « h3ll0! »).
Les modules GO WASM aident à afficher les publications et commentaires en LeetSpeak.
Lors du processus de rendu côté front-end, lors de la réception des publications et commentaires du serveur, chaque commentaire subit un rendu en « LeetSpeak » en utilisant le module GO WASM. Le commentaire de chaque publication est passé dans la variable argv après le chargement du module GO WASM.
De plus, il existe une méthode, processSharedVar(), dans le module GO, conçue pour lire la chaîne située à l'adresse 0x5000 et la convertir en langage simplifié (par exemple, « How are you? » devient « How r u? »). La publication originale est explicitement ajoutée à 0x5000 dans la mémoire linéaire pour être accessible par cette méthode, modifiant ainsi le contenu de la publication.
Pour ceux qui souhaitent approfondir CVE-2021-38297 et ses implications plus larges, nous fournissons une liste organisée de ressources et de lectures, allant des bulletins de sécurité officiels aux blogs techniques et articles académiques. Ces documents offrent des perspectives complètes sur la vulnérabilité, son impact sur la sécurité logicielle et les efforts continus pour assurer la sécurité et l'intégrité des applications web.
Dépôt de développement original : https://github.com/gkrishnan724/CVE-2021-38297