{"id":"GHSA-gj2h-2fpw-fhv9","revision":null,"records":[{"revision":"510d64af7a4041da9fd94eaa5934afdf","observedAt":"2026-11-14T03:56:54.576+00:00","statement":{"source":"cve-program","id":"CVE-2026-123808","aliases":[],"title":"Nuxt UI: UAuthForm / UForm SSR markup omits `method`, leaking credentials via GET if submitted before hydration","description":"Nuxt UI is an intuitive Vue UI library powered by Reka UI and Tailwind CSS. Prior to 4.8.1, the server-rendered form element produced by UForm in src/runtime/components/Form.vue omits the method and action attributes and relies solely on the hydrated @submit.prevent handler to stop native submission. UAuthForm composes UForm and can render named credential fields, including an input with type password, inside the same markup. If a user submits before Vue hydration completes, or when the client bundle is blocked or unavailable, the browser performs its default GET submission and serializes the named fields into the current URL query string. The credentials can then appear in the address bar, browser history, reverse-proxy, CDN, or WAF request logs, and Referer headers sent with same-origin subresource requests. This issue is fixed in version 4.8.1.","state":0,"publishedAt":"2026-11-09T20:41:49.528+00:00","modifiedAt":"2026-11-14T02:16:10.238+00:00","affected":[{"ecosystem":"Vendor product","name":"ui","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"nuxt\",\n                    \"product\": \"ui\",\n                    \"versions\": [\n                        {\n                            \"version\": \"< 4.8.1\",\n                            \"status\": \"affected\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 3.1","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N","score":5.3,"severity":"MEDIUM"}],"references":["https://github.com/nuxt/ui/security/advisories/GHSA-gj2h-2fpw-fhv9","https://github.com/nuxt/ui/pull/6512","https://github.com/nuxt/ui/commit/7a0825ad6a17627ce4c6dd860df3cebb7cf1d813","https://github.com/nuxt/ui/releases/tag/v4.8.1"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-123808","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-123808","identifiers":["CVE-2026-123808"]},"retained":false,"historicalAffected":[]},{"revision":"d852d37237ca4802b08dcb647fb82ebf","observedAt":"2026-11-14T11:58:24.502+00:00","statement":{"source":"euvd","id":"EUVD-2026-120439","aliases":["CVE-2026-123808"],"title":"Nuxt UI is an intuitive Vue UI library powered by Reka UI and Tailwind CSS. Prior to 4.8.1, the server-rendered form element produced by UForm in src/runtime/components/Form.vue omits the method and action attributes and relies solely on th…","description":"Nuxt UI is an intuitive Vue UI library powered by Reka UI and Tailwind CSS. Prior to 4.8.1, the server-rendered form element produced by UForm in src/runtime/components/Form.vue omits the method and action attributes and relies solely on the hydrated @submit.prevent handler to stop native submission. UAuthForm composes UForm and can render named credential fields, including an input with type password, inside the same markup. If a user submits before Vue hydration completes, or when the client bundle is blocked or unavailable, the browser performs its default GET submission and serializes the named fields into the current URL query string. The credentials can then appear in the address bar, browser history, reverse-proxy, CDN, or WAF request logs, and Referer headers sent with same-origin subresource requests. This issue is fixed in version 4.8.1.","state":0,"publishedAt":null,"modifiedAt":null,"affected":[],"metrics":[{"system":"EUVD CVSS 3.1","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N","score":5.3,"severity":null}],"references":["https://github.com/nuxt/ui/security/advisories/GHSA-gj2h-2fpw-fhv9","https://github.com/nuxt/ui/pull/6512","https://github.com/nuxt/ui/commit/7a0825ad6a17627ce4c6dd860df3cebb7cf1d813","https://github.com/nuxt/ui/releases/tag/v4.8.1"],"sourceUrl":"https://euvd.enisa.europa.eu/vulnerability/EUVD-2026-120439","license":"ENISA EUVD · source terms and attribution apply","enrichment":{"sourceStatus":null,"weaknesses":[],"productCriteria":[],"sourceDates":{"datePublished":"Nov 9, 2026, 8:41:49 PM","dateUpdated":"Nov 14, 2026, 2:16:10 AM"},"relatedAdvisories":[],"note":"EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON."},"key":"euvd:EUVD-2026-120439","identifiers":["EUVD-2026-120439","CVE-2026-123808"]},"retained":false,"historicalAffected":[]},{"revision":"5c435fcf91334712a62ff1c7b5ae4fcd","observedAt":"2026-11-14T12:57:57.313+00:00","statement":{"source":"nvd","id":"CVE-2026-123808","aliases":[],"title":"Nuxt UI is an intuitive Vue UI library powered by Reka UI and Tailwind CSS. Prior to 4.8.1, the server-rendered form element produced by UForm in src/runtime/components/Form.vue omits the method and action attributes and relies solely on th…","description":"Nuxt UI is an intuitive Vue UI library powered by Reka UI and Tailwind CSS. Prior to 4.8.1, the server-rendered form element produced by UForm in src/runtime/components/Form.vue omits the method and action attributes and relies solely on the hydrated @submit.prevent handler to stop native submission. UAuthForm composes UForm and can render named credential fields, including an input with type password, inside the same markup. If a user submits before Vue hydration completes, or when the client bundle is blocked or unavailable, the browser performs its default GET submission and serializes the named fields into the current URL query string. The credentials can then appear in the address bar, browser history, reverse-proxy, CDN, or WAF request logs, and Referer headers sent with same-origin subresource requests. This issue is fixed in version 4.8.1.","state":0,"publishedAt":"2026-11-09T22:18:36.823+00:00","modifiedAt":"2026-11-14T03:17:23.48+00:00","affected":[],"metrics":[{"system":"CVSS 3.1 · security-advisories@github.com · Secondary","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N","score":5.3,"severity":"MEDIUM"}],"references":["https://github.com/nuxt/ui/commit/7a0825ad6a17627ce4c6dd860df3cebb7cf1d813","https://github.com/nuxt/ui/pull/6512","https://github.com/nuxt/ui/releases/tag/v4.8.1","https://github.com/nuxt/ui/security/advisories/GHSA-gj2h-2fpw-fhv9"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-123808","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Awaiting Analysis","weaknesses":["CWE-200","CWE-598"],"productCriteria":[],"sourceDates":{"published":"2026-11-09T22:18:36.823","lastModified":"2026-11-14T03:17:23.480"},"relatedAdvisories":[],"note":"NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON."},"key":"nvd:CVE-2026-123808","identifiers":["CVE-2026-123808"]},"retained":false,"historicalAffected":[]},{"revision":"4e77003c6aa3473c8a86a2a995d10530","observedAt":"2026-11-10T11:21:54.012+00:00","statement":{"source":"osv","id":"GHSA-gj2h-2fpw-fhv9","aliases":["CVE-2026-123808"],"title":"@nuxt/ui: UAuthForm / UForm SSR markup omits `method`, leaking credentials via GET if submitted before hydration","description":"### Summary\n\n`UForm` and `UAuthForm` render a server-side `<form>` element with no `method` and no `action` attribute, relying on a hydrated `@submit.prevent` handler to intercept submission. If a user submits the form before Vue hydration has attached the handler (autofill plus Enter on a slow network, JS bundle blocked by CSP or CDN failure, etc.), the browser performs the native default: a `GET` to the current URL with every named field, including `<input type=\"password\">`, serialised into the query string.\n\n### Details\n\n`src/runtime/components/Form.vue` (around the template's `<form>` element) emits:\n\n```vue\n<component\n  :is=\"parentBus ? 'div' : 'form'\"\n  :id=\"formId\"\n  ref=\"formRef\"\n  :class=\"ui({ class: [uiProp?.base, props.class] })\"\n  @submit.prevent=\"onSubmitWrapper\"\n>\n```\n\nNo `method`, no `action`. `@submit.prevent` is the only thing stopping native submission, and it only exists after hydration. `UAuthForm` composes `UForm` and inherits the same shape.\n\nThe SSR snapshot of `UAuthForm` (`test/components/__snapshots__/AuthForm.spec.ts.snap`) shows the rendered markup, with `<input type=\"password\" name=\"password\">` inside a `<form>` that has no `method`.\n\n### Proof of concept\n\nReported by @nimonian:\n\n1. Create a minimal Nuxt app with a `UAuthForm`.\n2. Build for production and visit in a browser with network throttling at 4G or slower.\n3. Enter credentials.\n4. Submit (or let autofill + Enter fire before hydration).\n\nThe URL becomes `/login?email=…&password=…`. Reproducible deterministically in Playwright by triggering submit immediately on `load`.\n\n### Impact\n\nAny application using `UAuthForm` (or `UForm` with credential-shaped fields) as documented. The cleartext password lands in:\n\n- the address bar,\n- `window.history`,\n- the `Referer` header of every same-origin subresource fetched from the resulting URL,\n- access logs of any reverse proxy, CDN, or WAF that records request URLs.\n\n### Patch\n\nDefault the rendered `<form>` to `method=\"post\"` so the pre-hydration fallback submits as POST rather than GET. Vue's `@submit.prevent` still intercepts the hydrated case; the attribute only matters in the race window. Applications that explicitly want native GET submission can opt back in by passing `method=\"get\"`.\n\n### Credit\n\nReported by @nimonian. Originally filed as `GHSA-92g7-2fpq-hmq8` against `nuxt/nuxt`; moved here because the affected code lives in `@nuxt/ui`.","state":0,"publishedAt":"2026-07-02T20:16:12+00:00","modifiedAt":"2026-11-10T10:56:19.0060493+00:00","affected":[{"ecosystem":"npm","name":"@nuxt/ui","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"4.8.1"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V4","vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"MODERATE"}],"references":["https://github.com/nuxt/ui/security/advisories/GHSA-gj2h-2fpw-fhv9","https://github.com/nuxt/ui/pull/6512","https://github.com/nuxt/ui","https://github.com/nuxt/ui/releases/tag/v4.8.1"],"sourceUrl":"https://github.com/advisories/GHSA-gj2h-2fpw-fhv9","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-gj2h-2fpw-fhv9","identifiers":["GHSA-gj2h-2fpw-fhv9","CVE-2026-123808"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-11-15T20:44:14.5536813+00:00","complete":true,"records":1781,"lastAttemptAt":"2026-11-15T20:44:14.5536813+00:00","lastSuccessAt":"2026-11-15T20:44:14.7860515+00:00","error":null,"lastVerifiedAt":"2026-11-15T20:44:14.7860528+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-7de4d7559a5263003f03d9f70577ab06f92ba4178309f26fce53e22a4a959294-f8a60997f6dce668b540a4f14f94592eb9e1c16849f01d8d6e2c78b68e21421f","complete":true,"records":425849,"lastAttemptAt":"2026-11-15T20:44:12.7538826+00:00","lastSuccessAt":"2026-11-15T20:44:12.7235178+00:00","error":null,"lastVerifiedAt":"2026-11-15T20:44:12.7538826+00:00","snapshotPublishedAt":"2026-11-15T20:32:11+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-d1da285a9bc641e2becc5e6c7fa6e0bc","complete":false,"records":13821,"lastAttemptAt":"2026-11-15T20:55:04.9136593+00:00","lastSuccessAt":"2026-11-15T20:55:04.909+00:00","error":"81 identifier lookups failed; latest failures include AccessDenied (HTTP 403). Other identifiers were checked independently.","lastVerifiedAt":"2026-11-15T20:55:04.909+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13793,"expectedIdentifiers":13874,"failedIdentifiers":81},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-11-15T20:44:14.5536813+00:00","complete":true,"records":1125,"lastAttemptAt":"2026-11-15T20:44:14.5536813+00:00","lastSuccessAt":"2026-11-15T20:44:14.7868578+00:00","error":null,"lastVerifiedAt":"2026-11-15T20:44:14.7868581+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-83941b66a7344db698aff661acaa6ebf","complete":true,"records":13833,"lastAttemptAt":"2026-11-15T20:44:58.4504738+00:00","lastSuccessAt":"2026-11-15T20:44:58.441+00:00","error":null,"lastVerifiedAt":"2026-11-15T20:44:58.441+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13874,"expectedIdentifiers":13874,"failedIdentifiers":0},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-64eea06dbd27de8464d5dbce1b78cc794cc59e2d901516ae0d3ea76e624cdae0","complete":true,"records":9955,"lastAttemptAt":"2026-11-15T20:44:14.4134166+00:00","lastSuccessAt":"2026-11-14T13:57:23.1208135+00:00","error":null,"lastVerifiedAt":"2026-11-15T20:44:14.4134166+00:00","snapshotPublishedAt":"2026-11-14T13:17:57+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-f4424d7d4861b1af1404bd15abcb83f295dcd003412a9340ca99dc8200aa148a","complete":true,"records":2014,"lastAttemptAt":"2026-11-15T20:44:13.8592897+00:00","lastSuccessAt":"2026-11-13T19:57:08.2864435+00:00","error":null,"lastVerifiedAt":"2026-11-15T20:44:13.8592897+00:00","snapshotPublishedAt":"2026-11-13T19:33:10+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-6086d649bcb454cdf302d7d9275177bda73550e1b6e446b3520e9b6266d3582c","complete":true,"records":3148,"lastAttemptAt":"2026-11-15T20:44:14.44199+00:00","lastSuccessAt":"2026-11-15T11:05:17.1034234+00:00","error":null,"lastVerifiedAt":"2026-11-15T20:44:14.44199+00:00","snapshotPublishedAt":"2026-11-15T10:03:04+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-ff18f36f13fcca3a20a3fb9274b59b8872d18869a99071730e1e79b625c8f612","complete":true,"records":232475,"lastAttemptAt":"2026-11-15T20:44:14.2324599+00:00","lastSuccessAt":"2026-11-15T11:05:10.4195883+00:00","error":null,"lastVerifiedAt":"2026-11-15T20:44:14.2324599+00:00","snapshotPublishedAt":"2026-11-15T10:33:06+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}