Skip to content

Update dependency nuxt-og-image to v6 [SECURITY]#88

Open
renovate[bot] wants to merge 1 commit intomainfrom
renovate/npm-nuxt-og-image-vulnerability
Open

Update dependency nuxt-og-image to v6 [SECURITY]#88
renovate[bot] wants to merge 1 commit intomainfrom
renovate/npm-nuxt-og-image-vulnerability

Conversation

@renovate
Copy link
Copy Markdown
Contributor

@renovate renovate bot commented Mar 31, 2026

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
nuxt-og-image (source) 5.1.126.2.5 age confidence

GitHub Vulnerability Alerts

CVE-2026-34404

Product: Nuxt OG Image
Version: 6.1.2
CWE-ID: CWE-404: Improper Resource Shutdown or Release
Description: Failure to limit the length and width of the generated image results in a denial of service.
Impact: Denial of service
Exploitation condition: An external user
Mitigation: Implement a limitation on the width and length of the generated image.
Researcher: Dmitry Prokhorov (Positive Technologies)

Research

During the analysis of the nuxt-og-image package, which is shipped with the nuxt-seo package, a zero‑day vulnerability was discovered.
This research revealed that the image‑generation component by the URI: /_og/d/ (and, in older versions, /og-image/) contains a Denial of Service (DoS) vulnerability. The issue arises because there is no restriction on the width and height parameters of the generated image. The vulnerability was reproduced using the standard configuration and the default templates.

Listing 1. The content of the configuration file nuxt.config.ts

export default defineNuxtConfig({
  modules: ['nuxt-og-image'],
  devServer: {
    host: 'web-test.local',
    port: 3000
  },
  site: {
    url: 'http://web-test.local:3000',
  },
  ogImage: {
    fonts: [
      'Inter:400', 
      'Inter:700'
    ],
  }
})

Vulnerability reproduction

To demonstrate the proof‑of‑concept, a request should be sent with the increased width and height parameters. This will cause a delay and exhaust the server’s resources during image generation.

Listing 2. HTTP-request example

GET /_og/d/og.png?width=20000&height=20000 HTTP/1.1
Host: web-test.local:3000

Figure 1. HTTP-response: denial-of-service error
image

After sending a HTTP-request, the test server's memory was exhausted.

Figure 2. Video memory exhausted error
image

Credits

Researcher: Dmitry Prokhorov (Positive Technologies)

GHSA-pqhr-mp3f-hrpp

Product: Nuxt OG Image
Version: < 6.2.5
CWE-ID: CWE-918: Server-Side Request Forgery

Description

The image generation endpoint (/_og/d/) accepts user-controlled parameters that are passed to the server-side renderer without proper validation or filtering. An attacker can trigger server-side requests to internal network addresses through multiple vectors.

Impact

  • Scanning internal ports and services inaccessible from the outside
  • Reading sensitive data from cloud infrastructure metadata services (tokens, credentials) when verbose error output is enabled

Attack Vectors

Three distinct vectors were identified, all exploiting the same underlying lack of URL validation:

Vector 1: CSS background-image injection via style parameter

GET /_og/d/og.png?style=background-image:+url('http://127.0.0.1:8888/secret')

Vector 2: <img src> injection via html parameter

GET /_og/d/og.png?html=<img src="http://127.0.0.1:8888/secret">

When verbose errors are enabled, the response content is leaked in base64-encoded error messages.

Vector 3: SVG <image href> injection via html parameter

GET /_og/d/og.png?html=<svg><image href="http://127.0.0.1:8888/secret"></svg>

Mitigation

Fixed in v6.2.5. The image source plugin now blocks requests to private IP ranges (IPv4/IPv6), loopback addresses, link-local addresses, and cloud metadata endpoints. Decimal/hexadecimal IP encoding bypasses are also handled.

Credits

Researcher: Dmitry Prokhorov (Positive Technologies)

CVE-2026-34405

