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
- Gestionnaire de paquets : npm
- Paquets affectés : vue-template-compiler
- Affected versions: >= 2.0.0 < 3.0.0
- Lien vers les paquets publiés : https://www.npmjs.com/package/vue-template-compiler
- Github repo : https://github.com/vuejs/vue
- Preuve de concept : https://stackblitz.com/edit/cve-2024-6783?file=index.html
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
Soyez alerté chaque fois qu'une nouvelle vulnérabilité est corrigée dans les logiciels open source que nous soutenons.