CVE-2024-6783

Scripts croisés (Cross-Site Scripting)
Affectations
vue-template-compiler
>= 2.0.0 < 3.0.0
en
Vue 2
Icône de cercle d'exclamation
Patch disponible
Cette vulnérabilité a été corrigée dans la version Never-Ending Support (NES) proposée par HeroDevs.

Aperçu

Vue est un framework HTML, CSS et JS permettant de développer des applications web avec une réactivité fine.

Une vulnérabilité de type cross-site scripting (XSS) a été identifiée dans le compilateur de modèles de Vue 2, qui est présent dans la "version complète" de Vue 2. La version complète permet au code utilisateur de compiler des modèles de chaînes en composants Vue et de rendre les fonctions dynamiquement dans le navigateur, où elles sont ensuite exécutées.

Selon l' OWASP: Les attaques de type Cross-Site Scripting sont un type d'injection, dans lequel des scripts malveillants sont injectés dans des sites web par ailleurs bénins et de confiance. Les attaques XSS se produisent lorsqu'un pirate utilise une application web pour envoyer un code malveillant, généralement sous la forme d'un script côté navigateur, à un autre utilisateur final. Un pirate peut utiliser XSS pour envoyer un script malveillant à un utilisateur qui ne se doute de rien.

Détails

Informations sur le module

Informations sur les vulnérabilités

This Medium-severity level exploit can be found in Vue versions greater than or equal to 2.0.0 and before 3.0.0. It is found inside of the in-browser Vue template compiler which is shipped inside the “full build” of Vue. The in-browser Vue template compiler is responsible for creating a string of code to be executed so that component templates like “<div>{{ variables }}</div>” can be parsed and turned into render functions. These render functions are then executed by Vue when it evaluates the render functions within a stringified eval statement, thus allowing a third-party script to run arbitrary code.

Seules certaines propriétés sont susceptibles de faire l'objet de vulnérabilités XSS côté client lors de l'extension de Object.prototype. L'une de ces propriétés est staticClass, qui est récupérée pendant la phase de construction de l'AST lorsqu'une chaîne de template utilise l'attribut `class` avec une classe non-dynamique.

Il existe des optimisations en place qui dépendent de l'ensemble de la chaîne du modèle et qui peuvent ou non déclencher ce chemin de code. Voir "Étapes de reproduction" pour un exemple de composant susceptible de subir cette attaque.

Étapes de la reproduction

Le chemin AST Codegen pour le compilateur de modèles de Vue dans le navigateur s'appuie sur des propriétés qui sont initialement non définies. Finalement, les propriétés sont consommées par une fonction qui enchaîne les valeurs et les transmet à une instruction eval pendant le rendu. Si ces propriétés étaient explicitement définies à undefined ou vérifiées pour hasOwnProperty, la pollution des prototypes ne serait pas possible. Actuellement, presque toutes les propriétés de ASTElement (la principale structure de données utilisée pour créer des nœuds de codegen pendant le SSR, la compilation dans le navigateur et l'analyseur de fichiers SFC de Vue) sont optionnelles et peuvent être sensibles à cette vulnérabilité XSS.

Les attaques XSS (Cross-Site Scripting) sont un type d'injection dans lequel des scripts malveillants sont injectés dans des sites web par ailleurs bénins et fiables. Les attaques XSS se produisent lorsqu'un attaquant utilise une application web pour envoyer un code malveillant, généralement sous la forme d'un navigateur. Le code du compilateur de modèles consomme l'AST et n'assainit pas correctement le contenu qui sera placé dans les propriétés éventuellement appelées pendant le rendu. Les exemples de code et la preuve de concept présentés dans la section suivante ne sont pas exhaustifs.

<head>
  <script>
    window.Proxy = undefined // Not necessary, but helpfull in demonstrating breaking out into `window.alert`
    Object.prototype.staticClass = `alert("Polluted")`
  </script>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
</head>

<body>
  <div id="app"></div>
  <script>
    new window.Vue({
      template: `<div class="">Content</div>`,
    }).$mount('#app')
  </script>
</body>

Preuve de concept
Une reproduction complète du code ci-dessus dans un site web de preuve de concept peut être consultée à l'adresse suivante : https://stackblitz.com/edit/cve-2024-6783?file=index.html

Atténuation

Vue 2 a atteint sa fin de vie. Les utilisateurs des composants concernés doivent appliquer l'une des mesures d'atténuation suivantes :

  • Migrer vers une version plus récente de Vue
  • Appliquer son propre correctif
  • Faites appel à un partenaire commercial comme HeroDevs pour l'assistance à la sécurité après la fin de vie.

Crédits

  • Zifeng Kang finder
  • Recherche de Muxi Lyu
  • Yinzhi Cao
Détails de la vulnérabilité
ID
CVE-2024-6783
PROJET concerné
vue-template-compiler
Versions concernées
>= 2.0.0 < 3.0.0
≈ Date fixe
23 juillet 2024
Fixé en
Sévérité
Moyen
Catégorie
Scripts croisés (Cross-Site Scripting)