Product: Nuxt OG Image
Version: 6.1.2
CWE-ID: CWE-79: Improper Neutralization of Input During Web Page Generation
Description: Incorrect parsing of GET parameters leads to the possibility of HTML injection and JavaScript code injection.
Impact: Client-Side JavaScript Execution
Exploitation condition: An external user
Mitigation: Correct the logic of parsing GET parameters and their subsequent implementation into the generated page.
Researcher: Dmitry Prokhorov (Positive Technologies)

Research

During the analysis of the nuxt-og-image package, which is shipped with the nuxt-seo package, a zero‑day vulnerability was discovered.
This research revealed that the image‑generation component by the URI: /_og/d/ (and, in older versions, /og-image/) contains a vulnerability that allows injection of arbitrary attributes into the HTML page body. The vulnerability was reproduced using the standard configuration and the default templates.

Listing 1. The content of the configuration file nuxt.config.ts

export default defineNuxtConfig({
  modules: ['nuxt-og-image'],
  devServer: {
    host: 'web-test.local',
    port: 3000
  },
  site: {
    url: 'http://web-test.local:3000',
  },
  ogImage: {
    fonts: [
      'Inter:400', 
      'Inter:700'
    ],
  }
})

Vulnerability reproduction

To demonstrate the proof‑of‑concept, follow the URI: /_og/d/og.html?width=1000&height=1000&onmouseover=alert(document.cookie)&autofocus
The injected parameters onmouseover=alert(document.cookie) and autofocus are treated as attributes and are inserted directly into the generated HTML page.

Listing 2. HTTP-request example

GET /_og/d/og.html?width=1000&height=1000&onmouseover=alert(document.cookie) HTTP/1.1
Host: web-test.local:3000

Figure 1. The injected attribute in the HTML body
image

Figure 2. JavaScript code execution
image

Credits

Researcher: Dmitry Prokhorov (Positive Technologies)


Release Notes

nuxt-modules/og-image (nuxt-og-image)

v6.2.5

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v6.2.4

Compare Source

compare changes

