Axios: DoS & Header Injection via Prototype Pollution Read-Side Gadgets in axios merge functions
Exploitation and risk
Source statusCISA KEV lists vulnerabilities known to be exploited. FIRST EPSS estimates the likelihood of exploitation in the next 30 days. An unavailable score does not mean zero risk.
Which CVEs have scores here?
This view includes predictions for CVE identifiers explicitly listed in public NuGet advisories. Microsoft release pages have their own prediction coverage. Check source status for the scope and latest checks.
No exploitation or prediction data is available here for these CVEs. This does not mean they are safe or unlikely to be exploited.
cve-program · CVE-2026-44490
PublishedAxios is a promise based HTTP client for the browser and Node.js. Prior to 0.32.0 and 1.16.0, axios 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), axios silently picks up the polluted values. (1) 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. (2) 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. This vulnerability is fixed in 0.32.0 and 1.16.0.
- Source published
- 11 Jun 2026 15:36:13 UTC
- Source modified
- 11 Jun 2026 17:23:44 UTC
- Saved here
- 23 Oct 2026 15:48:27 UTC
- Source terms
- CVE Program Terms of Use
Original source record · Cite this exact observation · Complete original publisher JSON
Source: cve-program · CVE Program Terms of Use. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
CVSS 3.1 · 4.8 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L
euvd · EUVD-2026-36260
PublishedAxios is a promise based HTTP client for the browser and Node.js. Prior to 0.32.0 and 1.16.0, axios 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), axios silently picks up the polluted values. (1) 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. (2) 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. This vulnerability is fixed in 0.32.0 and 1.16.0.
Additional publisher context
EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON.
Original publisher date fields
datePublished: Jun 11, 2026, 3:36:13 PM
dateUpdated: Jun 11, 2026, 5:23:44 PM
2 related source bulletins · separate from aliases
NCSC-2026-0325: Kwetsbaarheden verholpen in Atlassian producten
CVE-2021-44906 · CVE-2022-3517 · CVE-2023-45133 · CVE-2025-14813 · CVE-2026-0603 · CVE-2026-2332 · CVE-2026-3505 · CVE-2026-4800 · CVE-2026-6321 · CVE-2026-6322 · CVE-2026-10050 · CVE-2026-12143 · CVE-2026-12151 · CVE-2026-12802 · CVE-2026-12803 · CVE-2026-12816 · CVE-2026-13149 · CVE-2026-13506 · CVE-2026-13676 · CVE-2026-14257 · CVE-2026-14682 · CVE-2026-16221 · CVE-2026-18446 · CVE-2026-21582 · CVE-2026-24734 · CVE-2026-25639 · CVE-2026-27601 · CVE-2026-27606 · CVE-2026-29786 · CVE-2026-40983 · CVE-2026-40984 · CVE-2026-41284 · CVE-2026-41842 · CVE-2026-41845 · CVE-2026-41850 · CVE-2026-41851 · CVE-2026-41907 · CVE-2026-42033 · CVE-2026-42035 · CVE-2026-42041 · CVE-2026-42198 · CVE-2026-42583 · CVE-2026-42587 · CVE-2026-43513 · CVE-2026-44249 · CVE-2026-44486 · CVE-2026-44487 · CVE-2026-44488 · CVE-2026-44490 · CVE-2026-44492 · CVE-2026-44494 · CVE-2026-44495 · CVE-2026-44496 · CVE-2026-45416 · CVE-2026-45623 · CVE-2026-46625 · CVE-2026-47838 · CVE-2026-48043 · CVE-2026-48779 · CVE-2026-48801 · CVE-2026-50010 · CVE-2026-53434 · CVE-2026-54291 · CVE-2026-54512 · CVE-2026-54513 · CVE-2026-55685 · CVE-2026-55831 · CVE-2026-55833 · CVE-2026-56745 · CVE-2026-56819 · CVE-2026-58059 · CVE-2026-58060 · CVE-2026-59639 · CVE-2026-59642 · CVE-2026-59869 · CVE-2026-59871 · CVE-2026-59873 · CVE-2026-59874 · CVE-2026-59887 · CVE-2026-59901 · CVE-2026-67320 · CVE-2026-69152 · CVE-2026-69192
WID-SEC-W-2026-2923: Atlassian Produkte (Bamboo, Bitbucket, Confluence, Crucible, Fisheye, und Jira): Mehrere Schwachstellen
CVE-2019-13990 · CVE-2021-44906 · CVE-2022-1471 · CVE-2022-23521 · CVE-2022-3517 · CVE-2022-41903 · CVE-2023-22518 · CVE-2023-22522 · CVE-2023-22523 · CVE-2023-22524 · CVE-2023-22527 · CVE-2023-45133 · CVE-2023-46604 · CVE-2025-14813 · CVE-2026-0603 · CVE-2026-10050 · CVE-2026-12143 · CVE-2026-12151 · CVE-2026-12802 · CVE-2026-12803 · CVE-2026-12816 · CVE-2026-13149 · CVE-2026-13506 · CVE-2026-13676 · CVE-2026-14257 · CVE-2026-14682 · CVE-2026-16221 · CVE-2026-18446 · CVE-2026-21582 · CVE-2026-2332 · CVE-2026-24734 · CVE-2026-25639 · CVE-2026-27601 · CVE-2026-27606 · CVE-2026-29786 · CVE-2026-3505 · CVE-2026-40983 · CVE-2026-40984 · CVE-2026-41284 · CVE-2026-41842 · CVE-2026-41845 · CVE-2026-41850 · CVE-2026-41851 · CVE-2026-41907 · CVE-2026-42033 · CVE-2026-42035 · CVE-2026-42041 · CVE-2026-42198 · CVE-2026-42583 · CVE-2026-42587 · CVE-2026-43513 · CVE-2026-44249 · CVE-2026-44486 · CVE-2026-44487 · CVE-2026-44488 · CVE-2026-44490 · CVE-2026-44492 · CVE-2026-44494 · CVE-2026-44495 · CVE-2026-44496 · CVE-2026-45416 · CVE-2026-45623 · CVE-2026-46625 · CVE-2026-47838 · CVE-2026-4800 · CVE-2026-48043 · CVE-2026-48779 · CVE-2026-48801 · CVE-2026-50010 · CVE-2026-53434 · CVE-2026-54291 · CVE-2026-54512 · CVE-2026-54513 · CVE-2026-55685 · CVE-2026-55831 · CVE-2026-55833 · CVE-2026-56745 · CVE-2026-56819 · CVE-2026-58059 · CVE-2026-58060 · CVE-2026-59639 · CVE-2026-59642 · CVE-2026-59869 · CVE-2026-59871 · CVE-2026-59873 · CVE-2026-59874 · CVE-2026-59887 · CVE-2026-59901 · CVE-2026-6321 · CVE-2026-6322 · CVE-2026-67320 · CVE-2026-69152 · CVE-2026-69192
- Source published
- Jun 11, 2026, 3:36:13 PM (timezone not stated)
- Source modified
- Jun 11, 2026, 5:23:44 PM (timezone not stated)
- Saved here
- 13 Nov 2026 13:01:06 UTC
- Source terms
- ENISA EUVD · source terms and attribution apply
Original source record · Cite this exact observation · Complete original publisher JSON
Source: euvd · ENISA EUVD · source terms and attribution apply. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
EUVD CVSS 3.1 · 4.8 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L
nvd · CVE-2026-44490
PublishedAxios is a promise based HTTP client for the browser and Node.js. Prior to 0.32.0 and 1.16.0, axios 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), axios silently picks up the polluted values. (1) 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. (2) 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. This vulnerability is fixed in 0.32.0 and 1.16.0.
Additional publisher context
NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON.
Source analysis status: Analyzed
Weakness classifications: CWE-1321
Original publisher date fields
published: 2026-06-11T17:16:33.027
lastModified: 2026-06-17T10:50:43.067
1 source CPE criteria · context only
- cpe:2.3:a:axios:axios:*:*:*:*:*:node.js:*:*
The original JSON retains the logical configuration operators, exclusions and version bounds.
- Source published
- 11 Jun 2026 17:16:33 UTC
- Source modified
- 17 Jun 2026 10:50:43 UTC
- Saved here
- 25 Oct 2026 10:17:27 UTC
- Source terms
- NIST NVD usage terms; underlying source attribution retained
Original source record · Cite this exact observation · Complete original publisher JSON
Source: nvd · NIST NVD usage terms; underlying source attribution retained. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
CVSS 3.1 · [email protected] · Secondary · 4.8 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L
CVSS 3.1 · [email protected] · Primary · 8.2 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:H
osv · GHSA-898c-q2cr-xwhg
Published## Summary axios `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: 1. **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. 2. **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. ## Affected Properties | Polluted slot | Effect | |---|---| | `Object.prototype.common` | injects headers on every method | | `Object.prototype.delete` / `.head` / `.post` / `.put` / `.patch` / `.query` | injects headers on the matching method | | `Object.prototype.get` | every axios request throws `TypeError: Getter must be a function` from `mergeConfig.js:26` | | `Object.prototype.set` | every axios request throws `TypeError: Setter must be a function` from `mergeConfig.js:26` | Per-request headers (`axios.request(url, { headers: {...} })`) overwrite polluted entries. Polluting `Object.prototype.get` triggers the crash before any header is built. ## Proof of Concept ```javascript const axios = require('axios'); // Finding A - header injection Object.prototype.common = { 'X-Poisoned': 'yes' }; await axios.get('http://api.example.com/users'); // Wire request carries `X-Poisoned: yes`. // Finding B - crash DoS Object.prototype.get = { something: 'anything' }; await axios.get('http://api.example.com/users'); // TypeError: Getter must be a function: #<Object> // at Function.defineProperty (<anonymous>) // at mergeConfig (lib/core/mergeConfig.js:26:10) ``` ## Impact - **Server hang** (`Content-Length: 99999`): receiver waits for a body that never arrives. Affects requests with a body. - **CL+TE conflict** (`Transfer-Encoding: chunked` rides alongside axios's auto `Content-Length`): receiver rejects with `400 Bad Request`. Affects requests with a body. - **Response suppression** (`If-None-Match: *`): receiver returns empty `304 Not Modified`. Affects GET / HEAD. - **Crash DoS** (`Object.prototype.get` / `.set`): every axios request fails synchronously with `TypeError`, not `AxiosError`, so handlers filtering on `error.isAxiosError` mishandle the failure. ## Attack Flow ```mermaid flowchart TD ROOT["Polluted Object.prototype<br/>via upstream gadget (e.g. lodash <= 4.17.10 _.merge / CVE-2018-16487)<br/>axios <= 1.15.2"] ROOT --> CLASS_A["A. Arbitrary HTTP Header Injection<br/>Polluted defaults.headers slot rides along on every outbound axios request"] ROOT --> CLASS_B["B. Crash DoS via Object.prototype.get / .set<br/>Polluted descriptor breaks Object.defineProperty in mergeConfig"] CLASS_A --> PRE_A["Precondition: header not set per-request by the app<br/>Injected via defaults.headers slot<br/>(common, delete, head, post, put, patch, query)"] PRE_A --> PA1["Response Suppression<br/>Trigger: common = {If-None-Match: *}<br/>Affects GET / HEAD"] PA1 --> SA1["DoS<br/>304 Not Modified empty"] PRE_A --> PA2["Server Hang<br/>Trigger: common = {Content-Length: 99999}<br/>Affects requests with body"] PA2 --> SA2["DoS<br/>connection hang"] PRE_A --> PA3["CL+TE Conflict<br/>Trigger: common = {Transfer-Encoding: chunked}<br/>Affects requests with body"] PA3 --> SA3["DoS<br/>400 Bad Request"] CLASS_B --> SB1["DoS<br/>TypeError: Getter / Setter must be a function<br/>Crashes every axios request, not only GET"] %% Styles style ROOT fill:#f87171,stroke:#991b1b,color:#fff style CLASS_A fill:#fb923c,stroke:#9a3412,color:#fff style CLASS_B fill:#fb923c,stroke:#9a3412,color:#fff style PRE_A fill:#e2e8f0,stroke:#64748b,color:#1e293b style PA1 fill:#fbbf24,stroke:#92400e,color:#000 style PA2 fill:#fbbf24,stroke:#92400e,color:#000 style PA3 fill:#fbbf24,stroke:#92400e,color:#000 style SA1 fill:#ef4444,stroke:#991b1b,color:#fff style SA2 fill:#ef4444,stroke:#991b1b,color:#fff style SA3 fill:#ef4444,stroke:#991b1b,color:#fff style SB1 fill:#ef4444,stroke:#991b1b,color:#fff ``` ## Root Cause **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, ...)`). **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. ## Suggested Fix Use 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`. ## Resources - [CVE-2018-16487](https://nvd.nist.gov/vuln/detail/CVE-2018-16487) - `lodash.merge` prototype pollution in `lodash <= 4.17.10` - [CWE-1321](https://cwe.mitre.org/data/definitions/1321.html) - Improperly Controlled Modification of Object Prototype Attributes
- Source published
- 29 May 2026 15:54:57 UTC
- Source modified
- 10 Sep 2026 03:51:04 UTC
- Saved here
- 24 Oct 2026 13:17:17 UTC
- Source terms
- GitHub Advisory Database · CC-BY-4.0
Original source record · Cite this exact observation · Complete original publisher JSON
Source: osv · GitHub Advisory Database · CC-BY-4.0. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
CVSS_V3 · CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L
Publisher rating · MODERATE