Vue.js powers over 3.3 million live websites and pulls 6.4 million npm downloads every week. Its full-stack companion Nuxt — now at 937,000 weekly downloads — is the go-to SSR framework for Vue developers. That scale makes every security advisory a wide-blast event. Between late 2025 and May 2026, the Nuxt ecosystem published four confirmed CVEs: a DevTools vulnerability that chains into full remote code execution, a CDN cache poisoning flaw rated CVSS 7.5, and two OG Image vulnerabilities affecting unauthenticated endpoints. This guide covers every CVE with technical detail and a complete hardening checklist.
Vue.js propulse plus de 3,3 millions de sites web en production et enregistre 6,4 millions de téléchargements npm par semaine. Son équivalent full-stack Nuxt — désormais à 937 000 téléchargements hebdomadaires — est le framework SSR de référence pour les développeurs Vue. Cette échelle fait de chaque advisory sécurité un événement à large impact. Entre fin 2025 et mai 2026, l’écosystème Nuxt a publié quatre CVE confirmées : une vulnérabilité DevTools qui se chaîne en exécution de code à distance complète, une faille d’empoisonnement de cache CDN notée CVSS 7.5, et deux vulnérabilités OG Image touchant des endpoints non authentifiés. Ce guide couvre chaque CVE en détail technique avec une checklist de durcissement complète.
CVE-2025-52662: Nuxt DevTools XSS That Chains Into Remote Code Execution
CVE-2025-52662 : XSS Nuxt DevTools se chaînant en Exécution de Code à Distance
Disclosed in 2025 and patched in Nuxt DevTools 2.6.4, CVE-2025-52662 carries a CVSS v3.1 base score of 6.9 (Medium) — a score that significantly undersells its real-world danger. The vulnerability exists in the DevTools authentication page, where error messages were rendered using innerHTML instead of textContent, enabling DOM-based cross-site scripting without any sanitization.
Divulguée en 2025 et corrigée dans Nuxt DevTools 2.6.4, CVE-2025-52662 porte un score CVSS v3.1 de base de 6.9 (Medium) — un score qui sous-évalue largement le danger réel. La vulnérabilité existe dans la page d’authentification de DevTools, où les messages d’erreur étaient rendus via innerHTML au lieu de textContent, permettant un XSS DOM-basé sans aucune sanitisation.
What makes this CVE dangerous is the full attack chain it enables. A researcher discovered that an attacker can exploit the XSS to steal the DevTools authentication token. That token then unlocks a separate path traversal vulnerability in the WebSocket message handler, allowing the attacker to write arbitrary files outside the intended directory. When the attacker overwrites a configuration file such as nuxt.config.ts or a server middleware, Nuxt reloads it — achieving remote code execution in the development environment. The fix was straightforward: displaying errors as textContent instead of innerHTML.
Ce qui rend cette CVE dangereuse, c’est la chaîne d’attaque complète qu’elle permet. Un chercheur a découvert qu’un attaquant peut exploiter le XSS pour voler le token d’authentification de DevTools. Ce token déverrouille ensuite une vulnérabilité de path traversal distincte dans le gestionnaire de messages WebSocket, permettant d’écrire des fichiers arbitraires en dehors du répertoire prévu. Lorsque l’attaquant écrase un fichier de configuration comme nuxt.config.ts ou un middleware serveur, Nuxt le recharge — réalisant une exécution de code à distance dans l’environnement de développement. Le correctif était simple : afficher les erreurs en textContent au lieu de innerHTML.
The practical mitigation is twofold: upgrade to Nuxt DevTools 2.6.4 or later, and never expose the DevTools server publicly. DevTools is intended exclusively for local development — running Nuxt in dev mode on an internet-facing server dramatically expands the attack surface.
La mitigation pratique est double : mettre à jour vers Nuxt DevTools 2.6.4 ou ultérieur, et ne jamais exposer publiquement le serveur DevTools. DevTools est destiné exclusivement au développement local — exécuter Nuxt en mode dev sur un serveur accessible depuis Internet élargit considérablement la surface d’attaque.
CVE-2025-27415: CDN Cache Poisoning Affecting Nuxt 3.0–3.15 (CVSS 7.5)
CVE-2025-27415 : Empoisonnement de Cache CDN Affectant Nuxt 3.0–3.15 (CVSS 7.5)
Discovered in March 2025 and fixed in Nuxt 3.16.0, CVE-2025-27415 received a CVSS v3.1 base score of 7.5 (High). The vulnerability exploits the way Nuxt handles payload responses when deployed behind a CDN. An attacker can craft a malicious HTTP request that tricks the CDN into caching a poisoned response, causing all subsequent visitors to receive the attacker-controlled content instead of the legitimate application. In the worst case, this renders an entire site completely unavailable to legitimate users without any server compromise.
Découverte en mars 2025 et corrigée dans Nuxt 3.16.0, CVE-2025-27415 a reçu un score CVSS v3.1 de base de 7.5 (High). La vulnérabilité exploite la manière dont Nuxt gère les réponses de payload lorsqu’il est déployé derrière un CDN. Un attaquant peut forger une requête HTTP malveillante qui trompe le CDN pour qu’il mette en cache une réponse empoisonnée, causant la réception du contenu contrôlé par l’attaquant par tous les visiteurs ultérieurs à la place de l’application légitime. Dans le pire des cas, cela rend un site entièrement inaccessible aux utilisateurs légitimes sans aucune compromission du serveur.
The fix requires upgrading to Nuxt 3.16.0 or later. If you cannot upgrade immediately, consider adding Vary headers and cache-key normalization at the CDN layer. Projects behind Cloudflare, Fastly, or Vercel Edge should also audit their caching rules to ensure payload routes are never cached without explicit cache-key configuration.
Le correctif nécessite une mise à jour vers Nuxt 3.16.0 ou ultérieur. Si la mise à jour immédiate est impossible, envisagez d’ajouter des en-têtes Vary et une normalisation de la clé de cache au niveau CDN. Les projets derrière Cloudflare, Fastly ou Vercel Edge doivent également auditer leurs règles de cache pour s’assurer que les routes de payload ne sont jamais mises en cache sans configuration explicite de clé de cache.
CVE-2026-34404 & CVE-2026-34405: Two nuxt-og-image Vulnerabilities Fixed in 6.2.5
CVE-2026-34404 & CVE-2026-34405 : Deux Vulnérabilités nuxt-og-image Corrigées dans 6.2.5
The nuxt-og-image module — which generates Open Graph images from Vue templates — was patched for two separate vulnerabilities in version 6.2.5, both affecting the image generation endpoint at /_og/d/ (and /og-image/ in older versions).
Le module nuxt-og-image — qui génère des images Open Graph à partir de templates Vue — a été corrigé pour deux vulnérabilités distinctes dans la version 6.2.5, toutes deux affectant l’endpoint de génération d’images à /_og/d/ (et /og-image/ dans les versions plus anciennes).
CVE-2026-34404 (Denial of Service): Before version 6.2.5, the image generation component lacked any restriction on the width and height query parameters. An unauthenticated attacker can craft requests with arbitrarily large dimension values (e.g., ?width=999999&height=999999), forcing the server to attempt generating an enormous image. This exhausts CPU, memory and processing time, causing denial of service without any authentication required.
CVE-2026-34404 (Déni de service) : Avant la version 6.2.5, le composant de génération d’images ne présentait aucune restriction sur les paramètres de requête width et height. Un attaquant non authentifié peut forger des requêtes avec des valeurs de dimensions arbitrairement grandes (ex. : ?width=999999&height=999999), forçant le serveur à tenter de générer une image énorme. Cela épuise le CPU, la mémoire et le temps de traitement, causant un déni de service sans aucune authentification requise.
CVE-2026-34405 (Reflected XSS): The same endpoint fails to sanitize user-controlled GET parameters before reflecting them in the HTML response. An attacker can inject malicious attribute values that break out of their intended context, adding new attributes or event handlers into the HTML document body. This enables client-side JavaScript execution via a crafted URL sent to a victim.
CVE-2026-34405 (XSS réfléchi) : Le même endpoint ne sanitise pas les paramètres GET contrôlés par l’utilisateur avant de les réfléter dans la réponse HTML. Un attaquant peut injecter des valeurs d’attributs malveillantes qui s’échappent de leur contexte prévu, ajoutant de nouveaux attributs ou gestionnaires d’événements dans le corps du document HTML. Cela permet l’exécution de JavaScript côté client via une URL forgée envoyée à une victime.
# Attaque via injection de paramètre GET dans nuxt-og-image < 6.2.5
https://example.com/_og/d/home?title=Hello%22+onmouseover%3Dalert(document.cookie)
# Fix : upgrade vers nuxt-og-image 6.2.5
npm install nuxt-og-image@latest
The Enduring Vue.js XSS Problem: v-html and Dynamic Bindings
Le Problème XSS Persistant de Vue.js : v-html et les Liaisons Dynamiques
Beyond the CVEs above, Vue.js applications face a class of developer-introduced vulnerabilities that no upstream patch will fix. The most common is misuse of v-html. Unlike Vue's default template interpolation ({{ }}), which automatically escapes HTML entities, v-html renders raw HTML directly into the DOM — identical to assigning to innerHTML. If any user-controlled data reaches v-html unsanitized, the application is vulnerable to XSS.
Au-delà des CVE ci-dessus, les applications Vue.js sont exposées à une classe de vulnérabilités introduites par les développeurs qu’aucun patch upstream ne corrigera. La plus courante est le mauvais usage de v-html. Contrairement à l’interpolation de template par défaut de Vue ({{ }}), qui échappe automatiquement les entités HTML, v-html rend du HTML brut directement dans le DOM — identique à l’assignation à innerHTML. Si des données contrôlées par l’utilisateur atteignent v-html sans sanitisation, l’application est vulnérable au XSS.
<!-- ❌ Vulnérable : v-html avec données utilisateur non sanitisées -->
<div v-html="userContent"></div>
<!-- ✅ Sécurisé : sanitiser avec DOMPurify avant v-html -->
<script setup>
import DOMPurify from 'dompurify';
const sanitizedContent = computed(() =>
DOMPurify.sanitize(userContent.value)
);
</script>
<div v-html="sanitizedContent"></div>
<!-- ✅ Encore mieux : utiliser l'interpolation standard (auto-escape) -->
<p>{{ userContent }}</p>
A second common issue is dynamic attribute binding with v-bind:href or :href. Vue does not prevent javascript: URL injection in attribute values. Any user-provided URL bound to :href, :src, or :action should be validated against an allowlist of safe protocols (https:, http:, mailto:). The Vue.js documentation explicitly recommends treating javascript: URLs in any attribute as a security violation.
Un deuxième problème courant est la liaison dynamique d’attributs avec v-bind:href ou :href. Vue n’empêche pas l’injection d’URLs javascript: dans les valeurs d’attributs. Toute URL fournie par l’utilisateur liée à :href, :src, ou :action doit être validée contre une liste d’autorisation de protocoles sûrs (https:, http:, mailto:). La documentation Vue.js recommande explicitement de traiter les URLs javascript: dans tout attribut comme une violation de sécurité.
Nuxt SSR Security: Server-Side Risks You Don’t Have in SPA Mode
Sécurité SSR Nuxt : Les Risques Côté Serveur Absents en Mode SPA
With 45% of Vue developers now using SSR (up from 31% in 2021), Nuxt's server-side rendering surface is increasingly relevant. SSR introduces a class of risks that don't exist in pure client-side Vue apps. State serialization — the process of hydrating the client with server-fetched data — is a common injection vector. If user-controlled data is serialized into a <script> tag without proper escaping, script injection becomes possible.
Avec 45% des développeurs Vue utilisant désormais SSR (contre 31% en 2021), la surface de rendu côté serveur de Nuxt est de plus en plus pertinente. SSR introduit une classe de risques qui n’existent pas dans les applications Vue purement côté client. La sérialisation d’état — le processus d’hydratation du client avec des données récupérées côté serveur — est un vecteur d’injection courant. Si des données contrôlées par l’utilisateur sont sérialisées dans une balise <script> sans échappement adéquat, une injection de script devient possible.
Nuxt's server routes (in server/api/ and server/routes/) also deserve careful review. They run on Node.js and have access to the filesystem, environment variables and databases — they are not sandboxed like edge functions. Treating server route handlers with the same rigor as a full Node.js API is essential.
Les routes serveur de Nuxt (dans server/api/ et server/routes/) méritent également une revue attentive. Elles s’exécutent sur Node.js et ont accès au système de fichiers, aux variables d’environnement et aux bases de données — elles ne sont pas isolées comme des fonctions edge. Traiter les gestionnaires de routes serveur avec la même rigueur qu’une API Node.js complète est essentiel.
Vue.js & Nuxt Security Hardening Checklist for 2026
Checklist de Durcissement Sécurité Vue.js & Nuxt pour 2026
Apply the following measures to reduce attack surface across both the Vue frontend and the Nuxt server layer.
Appliquez les mesures suivantes pour réduire la surface d’attaque sur le frontend Vue et la couche serveur Nuxt.
// npm install nuxt-security
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['nuxt-security'],
security: {
// Content Security Policy strict
headers: {
contentSecurityPolicy: {
'default-src': ["'self'"],
'script-src': ["'self'", "'strict-dynamic'"],
'style-src': ["'self'", "'unsafe-inline'"],
'img-src': ["'self'", 'data:', 'https:'],
'connect-src': ["'self'"],
'frame-ancestors': ["'none'"],
'upgrade-insecure-requests': true,
},
// HSTS : 1 an, sous-domaines inclus
strictTransportSecurity: {
maxAge: 31536000,
includeSubdomains: true,
preload: true,
},
xContentTypeOptions: 'nosniff',
xFrameOptions: 'DENY',
referrerPolicy: 'strict-origin-when-cross-origin',
},
// Rate limiting sur les routes API serveur
rateLimiter: {
tokensPerInterval: 150,
interval: 'hour',
},
},
});
# Vérifier les versions vulnérables connues
npm list nuxt @nuxt/devtools nuxt-og-image
# CVE-2025-52662 : @nuxt/devtools doit être >= 2.6.4
# CVE-2025-27415 : nuxt doit être >= 3.16.0
# CVE-2026-34404 / CVE-2026-34405 : nuxt-og-image doit être >= 6.2.5
# Audit complet
npm audit
# Mise à jour automatique vers les versions sécurisées
npm update nuxt @nuxt/devtools nuxt-og-image
The nuxt-security module (based on OWASP Top 10 and Helmet) is the fastest way to add security headers, CSRF protection, rate limiting and CSP to a Nuxt 3 application. It integrates directly with Nitro and handles nonce generation for inline scripts automatically — a common pain point when enabling strict CSP with SSR.
Le module nuxt-security (basé sur l’OWASP Top 10 et Helmet) est le moyen le plus rapide d’ajouter des en-têtes de sécurité, une protection CSRF, une limitation de débit et une CSP à une application Nuxt 3. Il s’intègre directement avec Nitro et gère automatiquement la génération de nonces pour les scripts inline — un point de friction courant lors de l’activation d’une CSP stricte avec SSR.
Automating CVE Detection in Vue & Nuxt Projects
Automatiser la Détection de CVE dans les Projets Vue & Nuxt
The four CVEs above would have been detectable automatically — if your monitoring scans your package-lock.json or yarn.lock against live vulnerability databases. CVE-2025-27415 was published in March 2025, but projects running older Nuxt versions may have gone months without being alerted.
Les quatre CVE ci-dessus auraient été détectables automatiquement — si votre monitoring scanne votre package-lock.json ou yarn.lock contre les bases de données de vulnérabilités en direct. CVE-2025-27415 a été publiée en mars 2025, mais les projets fonctionnant avec des versions Nuxt plus anciennes ont peut-être passé des mois sans être alertés.
# .github/workflows/security.yml
name: Security Audit
on:
push:
branches: [main]
schedule:
# Audit quotidien même sans nouveau commit
- cron: '0 8 * * *'
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
# npm ci garantit l'intégrité du lockfile
- run: npm ci
# Fail le pipeline si une CVE High/Critical est détectée
- run: npm audit --audit-level=high
For teams managing multiple Vue or Nuxt projects, manual audits don't scale. CVE OptiBot scans your lockfiles continuously and sends alerts the moment a new vulnerability affects your dependencies — whether it's a Nuxt core CVE or a transitive dependency you didn't know you had.
Pour les équipes gérant plusieurs projets Vue ou Nuxt, les audits manuels ne passent pas à l’échelle. CVE OptiBot scanne vos lockfiles en continu et envoie des alertes dès qu’une nouvelle vulnérabilité touche vos dépendances — qu’il s’agisse d’une CVE Nuxt core ou d’une dépendance transitive que vous ne saviez pas avoir.
Frequently Asked Questions
Questions fréquentes
Is Vue.js itself vulnerable to these CVEs?
Vue.js lui-même est-il vulnérable à ces CVE ?
No. CVE-2025-52662 affects @nuxt/devtools, CVE-2025-27415 affects the Nuxt SSR framework, and CVE-2026-34404/34405 affect the nuxt-og-image module. The core Vue.js library is not directly affected by any of these vulnerabilities. However, Vue-specific XSS patterns (v-html misuse, javascript: URL injection) are developer-introduced issues, not upstream CVEs.
Non. CVE-2025-52662 affecte @nuxt/devtools, CVE-2025-27415 affecte le framework Nuxt SSR, et CVE-2026-34404/34405 affectent le module nuxt-og-image. La bibliothèque Vue.js core n’est pas directement affectée par ces vulnérabilités. Cependant, les patterns XSS spécifiques à Vue (mauvais usage de v-html, injection d’URLs javascript:) sont des problèmes introduits par les développeurs, pas des CVE upstream.
Am I affected by CVE-2025-52662 if I only run Nuxt DevTools locally?
Suis-je affecté par CVE-2025-52662 si j’utilise Nuxt DevTools uniquement en local ?
The risk is greatly reduced in a purely local development environment. CVE-2025-52662 requires an attacker to reach the DevTools authentication page — typically at localhost:3000/__nuxt_devtools__/. In a local setup, this requires either local access or a crafted page that the developer visits while DevTools is running. However, you should still upgrade to @nuxt/devtools 2.6.4 — it's a simple npm update.
Le risque est considérablement réduit dans un environnement de développement purement local. CVE-2025-52662 nécessite qu’un attaquant accède à la page d’authentification DevTools — généralement à localhost:3000/__nuxt_devtools__/. Dans une configuration locale, cela nécessite soit un accès local, soit une page forgée que le développeur visite pendant que DevTools est actif. Néanmoins, vous devriez quand même mettre à jour vers @nuxt/devtools 2.6.4 — c’est un simple npm update.
Does CVE-2025-27415 affect Nuxt apps deployed on Vercel or Netlify?
CVE-2025-27415 affecte-t-elle les apps Nuxt déployées sur Vercel ou Netlify ?
It depends on how the deployment is configured. Vercel and Netlify both sit CDN layers in front of Nuxt SSR deployments, which is exactly the attack vector for CVE-2025-27415. If your Nuxt version is below 3.16.0 and the CDN is caching payload routes, you are potentially vulnerable. The fix is upgrading to Nuxt 3.16.0 and verifying your CDN caching rules.
Cela dépend de la configuration du déploiement. Vercel et Netlify placent tous deux des couches CDN devant les déploiements Nuxt SSR, ce qui est exactement le vecteur d’attaque de CVE-2025-27415. Si votre version Nuxt est inférieure à 3.16.0 et que le CDN met en cache les routes de payload, vous êtes potentiellement vulnérable. Le correctif est de mettre à jour vers Nuxt 3.16.0 et de vérifier vos règles de cache CDN.
How can I detect vulnerable transitive dependencies in a Nuxt project?
Comment détecter les dépendances transitives vulnérables dans un projet Nuxt ?
Run npm audit or npm ls <package> to identify where vulnerable packages are in your dependency tree. The lockfile (package-lock.json or yarn.lock) is the authoritative source — it lists the exact resolved version of every transitive dependency. Automated tools like CVE OptiBot scan the lockfile directly against OSV.dev and the NVD database, alerting you to new CVEs without waiting for your next manual audit.
Exécutez npm audit ou npm ls <package> pour identifier où se trouvent les packages vulnérables dans votre arbre de dépendances. Le lockfile (package-lock.json ou yarn.lock) est la source de vérité — il liste la version résolue exacte de chaque dépendance transitive. Des outils automatisés comme CVE OptiBot scannent le lockfile directement contre OSV.dev et la base de données NVD, vous alertant sur les nouvelles CVE sans attendre votre prochain audit manuel.
Should I use nuxt-security on every Nuxt project?
Devrais-je utiliser nuxt-security sur chaque projet Nuxt ?
Yes, for any production Nuxt 3 application. The nuxt-security module implements OWASP Top 10 protections and Helmet-style security headers with a single module install. It handles CSP nonce generation for SSR, rate limiting via H3 middleware, CORS configuration, and CSRF protection — all concerns that you'd otherwise need to configure manually in Nitro.
Oui, pour toute application Nuxt 3 en production. Le module nuxt-security implémente les protections OWASP Top 10 et les en-têtes de sécurité style Helmet avec une seule installation de module. Il gère la génération de nonces CSP pour SSR, la limitation de débit via middleware H3, la configuration CORS, et la protection CSRF — tous des aspects que vous devriez sinon configurer manuellement dans Nitro.
Monitor Your Vue & Nuxt Dependencies Automatically
Surveillez Vos Dépendances Vue & Nuxt Automatiquement
CVE OptiBot scans your package-lock.json and yarn.lock daily against OSV.dev and the NVD database. Get alerts the moment a new Nuxt CVE is published — before it becomes an incident. No code access required.
CVE OptiBot scanne vos package-lock.json et yarn.lock chaque jour contre OSV.dev et la base de données NVD. Recevez des alertes dès qu’une nouvelle CVE Nuxt est publiée — avant qu’elle ne devienne un incident. Aucun accès au code requis.
Related articles:
Articles liés :
npm Supply Chain Attacks in 2026 → Attaques Supply Chain npm en 2026 → React Security Vulnerabilities in 2026 → Vulnérabilités React en 2026 → Svelte & SvelteKit Security Vulnerabilities in 2026 → Vulnérabilités Svelte & SvelteKit en 2026 → CVE Monitoring → Monitoring CVE → npm Vulnerabilities → Vulnérabilités npm →