🩹 Fixes
  • Hydration-issue warning due to SSR generated DateTime value (#​535)
  • Sanitize component props (#​543)
  • Harden security defaults (#​540)
  • Whitelist component props to prevent cache key DoS (#​544)
🏡 Chore
❤️ Contributors

v6.2.3

Compare Source

   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v6.2.2

Compare Source

compare changes

🔥 Performance
  • devtools: Drop json-editor-vue (14a585b7)
🩹 Fixes
  • cloudflare: Detect legacy assets mode (7f60a480)
🏡 Chore
❤️ Contributors

v6.2.1

Compare Source

compare changes

🏡 Chore
❤️ Contributors

v6.2.0

Compare Source

compare changes

🩹 Fixes
  • Missing compatibility config (4541033c)
  • devtools: Broken resolution (57ac2647)
🏡 Chore
❤️ Contributors

v6.1.2

Compare Source

compare changes

🚀 Enhancements
  • content: Add defineOgImageSchema() composable (#​520)
🩹 Fixes
  • Update pnpm-lock.yaml (0784c378)
  • Broken slash decoding in some cases (6f8ac765)
  • client: Resolve layer-devtools path via import.meta.resolve (dd4e0578)
  • cloudflare: Resolve fonts via localFetch when ASSETS binding unavailable (#​527)
  • B64 encode props with URL-sensitive characters (#​530)
  • Resolve CI issues (f3e3045b)
  • Use explicit imports mapping for #nuxtseo-shared (08594505)
  • Use direct nuxtseo-shared/runtime imports, bump to ^0.3.0 (31b1a991)
  • Resolve CI failures in lint, build, typecheck, and tests (47e85d35)
  • Use dot-notation for ambiguous CalcTest component in type test (3ba63fef)
💅 Refactors
  • Migrate to nuxtseo-shared for shared utilities (f909f014)
  • client: Migrate devtools to nuxtseo-shared layer (48c15483)
  • Use published nuxtseo-layer-devtools package (74393aa3)
  • Remove dead defensive prerender initialization (3b0dae14)
  • Use nuxtseo-shared subpath exports, bump to ^0.5.0 (bd50740f)
  • Migrate to nuxtseo-shared (#​521)
🏡 Chore
✅ Tests
  • Update cloudflare-takumi snapshots after template redesign (66c2a80a)
❤️ Contributors

v6.1.1

Compare Source

compare changes

🩹 Fixes
  • Auto-detect NuxtHub KV for cache storage (#​517)
  • tw4: Use safe module resolution to prevent throws for unresolvable plugins (#​519)
🏡 Chore
❤️ Contributors

v6.1.0

Compare Source

compare changes

🩹 Fixes
  • Add missing option keys to URL encoding and prop separation (#​516)
  • Defer x-nitro-prerender header to prevent stale hash URLs during prerender (#​514)
  • Base64-encode non-ASCII values in URL path params (#​515)
🏡 Chore
❤️ Contributors

v6.0.7

Compare Source

compare changes

🚀 Enhancements
  • devtools: Add production preview toggle (#​509)
  • cli: Add create and switch commands with DX improvements (#​508)
  • devtools: Add component creation from empty state (#​510)
🩹 Fixes
  • encoding: Avoid pre decoded params to be truncated (#​504)
  • fonts: Detect font families from script setup computed properties (#​507)
  • devtools: Use actual content width for preview scaling (#​506)
  • Recover from v5 defineOgImage syntax (1e882060)
🏡 Chore
❤️ Contributors

v6.0.6

Compare Source

compare changes

🩹 Fixes
  • Broken windows path resolutions (dd1ae90b)
🏡 Chore
❤️ Contributors

v6.0.5

Compare Source

compare changes

🩹 Fixes
  • Prevent crash when defineOgImage runs client-side during layout transitions (#​502)
  • takumi: Use real font family names for correct font-weight matching (#​503)
🏡 Chore
❤️ Contributors

v6.0.4

Compare Source

compare changes

🏡 Chore
❤️ Contributors

v6.0.3

Compare Source

compare changes

🩹 Fixes
🏡 Chore
❤️ Contributors

v6.0.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v6.0.1

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v6.0.0

Compare Source

Nuxt OG Image v6 is the next major release.

Nuxt OG Image v6 brings a complete overhaul focused on performance, modern tooling, and developer experience.

📣 Highlights

  • 🚀 Takumi - Takumi is now the recommended renderer, offering 2-10x faster image generation with the same feature set as Satori
  • 🎨 First-class CSS support - Tailwind v4, UnoCSS, CSS variables, and Nuxt UI v3 colors all just work out of the box
  • 🖥️ Redesigned DevTools - improved OG image debugging experience with better previews, accessibility, and Bluesky social card support

📖 Migration Guide

Full migration guide: https://nuxtseo.com/og-image/migration-guide/v6

Quick Migration
npx nuxt-og-image migrate v6

Notable Changes

🚀 Takumi Renderer (Recommended)

Takumi is a Rust-based renderer that directly rasterizes to PNG/JPEG/WebP - no SVG intermediate step. It's 2-10x faster than Satori+Resvg.

See PR #​414.

Takumi and Satori are feature-compatible within Nuxt OG Image - both support Tailwind CSS, custom fonts, emoji, edge runtimes, and all the same template features. The difference is speed: Takumi is always faster thanks to its Rust-based direct rasterization.

Use Takumi by creating components with the .takumi.vue suffix:

components/OgImage/MyTemplate.takumi.vue

See the Takumi docs for the full feature list.

🎨 First-Class CSS Support

Nuxt OG Image now has first-class support for multiple CSS approaches - not just Tailwind. All of these work out of the box with zero configuration:

See PR #​430.

  • Tailwind v4 - build-time class extraction with Tailwind's CSS engine, @theme values just work
  • UnoCSS - full UnoCSS support
  • CSS Variables - use your app's CSS custom properties directly in OG image templates
  • Nuxt UI v3 - semantic colors (primary, secondary, etc.) are automatically resolved

No configuration needed.

🖥️ Redesigned DevTools

The OG image DevTools have been completely overhauled:

  • Better image preview and debugging
  • More accessible interface
  • Improved error reporting and diagnostics
  • Bluesky social card support
⚡ Install Renderer Dependencies

Renderer dependencies are no longer bundled. Install what you need based on your renderer and runtime.

See PR #​415.

Takumi (recommended):

npm i @&#8203;takumi-rs/core # Node.js
npm i @&#8203;takumi-rs/wasm # Edge runtimes

Satori:

npm i satori @&#8203;resvg/resvg-js # Node.js
npm i satori @&#8203;resvg/resvg-wasm # Edge runtimes

Browser:

npm i playwright-core

Running nuxi dev will prompt you to install missing dependencies automatically.

🖼️ Multiple OG Images Per Page

Define multiple images with different dimensions for different platforms. Shared props are passed once and applied to all variants.

See PR #​305.

Shared Props with Variants (Recommended)

Pass shared props as the second argument and size variants as the third — no prop duplication needed:

defineOgImage('NuxtSeo', { title: 'My Page' }, [
  { key: 'og' }, // Default 1200x600 for Twitter/Facebook
  { key: 'whatsapp', width: 800, height: 800 }, // Square for WhatsApp
])

Per-variant props override shared props when needed:

defineOgImage('NuxtSeo', { title: 'My Page', description: 'Full description' }, [
  { key: 'og' },
  { key: 'whatsapp', width: 800, height: 800, props: { description: 'Short' } },
])
Array Syntax

Alternatively, pass all options inline per variant:

defineOgImage('NuxtSeo', [
  { props: { title: 'My Page' } },
  { props: { title: 'My Page' }, key: 'whatsapp', width: 800, height: 800 },
])
🔤 @​nuxt/fonts Integration

Custom fonts now use @​nuxt/fonts instead of the legacy ogImage.fonts config.

See PR #​432.

export default defineNuxtConfig({
  modules: ['@&#8203;nuxt/fonts', 'nuxt-og-image'],
  fonts: {
    families: [
      { name: 'Inter', weights: [400, 700], global: true }
    ]
  }
})

The global: true option is required for fonts to be available in OG Image rendering.

📦 Component Renderer Suffix

OG Image components now require a renderer suffix in their filename. This enables automatic renderer detection, multiple renderer variants, and tree-shaking.

See PR #​433.

# Before
components/OgImage/MyTemplate.vue

# After
components/OgImage/MyTemplate.takumi.vue # Recommended
components/OgImage/MyTemplate.satori.vue

Run the migration CLI to rename automatically:

npx nuxt-og-image migrate v6
🏷️ Community Templates Must Be Ejected

Community templates (NuxtSeo, SimpleBlog, etc.) are no longer bundled in production. Eject them to your project before building.

See PR #​426.

npx nuxt-og-image eject NuxtSeo

Templates continue to work in development without ejecting.

🔗 New URL Structure

OG Image URLs now use a Cloudinary-style format with options encoded in the path. This enables better CDN caching since identical options produce identical URLs.

See PR #​305.

v5 v6
/__og-image__/image/ /_og/d/
/__og-image__/static/ /_og/s/
   🚨 Breaking Changes
   🚀 Features
   🐞 Bug Fixes

Configuration

📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot added the Renovate label Mar 31, 2026
@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages bot commented Mar 31, 2026

Deploying launchpad with  Cloudflare Pages  Cloudflare Pages

Latest commit: 63a8768
Status:🚫  Build failed.

View logs

@renovate renovate bot force-pushed the renovate/npm-nuxt-og-image-vulnerability branch from 76aed3e to 63a8768 Compare April 1, 2026 21:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants