Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2026-44490 — axios

🟡 CVSS 4.8 — Medium ⚠️ Exploit Public CWE-1321 OSV
4.8
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

axios has DoS & Header Injection via Prototype Pollution Read-Side Gadgets in axios merge functions

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 re

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is high, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality none, integrity low, availability low.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: High — the attacker first has to win a race, learn a secret or otherwise prepare the target.
  • Privileges required: None — an unauthenticated stranger can try it.
  • User interaction: None — nobody has to be tricked into anything.
  • Scope: Unchanged — the damage stays inside the vulnerable component.
  • Confidentiality impact: None.
  • Integrity impact: Low — limited, and the attacker does not choose what is affected.
  • Availability impact: Low — limited, and the attacker does not choose what is affected.

Weakness class

CVE-2026-44490 is classified as CWE-1321: Prototype Pollution. Attacker input can modify an object prototype, changing behaviour for objects across the application.

Affected software

CVE-2026-44490 is recorded against 1 package.

  • axios

Timeline and source

Published on 29 May 2026 and last revised on 17 June 2026. A public exploit is known to exist, which raises the urgency of patching considerably. Record sourced from OSV.

References

github.com (Web)
nvd.nist.gov (Advisory)
nvd.nist.gov (Advisory)
github.com (Package)

Other advisories for this package

axios has other advisories on record. If you are patching this one, these are worth checking on the same host:

Same weakness in other software

These advisories are the same class of weakness (CWE-1321: Prototype Pollution) in other software:

CVE-2026-44490 on other distributions

Each distribution ships its own build and its own fixed version. Pick the one you run:

Details

Severity MEDIUM
CVSS Score 4.8
CVSS Vector CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L
CWE CWE-1321
Public Exploit ⚠️ Yes
Source OSV
Published 2026-05-29
Updated 2026-08-20
Modified 2026-06-17
Fix URL N/A

Affected Packages

Software From version Fixed in
axios

Exploit Protection

Are you running axios?

CVE-2026-44490 carries CVSS 4.8 Medium rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-44490 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026