deps(deps): update dependency axios to v1.20.0 - autoclosed #703
No reviewers
Labels
No labels
accepted
bug
dependencies
docker
documentation
duplicate
enhancement
github-actions
github_actions
good first issue
gradle
hacktoberfest-accepted
help wanted
invalid
javascript
not-an-issue
npm
question
rejected
wontfix
Working on it
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Griefed/ServerPackCreator!703
Loading…
Reference in a new issue
No description provided.
Delete branch "renovate/axios-1.x-lockfile"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
1.16.0→1.20.0Axios: Excessive recursion in formDataToJSON can cause denial of service
CVE-2026-67313 / GHSA-42h9-826w-cgv3
More information
Details
Summary
Axios versions
0.28.0and later contain uncontrolled recursion informDataToJSON, the helper behind the publicaxios.formToJSON()/ namedformToJSONAPI and the default request transform used when FormData is sent with anapplication/jsoncontent type.Applications are affected when they pass attacker-controlled
FormDatafield names into this functionality. A field name with thousands of nested bracket segments can exhaust the JavaScript call stack and throwRangeError: Maximum call stack size exceeded, causing request failure and, in applications that do not handle the exception or rejected promise, possible process termination.Impact
The impact is denial of service against applications that process untrusted
FormDatafield names through axios' FormData-to-JSON conversion.The vulnerable path is not reached by merely installing axios, by normal multipart
FormDatapass-through, or by ordinary axios requests that do not request JSON serialisation ofFormData. In the default axios request, the error is produced before network I/O and returned as a rejected Promise. Direct use offormToJSON()throws synchronously.Server-side applications are the primary risk when remote users can submit arbitrary form field names, and the application converts those fields with
formToJSON()or sends them through axios as JSON.Affected Functionality
Affected APIs and paths:
axios.formToJSON(formData)import { formToJSON } from "axios"lib/helpers/formDataToJSON.jstransformRequestwhendataisFormDataandContent-Typecontainsapplication/jsonUnaffected or lower-risk paths:
FormDatarequests withoutJSON Content-TypetoFormData()object-to-FormData serialisation, which already has amaxDepthguardTechnical Details
lib/helpers/formDataToJSON.jsparses a form field name into path segments withparsePropPath(). For a key such asa[x][x][x], each bracketed segment becomes another path element.formDataToJSON()then calls the nestedbuildPath(path, value, target, index)function.buildPath()recursively calls itself once for each path segment and does not enforce a maximum depth:const result = buildPath(path, value, target[name], index);A key containing thousands of bracket segments, therefore, creates thousands of recursive calls. At sufficient depth, V8 throws
RangeError: Maximum call stack size exceeded.Axios already applies a depth guard to the inverse serializer in
lib/helpers/toFormData.js, wheremaxDepthdefaults to 100 and exceeding it throwsAxiosErrorwith codeERR_FORM_DATA_DEPTH_EXCEEDED.formDataToJSON()does not currently have equivalent protection.Proof of Concept of Attack
Expected vulnerable result:
RangeError: Maximum call stack size exceeded
The axios request transform path can also be reached before network I/O:
Expected vulnerable result:
RangeError: Maximum call stack size exceeded
Workarounds
Applications can avoid the vulnerable path by not converting attacker-controlled
FormDatato JSON with axios.If conversion is required before a fixed axios release is available, validate
FormDatafield names before callingformToJSON()or before sendingFormDatawithContent-Type: application/json. Reject keys whose parsed nesting depth exceeds the application's expected schema.For axios requests carrying untrusted
FormData, avoid settingContent-Type: application/json; leaving the data as multipart FormData bypassesformDataToJSON().Catching the resulting error can prevent process termination, but it does not remove the uncontrolled-recursion behaviour and should not be treated as the primary mitigation.
Original Report
Axios SSRF via Incomplete Loopback Detection
CWE-918 | CVSS 7.5 (HIGH) | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L
1. Classification
2. Description
Summary
The
shouldBypassProxy()function in Axios fails to recognise0.0.0.0,::, and::ffff:0.0.0.0as loopback addresses. WhenNO_PROXY=localhostis configured, requests to these addresses are incorrectly forwarded through the proxy instead of being sent directly, enabling an SSRF attack against internal services reachable via the proxy's loopback interface.Root Cause
File:
lib/helpers/shouldBypassProxy.jsisIPv4Loopback(lines 3-8): Only checks for127.x.x.xaddresses by inspectingparts[0] !== '127'. The0.0.0.0address hasparts[0] === '0', so it falls through as non-loopback, even though on Linux0.0.0.0routes to the loopback interface.isIPv6Loopback(lines 10-38): Only checkshost === '::1'. The::address (unspecified IPv6) also routes to the loopback, but is not recognised.Attack Flow:
Attack Vector
3. Proof of Concept
Phase 1: Logic Verification
Phase 2: Docker E2E Reproduction
A full 3-container Docker reproduction was created and tested:
Reproduction steps:
Results:
127.0.0.1 + NO_PROXY=localhost→ BYPASS (correct)0.0.0.0 + NO_PROXY=localhost→ VIA_PROXY (SSRF)[::] + NO_PROXY=localhost→ VIA_PROXY (SSRF)[::ffff:0.0.0.0] + NO_PROXY=localhost→ VIA_PROXY (SSRF)Phase 3: Actual Axios Client
The real Axios HTTP client (v1.16.1, source tree) was tested through proxy configuration:
proxy: { host: 'proxy', port: 8888 }NO_PROXY=localhostand requestinghttp://0.0.0.0:9999/4. Impact
Attack Scenario
NO_PROXY=localhostto protect internal serviceshttp://0.0.0.0:8080/adminas the target URL0.0.0.0→ the proxy's own loopback → reaches the internal admin service on port 8080Potential Consequences
Likelihood
5. Remediation
Code Fix
File:
lib/helpers/shouldBypassProxy.jsWorkarounds
0.0.0.0and::to theNO_PROXYenvironment variable explicitly127.0.0.1instead of0.0.0.0in all internal service URLs0.0.0.0and::before passing to AxiosSeverity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Nested axios option objects can consume polluted prototype values
CVE-2026-67319 / GHSA-7q8q-rj6j-mhjq
More information
Details
Summary
Axios can consume inherited properties from nested request option objects when the JavaScript process already has a polluted
Object.prototype.The top-level merged config is protected with a null prototype, but nested plain objects such as
authandparamsSerializerare cloned into ordinary objects. If application code passes placeholders such asauth: {}orparamsSerializer: {}, inheritedusername,password,encode, orserializeproperties can influence outbound requests.Impact
This is reachable only when another component has already polluted
Object.prototypeand the application passes an affected nested axios option object.Confirmed impacts include silent injection of an
Authorization: Basic ...header from inheritedusernameandpasswordvalues, and query-string tampering when inheritedparamsSerializerfields are function-valued.The
authcase requires only string-valued pollution. Full query-string replacement throughparamsSerializer.serializerequires a function-valued pollution primitive; string-only pollution may still cause request failures or encoding changes throughencode.This does not mean every axios request is affected. Requests that do not pass
auth, do not passparamsSerializer, or provide explicit own properties for the relevant nested fields are not affected by this specific gadget.Affected Functionality
Affected runtime functionality:
lib/adapters/http.js.lib/helpers/resolveConfig.js.lib/helpers/buildURL.js.axios.getUri()when called with an affectedparamsSerializerobject.Affected config shapes:
auth: {}or anauthobject missing ownusernameand/orpassword.paramsSerializer: {}or aparamsSerializerobject missing ownencodeand/orserialize.Unaffected by this specific issue:
authproperty.paramsSerializerproperty.authorparamsSerializervalues in current hardened versions.Technical Details
lib/core/mergeConfig.jscreates the top-level merged config withObject.create(null), but nested object cloning still uses ordinary{}containers:Downstream code then reads nested fields without own-property checks.
In
lib/helpers/resolveConfig.js:In
lib/adapters/http.js:In
lib/helpers/buildURL.js:Proof of Concept of Attack
Observed result:
Workarounds
If upgrading is not yet possible, avoid passing placeholder nested option objects.
Remove
authentirely when Basic auth is not intended. ForparamsSerializerobjects, provide explicit ownencodeandserializeproperties or removeparamsSerializerwhen custom serialization is not required.These workarounds only address this axios gadget. They do not remediate the separate prototype-pollution primitive that must already exist in the application process.
Original Report
Summary
axios 1.16.1 mitigates prototype-pollution gadgets on the top-level request config but not on nested option objects. When a caller passes a partial nested option object such as auth: {} or paramsSerializer: {}, axios reads inner fields (username, password, encode, serialize) through the prototype chain. If Object.prototype has been polluted by another component in the same Node.js process, those inherited values are silently injected into the outbound request, including the Authorization header and the serialized query string.
Details
mergeConfig (lib/core/mergeConfig.js) was hardened to use a null-prototype container for the top-level config, but its nested-clone helper still produces ordinary {} containers:
mergeConfig.js Lines 36-45
The cloned nested objects therefore inherit from Object.prototype. Downstream consumers read sensitive fields via plain dotted access, with no own-property guard:
Browser / fetch Basic auth — lib/helpers/resolveConfig.js:
resolveConfig.js Lines 64-70
Node HTTP adapter Basic auth — lib/adapters/http.js:
http.js Lines 829-836
paramsSerializer reads — lib/helpers/buildURL.js:
buildURL.js Lines 31-54
Because auth.username, auth.password, options.encode, and options.serialize are accessed without hasOwnProperty checks, a polluted Object.prototype.username / Object.prototype.password / Object.prototype.serialize flows directly into the outgoing request.
The auth sink is the primary impact (silent Basic-auth injection); paramsSerializer.serialize is a secondary but powerful sink because it can fully replace the query string.
PoC
Impact
Concrete consequences:
Severity
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: NO_PROXY bypass for 0.0.0.0 local addresses in axios
CVE-2026-67315 / GHSA-f4gw-2p7v-4548
More information
Details
Summary
Axios versions containing
lib/helpers/shouldBypassProxy.jsdo not treat0.0.0.0as a local address when evaluatingNO_PROXYrules. In Node.js applications that useHTTP_PROXYorHTTPS_PROXYtogether withNO_PROXY=localhost,127.0.0.1,::1or similar, a request tohttp://0.0.0.0:<port>/can be routed through the configured proxy instead of bypassing it.The issue is exploitable when an attacker can influence the axios request URL or a followed redirect target, and when the proxy can reach or relay
0.0.0.0to local services. This is a Node.js runtime proxy-routing issue, not a browser, install-time, or development-tooling issue.Impact
Applications are affected when all of the following are true:
HTTP_PROXYorHTTPS_PROXY.NO_PROXYentries such aslocalhost,127.0.0.1, or::1to keep local traffic out of the proxy path.0.0.0.0and can reach the local destination.For plain HTTP targets, the proxy can receive the full request URL, headers, and body, and may be able to observe the local service response. HTTPS targets are less exposed because axios uses CONNECT tunneling in current versions.
Affected Functionality
Affected functionality is limited to environment-derived proxy selection in the Node HTTP adapter:
lib/adapters/http.jscallsgetProxyForUrl(location)and thenshouldBypassProxy(location)before applying the proxy.lib/helpers/shouldBypassProxy.jsnormalizes and comparesNO_PROXYentries.config.proxyremains trusted caller configuration.Technical Details
lib/helpers/shouldBypassProxy.jsdefines local loopback equivalence throughisLoopback(). The current implementation recognizeslocalhost, IPv4127.0.0.0/8, IPv6::1, and IPv4-mapped loopback forms, but it does not include0.0.0.0.At
lib/helpers/shouldBypassProxy.js:176, axios treats two hosts as matching when both are considered loopback:Because
isLoopback('0.0.0.0')returnsfalse,NO_PROXY=localhost,127.0.0.1,::1does not matchhttp://0.0.0.0:<port>/.lib/adapters/http.js:185-193then applies the environment proxy.Proof of Concept of Attack
Expected safe behavior: both
127.0.0.1and0.0.0.0bypass the proxy when theNO_PROXYpolicy is intended to cover local destinations.Observed behavior:
127.0.0.1bypasses the proxy, while0.0.0.0is sent through the proxy.Workarounds
0.0.0.0explicitly toNO_PROXYwhere local addresses must bypass proxies.0.0.0.0in application URL validation before calling axios.proxy: falseon axios requests that must never use environment proxies.0.0.0.0, loopback, link-local, and internal address ranges.Original Report
Summary
axiosversions 1.15.0–1.16.1 contain an incomplete loopback-address check inlib/helpers/shouldBypassProxy.js. TheisLoopback()function correctly identifies127.0.0.0/8and::1as loopback addresses but does not recognise0.0.0.0— the IPv4 unspecified address, which routes to the local machine on Linux and macOS.An attacker who controls a URL passed to axios can use
http://0.0.0.0/<path>to bypass proxy-based SSRF filtering that the application relies upon.Details
Affected versions
>= 1.15.0, <= 1.16.1The vulnerability was introduced in v1.15.0 when the
shouldBypassProxyhelper was added as a security improvement (PR #10661).Root cause
File:
lib/helpers/shouldBypassProxy.jsUnaffected or mitigating conditions include browser adapters, the Node fetch adapter, no polluted
Object.prototype.proxy, an ownproxy: falseor safe ownproxyvalue on the config, and hardened releases where interceptors return the original null-prototype config instead of a regular object clone.Technical Details
lib/core/mergeConfig.jscreates a null-prototype merged config and uses own-property reads for merged values. This is intended to prevent pollutedObject.prototypevalues from affecting config behavior.lib/core/Axios.jsruns request interceptors after the merge. In both the asynchronous and synchronous interceptor paths, axios passes the interceptor-returned config into dispatch.lib/core/dispatchRequest.jsaccepts that returned config, transforms request data, selects the adapter, and calls the adapter without re-hardening or re-normalizing the config.lib/adapters/http.jsuses own-property reads for several sensitive fields, but the initial proxy dispatch path still passesconfig.proxydirectly intosetProxy(). If an interceptor returned a regular object,config.proxycan resolve to inheritedObject.prototype.proxy.Proof of Concept of Attack
Expected vulnerable result: the response comes from the proxy,
targetHitsis empty, andproxyHitscontains the absolute URL, authorization header, host header, and request body.Workarounds
Set an own
proxy: falseon affected requests or on an axios instance when proxy support is not required.Avoid request interceptors that return regular object clones of config in hardened releases. Returning the original config or cloning into a null-prototype object avoids this specific bypass, but this is fragile and should not replace a fix.
Use the Node fetch adapter for affected requests where its behavior is compatible with the application.
Original Report
Summary
Axios hardens merged request config by creating a null-prototype object, preventing polluted Object.prototype properties from influencing request behavior. Request interceptors run after that hardening, and a normal immutable
interceptor pattern such as {...config} or Object.assign({}, config) re-materializes the config as a regular object. Axios then dispatches that interceptor-returned object without re-hardening it. In the Node HTTP adapter, config.proxy
is read through the prototype chain, allowing a polluted Object.prototype.proxy to route authenticated HTTP requests through an attacker-controlled proxy.
Impact
In a Node.js deployment using the HTTP adapter, an attacker who can trigger prototype pollution elsewhere in the process can cause affected axios requests to be sent through an attacker-controlled proxy when the application uses a
request interceptor that returns a plain object copy of the config.
Verified local impact:
This report does not claim browser impact or proven HTTPS credential disclosure. The demonstrated credential and body disclosure is for Node HTTP-adapter requests over HTTP/plaintext.
Affected component
The affected component is the Node.js HTTP adapter request path after request interceptors have run.
The issue requires:
Affected versions
Confirmed affected for this specific hardening-bypass variant:
axios@1.16.0 was the latest published version observed via npm view axios version during validation.
Related older behavior observed during testing:
Root cause
Initial hardening
Axios initially hardens merged request config by creating a null-prototype object in mergeConfig(), which is meant to prevent inherited Object.prototype properties from influencing request behavior.
Permalink:
github.com/axios/axios@df53d7dd99/lib/core/mergeConfig.js (L21-L25)Interceptor re-materialization
Request interceptors run after that hardening step, and axios allows an interceptor to return a replacement config object. A common immutable pattern such as {...config} or Object.assign({}, config) converts the hardened null-
prototype config back into a normal object with Object.prototype as its prototype.
Permalinks:
github.com/axios/axios@df53d7dd99/lib/core/Axios.js (L187-L199),github.com/axios/axios@df53d7dd99/lib/core/Axios.js (L204-L218)No post-interceptor re-hardening
Axios passes the interceptor-returned config into request dispatch without restoring the null-prototype property or otherwise normalizing the object into an own-property-only structure.
Permalink:
github.com/axios/axios@df53d7dd99/lib/core/dispatchRequest.js (L34-L48)Prototype-chain read of proxy in the Node adapter
The Node HTTP adapter later consults config.proxy, and this read is reachable through the prototype chain once the interceptor has re-materialized the config as a normal object. As a result, a polluted Object.prototype.proxy can
redirect the outgoing authenticated request through an attacker-controlled proxy.
Permalink:
github.com/axios/axios@df53d7dd99/lib/adapters/http.js (L816-L820)Why this is a security issue and not intended behavior
Axios’ threat model explicitly treats polluted Object.prototype config reads as high-impact read-side gadgets and states that axios defends reachable config-read gadgets through own-property checks and null-prototype structures. The
existing regression tests also assert that a polluted Object.prototype.proxy must not route requests through an attacker proxy.
This behavior is therefore a bypass of axios’ existing prototype-pollution hardening, not merely a generic “polluted process” complaint. The interceptor does not need to be malicious; it can be ordinary application code that returns an
immutable copy of the config. The attacker-controlled piece is the polluted prototype property supplied by a separate vulnerability or dependency.
Realistic threat model
A realistic exploit chain is:
This requires a prototype pollution primitive and a compatible interceptor pattern. It does not require the attacker to control the interceptor.
Proof of concept
Save as poc.mjs in the axios repository root:
Run:
Observed results
Representative observed output from local loopback testing:
That value decodes to:
svc-account:prod-secret
Negative controls were also tested:
Suggested remediation
Re-harden the final request config after all request interceptors and before adapter dispatch. This should cover both asynchronous and synchronous interceptor paths.
A practical fix would be to normalize the interceptor-returned object into a null-prototype, own-property-only config before calling dispatchRequest(), or at the start of dispatchRequest() itself. Security-sensitive adapter reads should
also consistently use own-property access helpers. In particular, the Node HTTP adapter should not read config.proxy through the prototype chain.
Minimal regression test
Add an end-to-end Node HTTP adapter test that:
A second assertion can cover config.auth to ensure axios-generated Basic auth is not sent to the attacker proxy.
References / permalinks
github.com/axios/axios@df53d7dd99/lib/core/mergeConfig.js (L21-L25)github.com/axios/axios@df53d7dd99/lib/core/Axios.js (L187-L199)github.com/axios/axios@df53d7dd99/lib/core/Axios.js (L204-L218)github.com/axios/axios@df53d7dd99/lib/core/dispatchRequest.js (L34-L48)github.com/axios/axios@df53d7dd99/lib/adapters/http.js (L816-L820)github.com/axios/axios@df53d7dd99/THREATMODEL.md (L136-L144)github.com/axios/axios@df53d7dd99/tests/unit/prototypePollution.test.js (L1098-L1135)Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios form serializer maxDepth bypass via {} metatoken
CVE-2026-67321 / GHSA-hcpx-6fm6-wx23
More information
Details
Summary
Axios versions in the fixed lines for GHSA-62hf-57xw-28j9 still contain an incomplete depth-limit bypass in
lib/helpers/toFormData.js. When serializing an object with a top-level key ending in{}, axios callsJSON.stringify()on that value before theformSerializer.maxDepthguard can inspect the nested structure.An attacker who can control object keys and nested values passed by an application into axios form or parameter serialization can trigger a raw
RangeError: Maximum call stack size exceeded, causing a denial of service in the affected request path.Impact
The impact is availability only. No confidentiality or integrity impact was confirmed.
Server-side applications are the primary concern when they accept user-controlled input and pass it into axios as
dataorparamsformultipart/form-data,application/x-www-form-urlencoded, or default parameter serialization. Browser impact is limited to the page or request context unless the application builds a broader failure mode around the thrown exception.The attack requires control over a top-level object key ending in
{}and a deeply nested object value. The optionformSerializer.metaTokens: falseis not a workaround because it only changes the emitted key name; the value is still stringified.Affected Functionality
Affected paths include:
lib/helpers/toFormData.jswhen a top-level key ends with{}.lib/helpers/toURLEncodedForm.js, which delegates tohelpers.defaultVisitor.lib/helpers/AxiosURLSearchParams.js, used by default params serialization.lib/defaults/index.jswhen object data is serialized asmultipart/form-dataorapplication/x-www-form-urlencoded.Unaffected paths include:
FormDataorURLSearchParamsvalues that axios does not walk withtoFormData.paramsSerializer.serializeimplementations that do not call axiostoFormData.{}deeply nested values intoFormData, which hitERR_FORM_DATA_DEPTH_EXCEEDEDas intended.Technical Details
In
lib/helpers/toFormData.js,defaultVisitor()handles top-level keys ending in{}before recursive traversal:The depth guard is in
build():For
{}metatoken values,build()only sees the top-level property. The nested value is handed directly to nativeJSON.stringify(), which recurses internally and can throwRangeErrorbefore axios emits the intendedAxiosError.Proof of Concept of Attack
Safe local PoC with no network I/O:
Expected fixed behavior is an
AxiosErrorwith codeERR_FORM_DATA_DEPTH_EXCEEDED.Workarounds
Reject or depth-limit untrusted objects before passing them to axios serialization.
Strip or reject top-level keys ending in
{}from untrusted objects when using axios form serialization.For query parameters, use a custom
paramsSerializer.serializethat enforces a depth limit.For form bodies, construct
FormDataorURLSearchParamsmanually after validating input depth.Original Report
Summary
The
maxDepth=100guard added in axios 1.15.0 to fix GHSA-62hf-57xw-28j9 lives inside thebuild()recursion inlib/helpers/toFormData.js. The default visitor atlib/helpers/toFormData.js:166-170still has a top-level shortcut that callsJSON.stringify(value)whenever a key ends in'{}', beforebuild()ever sees the nested value. JSON.stringify on a deeply nested object stack-overflows withRangeError: Maximum call stack size exceeded, which propagates synchronously out of the axios call. The exact attacker-data flow that the original advisory described (proxy-style code that forwards client JSON intoaxios({ data, params })) still crashes the process at depth ~3000 on a default Node.js stack, despite v1.16.0 being patched.Details
Affected: axios 1.15.0 - 1.16.0 (every released version that carries the GHSA-62hf-57xw-28j9 fix). The bug is reachable from any code path that hits
toFormData, which includes:axios.post(url, data, { headers: { 'content-type': 'application/x-www-form-urlencoded' } })->defaults.transformRequest->toURLEncodedForm(data)->toFormDataaxios.post(url, data, { headers: { 'content-type': 'multipart/form-data' } })-> same path viatoFormDataaxios.get(url, { params })->buildURL->new AxiosURLSearchParams(params)->toFormDataVulnerable code,
lib/helpers/toFormData.js:build()later does enforcemaxDepth:The
'{}'shortcut runs indefaultVisitor, which is invoked from insidebuild()for top-level keys (the!pathclause at line 165 means the shortcut only triggers at top level, wherepathisundefined). At that pointdepth === 0and the maxDepth check has already passed; the recursion-aware guard never sees the nested value becausedefaultVisitorreassignsvalue = JSON.stringify(value)and returns the rendered string straight toformData.append. JSON.stringify itself is recursive in V8 and stack-overflows on deeply nested objects, throwingRangeErrorsynchronously.The behaviour is independent of the
metaTokensoption: line 168 only changes whether'{}'stays on the key name, line 170 stringifies regardless.toURLEncodedForm's wrapper visitor inlib/helpers/toURLEncodedForm.js:11-14falls through to the samedefaultVisitor, so the form-encoded path is also affected.The attacker payload is a single top-level key ending in
'{}'whose value is a nested object. The keys themselves do not have to be deep, so the payload is small to send (a few KB of{"x":{"x":...}}produces enough nesting to overflow). The original advisory's threat model -- a server that forwardsreq.bodyorreq.queryinto axios -- is unchanged:The error is not an
AxiosError; it is a rawRangeErrorthrown from the stringifier, so handlers that look forerr.code === 'ERR_FORM_DATA_DEPTH_EXCEEDED'(the documented signal that the maxDepth guard fired) do not see it. Synchronous startup paths or worker threads still take the whole process down.The fix is to also depth-limit (or pre-walk) the value before calling
JSON.stringifyon line 170, or to remove the top-level'{}'shortcut and rely on the depth-checkedbuild()recursion to handle it. A minimal patch that preserves observable behaviour for legal payloads:(The recursion in
checkDepthitself is bounded bymaxDepth, so it cannot itself overflow.)PoC
Reproduces against a clean clone of
axios/axiosat v1.16.0 withnpm installalready run.targets/axios/poc_jsonstringify_dos.mjsis the script:3/3 runs reproduce the same
RangeErroronaxios@1.16.0with Node.js 24:safeAdapteris a stub that returns a fake response, so the crash is provably inside axios's serialization layer, not in HTTP I/O. Removing the'{}'suffix from the key and re-running gives the expectedAxiosError: Object is too deeply nested ... ERR_FORM_DATA_DEPTH_EXCEEDEDfrom the maxDepth guard, confirming the fix is wired correctly elsewhere -- it just does not cover this branch.Crash threshold on a default-stack Node.js process is roughly depth 2500-3000; 8000 is comfortably above that, and the payload is a few KB.
Impact
A remote, unauthenticated attacker who can influence an object that the application passes to axios as request
dataorparamstriggers an uncaughtRangeErrorfrom inside the synchronousJSON.stringifycall indefaultVisitor. In server-side applications that proxy or re-forward client JSON through axios -- the same threat model that motivated GHSA-62hf-57xw-28j9 -- this crashes the request handler and, in worker/cluster setups, the whole process. The previously shippedmaxDepthguard does not stop it because the'{}'suffix path bypassesbuild()entirely. Same severity class as the original advisory (CWE-674 Uncontrolled Recursion, network-reachable DoS); the only difference is the attacker has to suffix one of their object keys with'{}'to land on the unguarded code path.Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Fetch adapter
ReadableStreamuploads bypassmaxBodyLengthCVE-2026-67317 / GHSA-jqh4-m9w3-8hp9
More information
Details
Summary
axios’ fetch adapter does not enforce
maxBodyLengthfor live WHATWGReadableStreamrequest bodies whose size cannot be determined before dispatch. Applications that useadapter: "fetch"and rely onmaxBodyLengthto cap untrusted upload/proxy streams can send the full stream even when it exceeds the configured limit.This affects fetch-adapter usage in edge runtimes where fetch is selected, and in Node.js or browser environments where the fetch adapter is explicitly selected. The HTTP adapter’s stream upload path is not affected.
Impact
An attacker who can supply or influence a streamed request body can bypass the caller’s configured upload-size limit. Practical impact is unexpected outbound network egress, request-level resource consumption, and possible exhaustion of upstream API quotas or bandwidth.
This does not expose response data, execute code, or modify axios configuration. Exploitability depends on an application passing attacker-controlled, unknown-length stream data to axios and relying on
maxBodyLengthas the size guard.Affected Functionality
Affected:
adapter: "fetch"or environments where axios selects the fetch adapter.POST,PUT, andPATCH.dataas a WHATWGReadableStreamwithout a reliableContent-Length.maxBodyLengthto a finite value.Not affected:
1.16.0+, such as strings,Blob,ArrayBuffer,ArrayBufferView, URLSearchParams, spec-compliant FormData, or requests with a finiteContent-Length.Technical Details
In
lib/adapters/fetch.js,getBodyLength()handles null bodies,Blob, spec-compliant FormData, ArrayBuffer values, URLSearchParams, and strings. It has no branch forReadableStream, soresolveBodyLength(headers, data)returnsundefinedwhen no finiteContent-Lengthheader is present.The
maxBodyLengthcheck only throws when the resolved outbound length is a finite number greater than the configured limit. For live streams, the check is skipped and the stream is passed tofetch().When
onUploadProgressis enabled, axios wraps the request body withtrackStream(), but that wrapper only reports progress. It does not receivemaxBodyLengthand does not abort once loaded bytes exceed the cap.The expected behavior exists in the HTTP adapter:
lib/adapters/http.jsenforcesmaxBodyLengthfor streamed uploads by counting chunks and rejecting withERR_BAD_REQUEST.Proof of Concept of Attack
Run from the axios repo root on Node 18+ against an affected version:
Expected vulnerable result: the server reports
received: 2097152even thoughmaxBodyLengthis1024.Workarounds
Use the HTTP adapter for untrusted stream uploads in Node.js where possible, or wrap/count the stream at the application layer and abort it when it exceeds the intended limit. Do not rely on fetch-adapter
maxBodyLengthfor unknown-lengthReadableStreambodies until a fixed axios version is available.Original Report
Summary
axios's fetch adapter (used in browsers, edge runtimes, and Node 18+ when explicitly selected) ignores maxBodyLength for live ReadableStream request bodies whose size cannot be inferred ahead of dispatch. The pre-dispatch check is skipped when the length is unknown, and the in-flight wrapper that runs during transmission only emits progress events — it never enforces a byte cap. Severity: medium.
Details
In lib/adapters/fetch.js, body-length resolution has no ReadableStream branch:
fetch.js Lines 121-155
For a live ReadableStream, resolveBodyLength returns undefined. The pre-dispatch maxBodyLength check then short-circuits because the value is not finite:
fetch.js Lines 214-232
The in-flight stream wrapper that follows is purely for progress reporting; it neither sees maxBodyLength nor aborts the request when bytes exceed any cap:
fetch.js Lines 253-261
The body therefore reaches fetch() unbounded, and the entire payload is transmitted regardless of maxBodyLength.
PoC
Impact
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:LReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Prototype pollution gadgets can alter axios request construction
CVE-2026-67316 / GHSA-mmx7-hfxf-jppx
More information
Details
Summary
axios is vulnerable to read-side prototype-pollution gadgets when
Object.prototypehas already been polluted by another vulnerability or dependency. The most broadly reachable issue is in the bodyless method aliases:axios.get(),axios.delete(),axios.head(), andaxios.options()read inheriteddatabefore config normalization, causing attacker-controlled body data to be sent on requests that did not explicitly set a body.Additional low-level paths affect consumers that call exported adapters/helpers directly with plain config objects. In those cases, inherited
proxyorparamsSerializervalues can influence request routing or URL serialization. These low-level paths are not reproduced through normalaxios.get()usage on1.15.2+.Impact
An attacker who can first pollute
Object.prototypecan cause axios to send attacker-controlled request bodies on bodyless method aliases. This can corrupt request semantics where the receiving service processes bodies onGET,DELETE,HEAD, orOPTIONS.For direct low-level Node HTTP adapter usage, inherited
proxycan route requests through an attacker-controlled proxy. Depending on axios version, target scheme, and proxy behavior, this can expose request URLs, headers, and bodies or allow traffic modification.For direct
resolveConfigor browser-adapter helper usage, inheritedparamsSerializercan be invoked with request params, allowing attacker-controlled URL serialization. This was not reproduced through normal high-level axios calls on1.15.2+.Affected Functionality
Affected normal API:
axios.get(url[, config])axios.delete(url[, config])axios.head(url[, config])axios.options(url[, config])Affected low-level usage:
axios/lib/adapters/http.jsoraxios/unsafe/adapters/http.jswith plain configs and no ownproxy.axios/unsafe/helpers/resolveConfig.jsor direct browser adapter/helper paths with plain configs and no ownparamsSerializer.Unaffected or corrected scope:
axios.get()calls on1.15.2+did not reproduce theproxyorparamsSerializergadgets becausemergeConfig()returns a null-prototype config and uses own-property reads.Technical Details
lib/core/Axios.jsconstructs aliases for bodyless methods and copiesdatawith(config || {}).databefore config normalization. IfObject.prototype.datais polluted, this inherited value becomes an owndataproperty in the merged request config and is sent by the adapter.lib/core/mergeConfig.jsin1.15.2+returns a null-prototype config and useshasOwnPropguards, which prevents normal high-level requests from inheriting pollutedproxyandparamsSerializervalues after merge. This is why those two reporter claims do not reproduce through normalaxios.get()on1.15.2or1.16.1.The low-level adapter/helper paths can still receive plain configs directly. In that usage, direct reads of
config.proxyin the Node HTTP adapter andconfig.paramsSerializerin affectedresolveConfig()versions can consume inherited polluted values.Proof of Concept of Attack
Expected result: a request body is sent even though the caller did not explicitly set
config.data.Workarounds
Avoid processing untrusted input with libraries or code paths that can pollute
Object.prototype. As a defense-in-depth mitigation before an axios fix is available, explicitly passdata: undefinedon bodyless method aliases when running in a process where prototype pollution is a concern.Original Report
Summary
Three prototype pollution read-side gadgets in axios bypass the
own()hasOwnProp guard pattern, allowing a pollutedObject.prototypeto hijack outbound requests.Details
The
own()helper was introduced after GHSA-q8qp-cvcw-x6jj to prevent polluted prototype properties from reaching security-sensitive config reads. Three paths were missed:config.proxyat http.js:715 goes straight intosetProxy(). A pollutedObject.prototype.proxyreroutes outbound requests through an attacker-controlled proxy, exposing Authorization headers and full request URLs.(config || {}).dataat Axios.js:248 covers GET, HEAD, DELETE, OPTIONS. Even without explicit body, polluted value becomes the body. I got injected payloads on 3 of 4 method types in testing.config.paramsSerializerat resolveConfig.js:32 is three lines below theown()definition that was supposed to protect it. A polluted function ontoObject.prototype.paramsSerializergets called with the request params on every request that has query strings.I read up on the threat model and I believe T-R4b identifies this exact class and notes that config-read paths must use
hasOwnPropguards. These three seem to predate or were missed by that coverage.PoC
Ran against
axios@1.15.2onnode:22-slimin Docker. Clean install, no other deps.Impact
Any app with a polluted prototype (common via transitive deps like lodash, qs, minimist) should be affected. Gadget 1 steals credentials and redirects traffic. Gadget 2 corrupts request semantics. Gadget 3 gives the attacker arbitrary control over URL construction and a data exfiltration channel. All three fire silently on normal application code that never touches proxy, data, or
paramsSerializerdirectly.Severity
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: HTTP/2 streamed uploads bypass
maxBodyLengthCVE-2026-67318 / GHSA-mwf2-3pr3-8698
More information
Details
Summary
Axios versions with Node.js HTTP/2 support allow streamed request bodies to bypass
maxBodyLengthenforcement when requests are sent withhttpVersion: 2.This affects applications that rely on
maxBodyLengthas a hard cap while forwarding attacker-controlled streams, such as upload endpoints proxying user data to an upstream HTTP/2 service. Buffered request bodies are still checked before the request is sent.Impact
An attacker who can control a stream passed to axios can cause the application to transmit more outbound data than the configured
maxBodyLengthlimit.Practical impact is limited to resource consumption and policy bypass: excess outbound bandwidth, egress cost, upstream quota consumption, and limited availability impact on the application or upstream peer. This does not provide code execution, credential disclosure, or request destination control.
Browser adapters are not affected. Axios calls using the default unlimited
maxBodyLength: -1do not cross this specific configured-limit boundary.Affected Functionality
Affected calls require all of the following:
httpVersion: 2.datasupplied as a stream.maxBodyLength.Unaffected or differently affected paths:
follow-redirectsenforceoptions.maxBodyLength.axios >=1.15.1, settingmaxRedirects: 0on affected HTTP/2 upload calls activates axios’ existing stream wrapper and rejects oversized streams.Technical Details
In
lib/adapters/http.js, axios selectshttp2TransportwheneverhttpVersionresolves to2. The adapter still storesconfig.maxBodyLengthonoptions.maxBodyLength, but Node’s HTTP/2 request API does not enforce that option.The stream-level byte-counting wrapper is currently gated on
config.maxBodyLength > -1 && config.maxRedirects === 0. For HTTP/2 requests using the default redirect setting, axios does not usefollow-redirectsand also does not enter this wrapper, souploadStream.pipe(req)sends the full stream.Local verification against the current
v1.xcheckout showed a request withmaxBodyLength: 1024successfully transmitting2097152bytes over HTTP/2.No fixed release exists yet. The fix should enforce the byte-counting stream wrapper for HTTP/2 streamed uploads, not only for the native HTTP/1.1
maxRedirects: 0path.Proof of Concept of Attack
Workarounds
For
axios >=1.15.1, setmaxRedirects: 0on affected HTTP/2 streamed upload calls. HTTP/2 redirects are not currently supported by the axios HTTP/2 adapter, so this is a practical per-call mitigation for this path.For earlier affected versions, pre-limit the stream with a byte-counting transform before passing it to axios, reject oversized uploads before forwarding them, or avoid
httpVersion: 2for untrusted streamed uploads.### SummaryOn Node.js, axios's maxBodyLength is documented as a hard cap on outbound request bodies. For streamed uploads sent over httpVersion: 2, axios never enforces this cap: the entire body is transmitted regardless of size. Severity: medium.
Original Report
Details
In lib/adapters/http.js, transport selection is unconditional for HTTP/2:
http.js Lines 937-956
maxBodyLength is then stored on the request options:
http.js Lines 958-963
…but options.maxBodyLength is only honored by the follow-redirects transport. Node's native http2.request does not read it. The only stream-level cap in this file is the byte-counting Transform wrapper for streamed uploads, which is gated on config.maxRedirects === 0:
http.js Lines 1270-1304
For the HTTP/2 path, neither branch fires: the http2Transport is always selected, and follow-redirects is never used. The byte-counting transform also doesn't fire unless the caller happens to pin maxRedirects: 0. As a result, uploadStream.pipe(req) streams the full body into the HTTP/2 request unbounded.
PoC
Impact
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:LReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Deep formToJSON Key Recursion Can Cause Denial of Service
CVE-2026-67312 / GHSA-pmv8-rq9r-6j72
More information
Details
Summary
Axios versions starting with
0.28.0contain uncontrolled recursion informDataToJSON, which is exposed asaxios.formToJSON()and used internally when axios serialisesFormDatawithContent-Type: application/json.If an application passes attacker-controlled
FormDatafield names to this functionality, a field name with thousands of nested bracket segments can exhaust the JavaScript call stack and cause denial of service for that request or, in applications without appropriate error handling, process termination.Impact
Applications are affected only when untrusted users can control
FormDatakey names that are converted through axios.Affected paths include direct use of
axios.formToJSON()on untrustedFormDataand axios requests in which attacker-controlledFormDatais sent withContent-Type: application/json.The observed failure is
RangeError: Maximum call stack size exceeded. In local testing, this error is catchable, so process-wide crash depends on the consuming application's error handling and runtime behaviour.Affected Functionality
Affected functionality:
axios.formToJSON(formData)formToJSONtransformRequestbehaviour forFormDatawhenContent-Typecontainsapplication/jsonUnaffected functionality:
FormDatasubmission without JSON serialisationtoFormData, which already enforces amaxDepthguard<=0.27.2, whereformDataToJSONwas not presentTechnical Details
The vulnerable code is in
lib/helpers/formDataToJSON.js.parsePropPath()splits a field name such asa[x][x][x]into path segments.buildPath()then recursively processes one segment per call without enforcing a maximum depth:A key with thousands of bracket-delimited segments causes thousands of recursive calls and can exceed the JavaScript engine's call stack limit.
Relevant source locations:
lib/helpers/formDataToJSON.jscontains the unbounded recursivebuildPath().lib/axios.jsexposes the helper asaxios.formToJSON.index.jsexposesformToJSONas a named export.index.d.tsandindex.d.ctsdeclare the public API.lib/defaults/index.jscallsformDataToJSON(data)when JSON-serializingFormData.The inverse helper,
toFormData, already enforcesmaxDepthand throwsAxiosErrorwithERR_FORM_DATA_DEPTH_EXCEEDED, butformDataToJSONdoes not have an equivalent guard.Proof of Concept of Attack
Expected result on affected versions:
RangeError: Maximum call stack size exceeded
The same condition can be reached via an axios request transformation when attacker-controlled
FormDatais sent withContent-Type: application/json.Workarounds
Applications can reject or normalise untrusted form field names before calling
axios.formToJSON().Applications can avoid sending untrusted
FormDatathrough axios as JSON unless JSON conversion is required.Applications should catch errors around
formToJSON()or axios requests that transform untrustedFormData.Original Source
Summary
An uncontrolled recursion vulnerability in
formDataToJSONallows any user who controls FormData input to crash a Node.js process with a single request. The function recurses once per bracket-delimited segment in a FormData key name with no depth limit, so a key likea[x][x][x]...with 15,000+ segments exhausts the call stack. This is a denial-of-service that kills the process via an unrecoverableRangeError. The inverse functiontoFormDataalready enforces amaxDepthlimit (default 100) for exactly this reason —formDataToJSONlacks the equivalent guard.Details
Vulnerable function:
buildPathinlib/helpers/formDataToJSON.js, lines 50–82.buildPath(path, value, target, index)is called recursively — once per segment in the parsed property path — with no depth check:The key is first split into segments by
parsePropPath(line 17), which extracts every[segment]via regex. A key with 15,000 bracket pairs produces a 15,001-element array, causing 15,001 recursive calls — well beyond the V8 default stack limit (~10,000–15,000 frames).formDataToJSONis a public API consumed two ways:Directly by consumers — exported as
axios.formToJSON()(lib/axios.js:80), with TypeScript declarations in bothindex.d.ts:699andindex.d.cts:708, and documented in the API reference in four languages (docs/pages/advanced/api-reference.md).Internally by
transformRequest— called atlib/defaults/index.js:56when the request body isFormDataandContent-Typecontainsapplication/json:Contrast with
toFormData: The inverse function (lib/helpers/toFormData.js:118) enforcesmaxDepth(default 100) and throwsAxiosErrorwith codeERR_FORM_DATA_DEPTH_EXCEEDEDwhen exceeded.formDataToJSONhas no equivalent protection.PoC
Requires only Node.js and an unmodified axios v1.x install:
Verified output on Node.js 22.22.3 against axios v1.16.1 (current
v1.xHEAD):The process crashes. In a server context (e.g., Express middleware calling
axios.formToJSON()on an uploaded form), a single crafted request terminates the process.Impact
Denial of Service (process crash). Any unauthenticated user who can submit FormData to a Node.js application that passes it through
axios.formToJSON()— or that sends it as a JSON-serialized FormData body via axios — can crash the server process with a single request. TheRangeErrorfrom stack exhaustion is unrecoverable in many contexts (it cannot be reliably caught when the stack is already full). No authentication or special privileges are required; the attacker only needs to control a FormData key name.Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Prototype pollution auth subfields can inject Basic auth
CVE-2026-67314 / GHSA-xj6q-8x83-jv6g
More information
Details
Summary
Axios versions after the
GHSA-q8qp-cvcw-x6jjfix still contain prototype-pollution read-side gadgets in Basic auth subfield handling. If a host application is already affected by prototype pollution and then makes an axios request with an ownauthobject that omitsusernameorpassword, axios reads inheritedObject.prototype.usernameandObject.prototype.passwordvalues and uses them to construct an outboundAuthorization: Basic ...header.This does not mean axios itself pollutes prototypes. Exploitation requires a separate prototype-pollution primitive in the host process, plus an axios call pattern such as
auth: opts.auth || {}.Impact
An attacker who can pollute
Object.prototype.usernameand/orObject.prototype.passwordcan influence the Basic auth header on affected axios requests that pass an empty or partial ownauthobject.The practical impact is outbound request tampering. The attacker can inject attacker-chosen Basic auth credentials, replace an existing
Authorizationheader because axios removes it whenauthis used, or cause downstream authorization failures.This should not be described as automatic credential exfiltration. In the minimal reproduced case, the Basic auth values are attacker-controlled values, not secrets read from axios. Credential disclosure requires an additional application-specific condition, such as a request destination observable by the attacker and a partial real auth object with a missing polluted subfield.
Affected Functionality
Affected functionality:
lib/adapters/http.js.lib/helpers/resolveConfig.js.config.authis an own object butusernameand/orpasswordare absent own properties.Unaffected or not accepted as core impact:
authobject aftermergeConfig().auth.usernameandauth.passwordvalues.params/paramsSerializerafter the null-prototypemergeConfig()hardening.paramsSerializerfunctions from JSON-only prototype pollution, because JSON pollution cannot create functions. If attacker-controlled code can install functions in the process, that is outside axios’ runtime boundary.Technical Details
mergeConfig()returns a null-prototype top-level config object, which prevents top-level reads such asconfig.authfrom inheriting polluted values. However, nested plain objects returned byutils.merge()still haveObject.prototype.In
lib/adapters/http.js, axios correctly reads the top-levelauthvalue throughown('auth'), but then reads subfields directly:If the caller passes auth: {} and Object.prototype.username/password are polluted, those direct subfield reads walk the prototype chain.
The same pattern exists in
lib/helpers/resolveConfig.js:The fix should guard
usernameandpasswordwithutils.hasOwnProp, matching the proxy-auth pattern already used elsewhere.Proof of Concept of Attack
Safe local PoC against published
axios@1.16.1:Expected output:
The base64 value decodes to
victim-user:victim-password-leaked.Workarounds
Avoid passing empty or partial
authobjects. Only setauthwhen the application has own username and password values.Applications that merge untrusted input should filter
__proto__,constructor, andprototype, and should read optional user options with own-property checks rather thanopts.auth || {}.Where a wrapper must materialize optional auth, use a null-prototype object or explicitly copy only own fields.
Original Report
Summary
After GHSA-q8qp-cvcw-x6jj / PR #10779 (shipped in
v1.15.2) and the further proxy-side hardening inPR #10833 (merged 2026-05-02), the top-level
config.authand the proxy authsub-fields are correctly read viautils.hasOwnProp. The regular request auth sub-fields (config.auth.usernameandconfig.auth.password) and theconfig.params/config.paramsSerializerreads insideresolveConfig.jsare still unguarded against a pollutedObject.prototype.When a polluted host process makes an axios call with the common "optional override" pattern (
auth: opts.auth || {}— an empty own{}), the sub-field readsconfigAuth.usernameandconfigAuth.passwordwalk the prototype chain and return the attacker-controlled values. Same forparamsandparamsSerializer. The outbound HTTP request then carries an attacker-chosenAuthorization: Basic <base64>header and an attacker-chosen querystring, leaking credentials and exfiltrating data to whichever host the request goes to (often attacker-influenced too — i.e. the amplifier is wired into many credential-stuffing chains).Reproduces against
axiosmainHEAD (34723be, dated 2026-05-24)as well as the released
v1.16.1.Details
Three still-unguarded read sites on
mainHEAD:(1)
lib/adapters/http.jslines 737–740 (Node http adapter):own('auth')correctly applieshasOwnPropto the top-levelauthkey. But once
configAuthis the empty object the caller passed(
auth: {}),configAuth.usernamewalks the prototype chain andpicks up
Object.prototype.username.Contrast with the proxy-auth path that PR #10833 fixed (lines 322–324):
This is the exact pattern needed at lines 739–740 too.
(2)
lib/helpers/resolveConfig.jslines 50 + 68 (xhr/fetch adapter shared resolver):Same shape — top-level guarded, sub-fields walk prototype.
(3)
lib/helpers/resolveConfig.jslines 58–59 (params + paramsSerializer):This third site is already proposed for fix in open PR #10922 by @Mohammad-Faiz-Cloud-Engineer (status: open, currently mergeable: false). That PR's
own('params')/own('paramsSerializer')change is exactly correct; this report flags the auth sub-field sites that PR #10922 does not cover.PoC
This PoC contains zero direct
Object.prototype.x = ywrites. Thepollution flows entirely from attacker-shaped JSON through a real
deep-merge utility (
defaults-deep@0.2.4, ~50k weekly downloads,still walks
constructor.prototype). A hand-rolled deep merge —the canonical insecure backend pattern — exhibits the same pollution
via
__proto__and is more common in real codebases than any namedutility.
Reproduction:
Captured output (verified against released
1.16.1AND againstmainat34723be, 2026-05-24):dmljdGltLXVzZXI6dmljdGltLXBhc3N3b3JkLWxlYWtlZA==base64-decodes tovictim-user:victim-password-leaked. The querystring carries?leak=ATTACKER_QUERY_TOKEN, which can be a full data-exfil channelin real chains (CSRF token, session cookie via
req.headers, etc.).Impact
request. If the request URL is attacker-influenced too (common in
webhook/oauth-callback patterns), the credentials flow directly to
the attacker. If not, they flow to the legitimate destination but
expose victim credentials in any logs / proxies along the path.
params/paramsSerializer. WithparamsSerializerpolluted to an attackerfunction, axios will execute that function with each
paramsinvocation — same-process code execution from a pollution primitive.
precondition is "deep-merges attacker JSON into a config object
without
__proto__/constructorfiltering, then uses the empty-fallback wrapper
auth: opts.auth || {}/params: opts.params || {}."Both halves are very common in real codebases (we tested
defaults-deep, hand-rolled merges, and several lodash-familyutilities; many still pollute).
Attributes — amplifier sink).
Proposed fix
Two-line change in
http.js, matching the proxy-auth pattern PR#10833 already established:
Same pattern in
resolveConfig.js:The
params/paramsSerializerhalf is already handled by openPR #10922's
own('params')/own('paramsSerializer')change — thatPR should be rebased / merged.
Relationship to recent prototype-pollution work
Same vulnerability class as the existing public hardening, just at
sub-field granularity:
mergeConfigdirect-key reads. Fixed in v1.15.2.mergeDirectKeysin→hasOwnProp. Fixed in v1.15.x.auth.username/passwordsub-fields. Fixed post-1.16.1.formDataToJSONdefense-in-depth. Fixed post-1.16.1.socketPathguard. Merged 2026-05-24.params/paramsSerializerown()guard. Proposed; not merged.This report adds: regular-request
auth.username/auth.passwordsub-field reads in both the http adapter (lines 737–740) and
resolveConfig.js (line 68).
Reporter notes
findings. The bundle's public tracking entry (without the working
exploit chain) is at
georgian-io/package-runtime-security-findings/advisories/AXIOS-002-prototype-pollution-config-fields.md.prefer to fold this into open PR #10922 (whose author is actively
responding to comments), please let me know and I'll coordinate.
requires a separate prototype-pollution primitive elsewhere in the
host process. That's how the existing GHSA-q8qp-cvcw-x6jj and
PR #10833 were framed too, so the precedent for "in-scope as a
hardening fix" is established.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: HTTP/2 adapter bypasses configured DNS lookup and proxy controls
CVE-2026-101898 / GHSA-3pq3-5fj3-cg6v
More information
Details
Summary
Axios for Node.js does not apply configured DNS lookup or proxy controls when a request uses
httpVersion: 2. The HTTP/1 adapter path wraps and forwardsconfig.lookup, builds normal request options, and applies proxy routing throughsetProxy(). The HTTP/2 path builds a session withhttp2.connect()using onlyoptions.http2Options, which drops the top-levellookup,agent, and proxy state.Applications are affected when they allow a user to influence request destinations, enable axios HTTP/2, and rely on axios
lookupor proxy routing to prevent SSRF or enforce outbound network policy.Impact
In affected server-side deployments, an attacker can cause axios to connect directly to destinations that the configured resolver or proxy would have rejected. Depending on reachable services, this can expose cloud metadata, internal service responses, or allow state-changing requests to internal systems.
This is not an unconditional SSRF in every axios deployment. It requires
httpVersion: 2and an application-level trust boundary where user-influenced URLs are constrained bylookupor proxy policy.Affected Functionality
Affected:
httpVersion: 2.config.lookupsupplied as a DNS policy.config.proxyand environment-derived proxy settings for HTTPS HTTP/2 requests.Not affected:
lookupto the transport and apply proxy handling.Technical Details
In
lib/adapters/http.js, the adapter readslookup, wraps it, stores it on the requestoptions, and appliessetProxy()before selecting a transport. For HTTP/2,http2Transport.request()builds an authority fromoptions.protocol,options.hostname, andoptions.port, then calls:lib/helpers/Http2Sessions.jsultimately callshttp2.connect(authority, options)with only thehttp2Optionsobject. The configured DNS lookup and the proxy or tunneling agent installed on the top-level request options are not forwarded into that call.Local verification on axios
1.18.1showedlookupCalls: 0while an HTTP/2 request to a local h2 origin succeeded. A second local HTTPS h2 verification with an explicit rejecting HTTP proxy showed the origin received the request and the proxy observed no traffic.Proof of Concept of Attack
Local constrained demonstration:
axios.get("http://localhost:<port>/internal", { httpVersion: 2, lookup })wherelookupthrowsEPOLICY.0.For proxy routing:
httpVersion: 2,http2Options: { rejectUnauthorized: false }, and explicitproxy.Expected safe behavior is that either the lookup policy blocks the request or the proxy observes and rejects the request.
Workarounds
Use the HTTP/1 adapter path for requests that depend on axios
lookupor proxy controls. Alternatively, enforce destination allow/deny policy before calling axios, outside the adapter transport path.Original report
Summary
I found that Axios does not apply the configured
lookupfunction or proxy when a request useshttpVersion: 2. The HTTP/1 adapter applies both controls, but the HTTP/2 path connects straight to the URL's hostname usinghttp2.connect().This matters for server applications that accept a user-influenced URL and use a custom DNS lookup or mandatory outbound proxy to prevent SSRF. Switching the Axios instance to HTTP/2 silently removes those controls, allowing the request to reach an address the application intended to block.
I reproduced this on the current npm release, Axios 1.18.1.
Details
The HTTP adapter reads and wraps the caller's
lookupfunction, builds the normal request options, and callssetProxy():lib/adapters/http.js, around lines 530-578: reads and wrapslookuplib/adapters/http.js, around lines 895-954: addslookuptooptionsand appliessetProxy()For HTTP/2, however, the adapter selects
http2Transport. That transport creates an authority from the destination and only passesoptions.http2Optionsto the session pool:lib/helpers/Http2Sessions.jsthen calls:At this point
optionsis only thehttp2Optionsobject. The top-levellookup, the proxy tunnelling agent created bysetProxy(), and the selectedhttpAgent/httpsAgentare not forwarded. The request therefore uses the system resolver and opens a direct connection to the origin.The same root cause affects both explicit proxy configuration and environment-derived proxy configuration. I kept the PoC local and used an explicit proxy so the result does not depend on shell environment variables.
PoC
I attached axios_http2_transport_controls_poc.mjs. The PoC is entirely local and sets up three pieces:
REACHED_BLOCKED_ORIGIN.502 Bad Gateway.lookupcallback that rejects every DNS lookup with anEPOLICYerror.The first request is an HTTP/1 control request. It uses the blocking
lookupcallback and has proxying disabled. Axios calls the callback, receivesEPOLICY, and does not reach the origin. This confirms that the callback works and that the hostname is blocked through the normal adapter path.The second request targets the same URL with
httpVersion: 2. It is given both security controls: the same blockinglookupcallback and the rejecting proxy. If Axios honors either one, this request cannot reach the origin. It should fail withEPOLICY, or it should reach the proxy and receive its502response.Instead, the request returns HTTP 200 with
REACHED_BLOCKED_ORIGIN. The lookup counter does not increase, and the proxy records no request or CONNECT attempt. The origin is the only server that records traffic. This shows that the HTTP/2 path skipped both controls and connected directly using the system resolver.To reproduce, run the attachment from the root of an Axios checkout:
Run it from the root of an Axios checkout:
Relevant output from my run:
The important parts of the output are:
http1ControlcontainsEPOLICY, proving the DNS policy blocks the destination under HTTP/1.lookupCallsis still1after both requests, proving HTTP/2 never called the configured resolver.proxyObservedTrafficisfalse, proving HTTP/2 did not use the configured proxy.http2Result.statusis200, and the sole event belongs to the origin, proving Axios connected directly to the blocked destination.Impact
The vulnerable configuration is a Node.js application that:
httpVersion: 2;lookupoption or proxy routing to enforce a destination or egress policy.In that setup, an unauthenticated application user may be able to make the server connect directly to loopback, private-network, or link-local services that the lookup policy or proxy would have rejected. Depending on the reachable service, this can expose cloud credentials or internal data, modify internal services, or affect availability.
HTTP/2 support is marked experimental, but neither the HTTP/2 documentation nor the proxy documentation says that
lookupand proxy controls are ignored. The proxy documentation states that HTTPS requests are sent through a CONNECT tunnel. More importantly, Axios's threat model tells callers that destination validation is their responsibility; this behavior silently bypasses such caller-supplied validation.I did not test against any third-party or production service. The PoC only uses listeners on my own machine.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: CIDR-form NO_PROXY entries are ignored, causing proxy exclusion bypass for internal IP ranges
CVE-2026-101899 / GHSA-44g4-m2mj-wpvx
More information
Details
Summary
Axios supports proxy environment variables and evaluates
NO_PROXYexclusions in the Node.js adapter. CIDR-formNO_PROXYentries such as127.0.0.0/8,10.0.0.0/8, or169.254.169.254/32are not interpreted as IP ranges. As a result, a request to an IP address inside a configured CIDR exclusion can still be sent through the configured proxy.This affects deployments that rely on CIDR notation to keep loopback, private, Kubernetes, CI, or cloud metadata traffic away from proxy infrastructure.
Impact
If the configured proxy is outside the intended trust boundary, requests that operators expected to bypass the proxy may be exposed to it. For plaintext HTTP targets, the proxy can see and modify URLs, headers, and bodies. For HTTPS targets, the proxy still observes connection metadata and may receive CONNECT requests that policy expected to avoid.
This is a proxy exclusion bypass, not arbitrary proxy injection by itself.
Affected Functionality
Affected:
HTTP_PROXY,HTTPS_PROXY,NO_PROXY, or lowercase equivalents.NO_PROXY.Not affected:
NO_PROXYentries where axios matching succeeds.proxy: false.Technical Details
lib/helpers/shouldBypassProxy.jsparses eachNO_PROXYentry into a host and optional port, normalizes hostnames, and then compares exact hostnames, suffix entries, wildcard-prefix entries, and loopback equivalents. It does not parse CIDR notation.Local verification on axios
1.18.1:The expected result for CIDR-aware bypass policy is
true.Proof of Concept of Attack
Constrained local demonstration:
HTTP_PROXY=http://127.0.0.1:<proxy-port>.NO_PROXY=127.0.0.0/8.http://127.0.0.1:<internal-port>/metadata.Workarounds
Use exact host or IP entries in
NO_PROXYfor sensitive destinations until CIDR matching is fixed, for example127.0.0.1,localhost,169.254.169.254. For individual requests that must not use a proxy, setproxy: false.Original report
Summary
Axios 1.17.0 honors
HTTP_PROXY/HTTPS_PROXYand supportsNO_PROXYhost exclusions, but CIDR-formNO_PROXYentries such as127.0.0.0/8are not treated as network ranges. As a result, requests to IPs covered by a configured CIDR exclusion may still be sent through the configured proxy.In the attached PoC, a request to
127.0.0.1is sent throughHTTP_PROXYdespiteNO_PROXY=127.0.0.0/8.This can cause proxy exclusion bypass in environments where operators use CIDR notation to exclude loopback, private, internal, Kubernetes, CI, or cloud metadata address ranges from proxying.
Details
Axios supports proxy environment variables, including
HTTP_PROXY/HTTPS_PROXYandNO_PROXY-style exclusions. Axios’s threat model treats environment proxy handling as security-relevant and listsNO_PROXYas a mitigation for proxy environment variable hijack, including hardening for CIDR ranges, IPv6 literals, and wildcard patterns. See:github.com/axios/axios@a8e4f13aee/THREATMODEL.md (t-r9-proxy-environment-variable-hijack)The issue is that CIDR-form
NO_PROXYentries are not interpreted as network ranges. For example:Since
127.0.0.1is inside127.0.0.0/8, an operator may reasonably expect Axios to bypass the proxy for this request. Instead, Axios sends the request throughHTTP_PROXY.This appears to affect the proxy bypass decision path used for
NO_PROXY/no_proxyhandling. The relevant behavior is in Axios's Node proxy handling andNO_PROXYevaluation logic, including theshouldBypassProxyhelper introduced forno_proxyhostname normalization and bypass checks.The issue is not that Axios ignores
NO_PROXYentirely. Exact host exclusions work. The issue is specifically that CIDR-form exclusions are silently treated as non-matching host/domain tokens rather than as network ranges, causing the request to be proxied.This is security-relevant because CIDR notation is commonly used in container, CI, enterprise proxy, and cloud environments for ranges such as:
If operators rely on those entries to prevent internal or metadata-style requests from traversing a proxy, Axios may violate that expectation.
PoC
Run the failing CIDR case:
Observed:
Control
Axios does honor exact IP
NO_PROXYentries:Expected:
This shows the issue is not that
NO_PROXYis ignored entirely. The bypass failure is specific to CIDR-form entries such as127.0.0.0/8.Impact
This is a proxy exclusion bypass caused by unsupported CIDR matching in
NO_PROXY.The impact is configuration-dependent. It affects Axios users in Node.js environments who rely on proxy environment variables and configure
NO_PROXYusing CIDR notation to exclude internal, loopback, private, Kubernetes, CI, or cloud metadata ranges.Potentially impacted environments include:
HTTP_PROXY/HTTPS_PROXY.NO_PROXYfor cluster-internal service ranges.NO_PROXYto keep metadata or internal service requests off proxy infrastructure.If a configured proxy is compromised, attacker-controlled, overly broad, or outside the intended trust boundary, requests that operators expected to stay direct may instead be exposed to that proxy. This may expose request URLs, internal hostnames, paths, headers, or credentials depending on application behavior.
This should not be characterized as arbitrary proxy injection by itself. The issue is that Axios silently fails to enforce common CIDR-form proxy exclusions, which can undermine proxy bypass policy and defense-in-depth assumptions.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Fetch Adapter Header Injection via Inherited FormData getHeaders
CVE-2026-101900 / GHSA-4hqw-qxg8-jxx2
More information
Details
Summary
Axios contains a guard in the Node HTTP adapter to avoid using an inherited
Object.prototype.getHeadersas a FormData header source. The fetch adapter calls the sharedresolveConfig()helper before dispatch, and that helper lacks the same guard. If another vulnerability pollutesObject.prototypewith FormData-like properties andgetHeaders(), the fetch adapter can merge attacker-controlled headers into the outbound request.Axios does not create the prototype pollution source. This is a read-side gadget in the fetch adapter configuration path.
Impact
An attacker with a prior same-process prototype-pollution primitive can inject headers into fetch-adapter requests. Depending on the target service, this may affect authorization, metadata-service access, cache behavior, conditional request handling, or other application-specific header logic.
Plain objects are blocked by current FormData detection. The confirmed path uses arrays or non-plain class instances whose prototype chain can resolve polluted FormData-like properties.
Affected Functionality
Affected:
resolveConfig()handling ofutils.isFormData(data).Symbol.toStringTag,append, andgetHeaders.Not affected:
data.getHeaders !== Object.prototype.getHeaders.isFormData()plain-object guard.Technical Details
lib/helpers/resolveConfig.jscurrently contains:Unlike
lib/adapters/http.js, this code does not rejectObject.prototype.getHeaders. Local verification on axios1.18.1pollutedObject.prototype[Symbol.toStringTag],append, andgetHeaders, then sent an array body withadapter: 'fetch'. The loopback server receivedX-Poisoned: yes.Proof of Concept of Attack
Constrained local demonstration:
Expected safe behavior is that inherited
Object.prototype.getHeadersis ignored. Current affected behavior merges the returned header.Workarounds
Use the Node HTTP adapter for server-side requests that may run in a polluted process. Avoid passing array or class-instance bodies through the fetch adapter when prototype pollution is suspected.
Original report
Summary
The Node HTTP adapter contains a guard that prevents
Object.prototype.getHeadersfrom being used as a FormData header source. The sharedresolveConfig()helper does not have the same guard. The fetch adapter callsresolveConfig(), so it can still merge headers returned by inheriteddata.getHeaders().This is a patch mismatch for the FormData prototype-pollution header-injection class.
Affected Version
Validated on:
1.17.04306df2v24.15.0Preconditions
adapter: 'fetch'.Object.prototype[Symbol.toStringTag] = 'FormData'Object.prototype.append = function () {}Object.prototype.getHeaders = function () { ... }isFormData()plain-object guard.Root Cause
lib/adapters/http.jscontains:But
lib/helpers/resolveConfig.jsonly checks:The fetch adapter calls
resolveConfig(config)before dispatching the request.Impact
An attacker can inject arbitrary headers into fetch-adapter requests. This may be used to influence internal APIs, metadata services, cache behavior, or application-specific authorization checks.
Proof of Concept
Observed wire request:
References
lib/adapters/http.js,lib/helpers/resolveConfig.jsSeverity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:L/SI:H/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Denial of Service via Unhandled 'error' Event in HTTP/2 ClientHttp2Session Initialization
CVE-2026-101901 / GHSA-542g-h47m-68v8
More information
Details
Summary
Axios versions with Node.js HTTP/2 support can terminate the caller’s process when a ClientHttp2Session emits an error event that is not handled by axios.
This affects applications that use the Node HTTP adapter with httpVersion: 2. A malicious, unavailable, or non-HTTP/2 endpoint can cause an uncaught exception instead of a normal rejected axios request.
Impact
The impact is denial of service. In affected applications, an attacker who can influence the request destination, or operate the destination server, may be able to crash the Node.js process.
This does not affect default HTTP/1.1 usage, browser XHR/fetch adapters, or applications that do not enable axios HTTP/2 support.
Affected Functionality
Affected path:
Caller-controlled http2Options can make the issue easier to trigger, but passing arbitrary attacker input into axios config is caller-controlled behavior and should not be the primary advisory framing.
Technical Details
Http2Sessions.getSession() creates a session with http2.connect(authority, options) but only registers a close handler. It does not register an error handler on the returned ClientHttp2Session.
When the session emits error, Node treats it as an unhandled EventEmitter error and throws. This can bypass the normal axios Promise rejection path and terminate the process.
Proof of Concept of Attack
Expected vulnerable behavior: the process exits with an uncaught ECONNREFUSED session error instead of only rejecting the axios request.
Workarounds
Disable axios HTTP/2 for untrusted or user-influenced destinations and use the default HTTP/1.1 adapter until a fixed release is available. Also avoid passing attacker-controlled values into http2Options; axios config is trusted application input.
Original report
Hi, i'm RelunSec a security researcher working with InsiteTech.jp
i want let you known, i finded a DoS in axios, to reproduce that, that is the example of a server
i tested all that in latest git version, after starting the server.cjs, to trigger that you just need do
that is extremly simple to trigger
it confirms a DoS in the HTTP/2 session cache, that needs be patched, the impact is will lead the server crashes and shutdown by an attacker, the server is written properly and no flaws in it and try catch blocks and errors handled however because that is an axios internal error will crash
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Prototype-Pollution Gadget in the Default Instance Allows Inherited Object.prototype.method to Override HTTP Method
CVE-2026-101902 / GHSA-9fr6-4gfg-395g
More information
Details
Summary
Axios default-instance requests that omit an explicit method can read an inherited
methodvalue fromObject.prototype. If another vulnerability in the same process pollutesObject.prototype.method, calls such asaxios.request({ url })andaxios({ url })can send a state-changing HTTP method instead of the expected defaultGET.Axios does not create the prototype pollution source. This is a read-side gadget in axios request dispatch.
Impact
In an affected application with a separate prototype-pollution primitive, an attacker can change axios default-instance requests that omit
methodfromGETto methods such asDELETE,POST,PUT, orPATCH. The practical impact depends on the target endpoint and can include unintended writes, deletion, or other state changes.Method aliases such as
axios.get(url)and requests with an explicit ownmethodare not affected by the confirmed method path.Affected Functionality
Affected:
axios.request({ url }).axios({ url }).config.methodis provided.Not affected in the confirmed method PoC:
axios.get(url)and other method aliases.axios.request({ url, method: 'GET' }).axios.create().request({ url })when the created instance defaults are produced by currentmergeConfig()and do not inherit fromObject.prototype.Technical Details
lib/core/Axios.jssets the request method with:mergeConfig()now returns a null-prototype request config, soconfig.methodis safe fromObject.prototype. However, the default axios instance stores the module defaults object asthis.defaults, and that defaults object is a normal object. IfObject.prototype.methodexists,this.defaults.methodresolves to the polluted inherited value.Local verification on axios
1.18.1showed a default-instanceaxios.request({ url })request reaching a loopback server asDELETEafterObject.prototype.method = 'DELETE'.Proof of Concept of Attack
Constrained local demonstration:
Expected safe behavior is a
GETrequest. Current affected behavior sendsDELETEon the default instance when no method is provided.Workarounds
Use explicit method aliases such as
axios.get()or set an ownmethodon request configs. Avoid default-instance shorthand for requests in processes where prototype pollution is suspected or possible.Original report
Summary
Axios
1.17.0contains a read-side prototype-pollution gadget in the default Axios instance. If another vulnerability in the same Node.js process pollutesObject.prototype.method, default-instance calls such asaxios.request({ url })andaxios({ url })can be forced to use an attacker-controlled HTTP method, such asDELETE, instead of the expected defaultGET.Axios does not create the prototype pollution by itself. The issue is that Axios reads fallback values from
this.defaultswithout an own-property guard, allowing inherited values fromObject.prototypeto influence request behavior.This should be treated as a prototype-pollution gadget, not as a standalone prototype-pollution source. In other words, Axios is not the component that lets the attacker write to
Object.prototype; Axios is the component that becomes dangerous afterObject.prototypehas already been polluted by another bug in the same process.Details
The vulnerable fallback read is in
lib/core/Axios.js:The merged request
configis created as a null-prototype object inlib/core/mergeConfig.js:Therefore, when the caller does not provide
config.method, the fallback becomes:The default Axios instance uses the module defaults object. In the tested version, that defaults object is affected by inherited properties from
Object.prototype. IfObject.prototype.methodis polluted,this.defaults.methodresolves to that inherited value and Axios uses it as the request method.The same unsafe inherited-property pattern also affects
this.defaults.allowAbsoluteUrls, which can change how absolute URLs are combined withbaseURL.Proof of Concept
Access and Attack Conditions
No admin access is required for Axios itself. This is a library-level gadget.
The attacker must have an existing way to pollute
Object.prototypein the same Node.js process, for example through a separate prototype-pollution vulnerability in another dependency or application input path. Axios is the gadget that turns that pollution into dangerous HTTP request behavior.Required condition:
What Axios contributes:
What Axios does not do:
Affected usage:
Not affected in the confirmed PoC:
Reproduction Steps
1.17.0:Object.prototype.method = "DELETE", default-instance calls that omit an explicit method are sent asDELETE.What the Method PoC Script Does
The PoC starts a temporary local HTTP server for each Axios call and records the HTTP method received by that server. It then simulates an already-existing prototype-pollution condition by setting:
While that pollution is active, the script sends five Axios requests:
The script then deletes the polluted property:
Finally, it prints the method observed by the local server for each request. The vulnerable behavior is confirmed when the default Axios instance sends
DELETEforaxios.request({ url })andaxios({ url }), while the safe comparison paths still sendGET.Method Override PoC
Create
validate-prototype-method-gadget.mjs:Run:
Observed result:
The local server received:
This confirms that inherited
Object.prototype.methodcontrols the default method for vulnerable default-instance request paths.Supporting
allowAbsoluteUrlsGadget EvidenceThe same inherited-property issue affects
allowAbsoluteUrls.Create
validate-prototype-allowabsoluteurls-gadget.mjs:Observed result:
Without pollution, Axios sends the request to the absolute URL. After
Object.prototype.allowAbsoluteUrls = false, the default Axios instance combines the absolute URL withbaseURLand sends the request to the base server instead. An instance created withaxios.create()remains unaffected.Impact
This is a prototype-pollution gadget. It becomes exploitable when an application has any separate prototype-pollution primitive that allows an attacker to set properties on
Object.prototypein the same Node.js process.If such pollution is possible, an attacker can influence Axios default-instance requests that omit an explicit method:
axios.request({ url })axios({ url })This can turn an expected safe default
GETrequest into a state-changing method such as:DELETEPOSTPUTPATCHPotential impact includes unauthorized state-changing requests, deletion of resources, unintended writes, data corruption, or denial of service when the target endpoint treats the HTTP method as security-relevant.
The issue does not require admin access to Axios itself, but it does require an existing prototype-pollution path in the application. Applications that always use explicit methods, method aliases such as
axios.get(), or isolated instances created throughaxios.create()are not affected by the confirmed method-override path.Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:H/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Header Injection via Inherited headers After Minimal Interceptor
CVE-2026-101904 / GHSA-j8rh-479h-cp32
More information
Details
Summary
Axios request interceptors may return a replacement config object. If an interceptor returns a plain object without an own
headersproperty,dispatchRequest()later evaluatesconfig.headersand can resolve an inheritedObject.prototype.headersvalue. In a process where another vulnerability has pollutedObject.prototype.headers, axios can send attacker-controlled headers.Axios does not create the prototype pollution source, and the interceptor itself is trusted caller code. The vulnerable behavior is the post-interceptor axios config read that reopens a prototype-pollution gadget after earlier null-prototype config hardening.
Impact
An attacker with a prior same-process prototype-pollution primitive can inject headers into affected axios requests when the application uses an interceptor that rebuilds config and omits headers. Depending on the target service, injected headers can affect cache behavior, conditional requests, metadata services, or application-specific authorization and routing logic.
The issue is conditional and should not be described as affecting every interceptor or every request.
Affected Functionality
Affected:
headersproperty.dispatchRequest()header normalization throughAxiosHeaders.from(config.headers).Not affected:
headersproperty.Technical Details
lib/core/dispatchRequest.jscontains:The initial merged config is null-prototype, but an interceptor can replace it with a normal object. If that object has no own
headers, the read can resolveObject.prototype.headers.Local verification on axios
1.18.1pollutedObject.prototype.headers = { 'X-Poisoned': 'yes' }, installed an interceptor that returned{ url, method, timeout, proxy: false }, and sent a request. The loopback server receivedX-Poisoned: yes.Proof of Concept of Attack
Constrained local demonstration:
Expected safe behavior is that missing headers normalize to an empty header set. Current affected behavior reads inherited
Object.prototype.headers.Workarounds
Interceptors that rebuild config should always set an own
headersproperty, for example by preservingconfig.headersor settingheaders: {}. Mutating and returning the existing merged config also avoids replacing the null-prototype object.Original report
Summary
Axios 1.17.0 blocks the old
Object.prototype.commonheader bucket gadget. However, if a request interceptor rebuilds a minimal config object and omitsheaders,dispatchRequest()reads inheritedObject.prototype.headers.This allows attacker-controlled headers to be placed on the wire.
Affected Version
Validated on:
1.17.04306df2v24.15.0Preconditions
Object.prototype.headers.headers.Root Cause
dispatchRequest()uses:If
configis a normal object returned by an interceptor and lacks ownheaders, this readsObject.prototype.headers.Impact
An attacker can inject request headers. Depending on the target service, this can cause cache manipulation, conditional-response suppression, request smuggling preconditions, metadata-service header injection, or application-specific authorization bypass.
Proof of Concept
Observed wire headers:
References
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:L/SI:H/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Node HTTP adapter prototype-pollution gadget allows request socket hijack via inherited createConnection
CVE-2026-101905 / GHSA-m8m8-qj5v-23w3
More information
Details
Summary
Axios' Node HTTP adapter can act as a read-side prototype-pollution gadget for Node's sensitive
createConnectionrequest option. The adapter creates a null-prototype options object, but Node's HTTP client can copy or normalize request options into ordinary objects before connection creation. IfObject.prototype.createConnectionhas been polluted elsewhere in the same process, Node can call the inherited function and create a socket to an attacker-controlled endpoint.Axios does not create the prototype pollution source. The vulnerability is that axios does not set an own safe value for a sensitive transport option before handing options to Node.
Impact
Given a prior same-process prototype-pollution primitive, an attacker can redirect later axios Node HTTP requests at the socket layer while the request URL and axios config still appear to target the legitimate origin. The attacker-controlled endpoint can receive request headers and bodies, including Authorization headers, cookies, API keys, and service credentials, and can return attacker-controlled responses to the application.
This can bypass application destination validation that checks the URL before calling axios, because the URL remains legitimate while the underlying socket goes elsewhere.
Affected Functionality
Affected:
createConnection.Object.prototype.createConnectionis polluted.Not affected:
createConnectionand sanitizes options internally.Technical Details
lib/adapters/http.jscreates:The object does not include an own
createConnectionproperty. Local verification on axios1.18.1pollutedObject.prototype.createConnectionto connect to an attacker loopback server. A request to a legitimate loopback server with an Authorization header returned the attacker's response; the legitimate server received no request and the attacker server receivedBearer SECRET.Proof of Concept of Attack
Constrained local demonstration:
Expected safe behavior is that the legitimate server receives the request. Current affected behavior lets the attacker server receive the request and return the response.
Workarounds
Run axios in a process where prototype pollution is not present. For high-risk internal clients, use a custom trusted transport or agent layer that sets and enforces its own connection creation behavior instead of allowing inherited Node request options to participate.
Original report
Summary
Axios' Node HTTP adapter remains exploitable as a read-side prototype-pollution gadget after the recent null-prototype hardening. This is not a claim that axios creates the prototype pollution source. The precondition is a separate upstream prototype pollution primitive in the same Node.js process.
When
Object.prototype.createConnectionis polluted, axios requests can be redirected to an attacker-controlled socket even though the adapter builds the request options withObject.create(null). The request URL and axios config still appear to target the legitimate host, but the actual socket is attacker-controlled.This allows credential exfiltration and response manipulation for later axios HTTP requests in a polluted process.
Impact
Given an upstream prototype pollution primitive in the same process, an attacker can turn later axios HTTP requests into a man-in-the-middle primitive:
The important boundary here is axios' documented/read-side prototype-pollution hardening. The project threat model discusses polluted
Object.prototypefrom transitive dependencies as an in-scope read-side gadget class where axios should avoid picking up inherited behavior-changing properties. This issue is a bypass of that hardening at the Node HTTP request-options boundary.Technical details
The HTTP adapter constructs a null-prototype request options object before calling the selected transport:
That prevents direct inherited reads while the options object remains null-prototype. However, Node's HTTP client path copies or normalizes request options into ordinary objects before connection creation. After that copy, missing properties can resolve from
Object.prototypeagain.createConnectionis a sensitive Node HTTP option. If it is inherited after this copy, Node calls the attacker-supplied function to create the socket.Reproduction
The following minimal proof uses a legitimate target server and an attacker server. It pollutes
Object.prototype.createConnection, then makes an axios request to the legitimate server with an Authorization header.Observed result on the current npm package:
The request never reached the intended target. The attacker-controlled server received the Authorization header and supplied the response body returned by axios.
Versions tested
I reproduced this against:
v1.xsource at commita8e4f13aeecc45a3b8fab3ecfd9ddb5d70fb772bFix validation
Adding an own safe value for
createConnectionto the adapter options object prevents inherited pollution from being observed after Node's option copy:With that guard in place, the same proof no longer calls the polluted function. The legitimate server receives the request, the attacker server receives nothing, and axios returns the legitimate response.
Remediation
Set own safe defaults for sensitive Node HTTP request options before calling
transport.request, at minimum:I recommend reviewing other sensitive Node HTTP options that may be read after Node copies the request options into a normal object, especially connection/TLS-affecting fields such as
lookup,timeout,localAddress,servername,signal, and related options.Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: ReDoS (O(N²)) in shouldBypassProxy host normalization, reachable via untrusted redirect Location
CVE-2026-101906 / GHSA-mghh-pgcx-3jjj
More information
Details
Summary
Axios
shouldBypassProxy()normalizes hostnames withhostname.replace(/\.+$/, ''). For a hostname shaped as many dots followed by a non-dot, the anchored regex can perform quadratic backtracking. Because axios re-evaluates proxy bypass rules for redirected requests, a malicious server can trigger this synchronous work through a crafted redirectLocation.The issue affects Node.js applications that use environment proxy variables with
NO_PROXYand allow redirects.Impact
An attacker-controlled server can return a redirect whose hostname causes the axios process to spend significant CPU time in synchronous hostname normalization. During this time, the Node.js event loop is blocked and the application cannot handle other work on that thread.
This is an availability-only issue. It does not disclose request data or modify requests.
Affected Functionality
Affected:
HTTP_PROXYorHTTPS_PROXY.NO_PROXYorno_proxyset to a non-empty value.follow-redirects.Not affected:
proxy: false.NO_PROXYvalue.maxRedirects: 0, unless application code manually follows the malicious redirect and re-enters axios.Technical Details
lib/helpers/shouldBypassProxy.jscontains:When the hostname is
"." * n + "a", the$anchor causes the regex engine to retry the dot run from many positions before it fails.setProxy()invokesshouldBypassProxy(location)aftergetProxyForUrl(location)returns a proxy, including on redirect hops viabeforeRedirects.proxy.Local timing on axios
1.18.1showed increasing cost for crafted hostnames: about 1 ms at 1000 dots, 6.9 ms at 3000 dots, and 34.5 ms at 6000 dots. The growth is consistent with the submitted quadratic claim while avoiding long-running payloads.Proof of Concept of Attack
Constrained helper-level demonstration:
In the full adapter path, a malicious server can return that hostname in a
302 Locationheader while the client has proxy environment variables andNO_PROXYconfigured.Workarounds
Disable automatic redirects for requests to untrusted servers, or avoid environment proxy handling for those requests with
proxy: falsewhen appropriate. Operators can also avoid broad untrusted redirect-following in services where event-loop availability is critical.Original report
Summary
shouldBypassProxy normalizes a host with hostname.replace(/.+$/, ''). On a host of the shape (e.g. "." × 40000 + "a"), this anchored regex backtracks quadratically (O(N²)), synchronously starving the Node.js event loop. Because axios re-evaluates the proxy on every redirect using the new Location host, a malicious server can return a crafted 302 Location and freeze the client's event loop for seconds per redirect — a denial of service.
Details
/ is O(N²) on a long run of dots that is not at the end of the string — theanchor forces the engine to backtrack the entire dot-run from every start position.PoC
Self-contained, no network — imports axios's own helper:
// node poc.mjs (run next to an axios install)
import sbp from './node_modules/axios/lib/helpers/shouldBypassProxy.js';
process.env.NO_PROXY = 'example.com';
for (const n of [5000, 10000, 20000, 40000]) {
const url = 'http://' + '.'.repeat(n) + 'a/'; // arrives as an untrusted 302 Location host
const t0 = process.hrtime.bigint();
sbp(url); // returns false (correct no-bypass) — but O(N^2) slow
console.log(
N=${n}: ${(Number(process.hrtime.bigint()-t0)/1e6)|0} ms);}
// Measured on 1.18.1: N=5000 ~43ms, 10000 ~160ms, 20000 ~618ms, 40000 ~2499ms; benign host ~0.05ms.
Driven through the real http-adapter __setProxy on the redirect path (setProxy(…, isRedirect=true)), a 10 ms timer fires 0 times during the ~2.4 s block at N=40000 — full event-loop starvation.
Impact
Denial of service (event-loop starvation) on any axios client that uses an environment proxy with NO_PROXY set and follows redirects, when a server it contacts returns a crafted redirect Location. No data exposure or RCE. Same impact class as the accepted DoS advisories GHSA-62hf-57xw-28j9 (toFormData recursion) and the maxContentLength response-size DoS.
Suggested fix
Replace the regex trailing-dot strip with a linear trim:
let end = hostname.length;
while (end > 0 && hostname.charCodeAt(end - 1) === 46 /* '.' */) end--;
hostname = hostname.slice(0, end);
Also drop the redundant second /.+$/ pass in PR #11029's normalizeIPAddress.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Prototype pollution gadget in fetch adapter can alter outbound requests
CVE-2026-101908 / GHSA-vh66-26gq-q6x8
More information
Details
Summary
Axios fetch adapter requests can be altered by inherited properties on
fetchOptions. The adapter resolves method, headers, body, signal, and credentials intoresolvedOptions, creates aRequest, and then callsfetch(request, fetchOptions)instead offetch(request, resolvedOptions). In runtimes such as Node's undici-backed fetch, inheritedfetchOptions.headerscan override the headers already placed on theRequest.Axios does not create the prototype pollution source. This is a read-side gadget that becomes exploitable after same-process prototype pollution.
Impact
An attacker with a prior prototype-pollution primitive can cause affected fetch-adapter requests to send attacker-controlled headers and drop caller-specified headers. This can affect authorization, cache behavior, metadata-service interactions, or application-specific header-based controls.
The issue is specific to fetch-adapter behavior and does not affect Node HTTP adapter requests.
Affected Functionality
Affected:
adapter: 'fetch'.fetchOptionsis an object that does not have safe own values for sensitive fetch init fields.Not affected:
Object.prototypeis not polluted.Technical Details
lib/adapters/fetch.jsbuilds:The fallback path without
RequestusesresolvedOptions, but theRequestpath passes the originalfetchOptionsas the second argument tofetch(). That second argument can contain inherited properties fromObject.prototype.Local verification on axios
1.18.1setObject.prototype.headers = { Authorization: 'Bearer POLLUTED' }and called the fetch adapter withheaders: { 'X-Good': 'yes' }, fetchOptions: {}. The loopback server receivedAuthorization: Bearer POLLUTEDand did not receiveX-Good.Proof of Concept of Attack
Constrained local demonstration:
Expected safe behavior is that the sanitized axios headers remain in force. Current behavior can use the inherited fetch init headers instead.
Workarounds
Use the Node HTTP adapter for security-sensitive server-side requests until fixed. If the fetch adapter must be used, avoid passing empty
fetchOptionsobjects in processes where prototype pollution is possible, and set explicit safe own values for fetch init fields.Original report
Hello, I’m not completely sure if this is something you’d consider a security issue, since it depends on prototype pollution happening somewhere else first, but I wanted to report it just in case.
I was testing the fetch adapter with polluted prototype values and found that
Object.prototype.headerscan change the request axios sends.The issue seems to be in
lib/adapters/fetch.js. Axios creates aRequestwith the resolved headers/method/body, but then sends it withfetch(request, fetchOptions). With undici, iffetchOptionsdoesn’t have its own headers, an inheritedObject.prototype.headersvalue can be used during the final fetch call.I tested it with this:
The result I get is:
So the polluted Authorization header is sent, and the normal axios header is not.
Changing the fetch call to pass the already resolved options fixes it for me:
resolvedOptionsalready includes...fetchOptions, so custom fetch options should still work, while headers, method, body, and signal stay as clean own values.Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:L/SI:H/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Axios: Prototype Pollution Gadget in axios toFormData Options
CVE-2026-101909 / GHSA-x97p-jq2g-jp4f
More information
Details
Summary
Axios form serialization reads
visitor,maxDepth,dots,indexes,metaTokens, andBlobfrom an internal options object without own-property guards. WhenObject.prototypehas been polluted elsewhere in the same process, those inherited values can change how axios serializes multipart and URL-encoded request bodies.Axios does not create the prototype pollution source. This is a read-side gadget: axios turns an existing same-process pollution condition into altered request serialization or request failures.
Impact
The impact depends on which property is polluted and which axios serialization path the application uses.
Polluted
dots,indexes, ormetaTokenscan change field names and cause the receiving service to parse different data than the caller intended. PollutedmaxDepthcan cause nested form submissions to throwERR_FORM_DATA_DEPTH_EXCEEDED, producing request-level or service-level denial of service for affected workflows. Pollutedvisitorcan execute as the serializer visitor if an attacker can place a function onObject.prototype, but that condition generally implies a stronger same-process code-execution or malicious-dependency primitive and should be described carefully.Affected Functionality
Affected:
axios.toFormData().transformRequestpaths that serialize plain objects tomultipart/form-data.formSerializeroption defaults when the relevant properties are absent as own properties.Not affected:
toFormData().Object.prototypeis not polluted.Technical Details
lib/helpers/toFormData.jsmerges caller options with defaults usingutils.toFlatObject(). Whenoptionsisundefined,toFlatObject()returns the default object unchanged:That default object has
Object.prototypein its prototype chain.toFormData()then reads behavior-affecting values directly:These reads can resolve inherited polluted properties.
Local code review confirmed the direct reads in
v1.18.1. Tag checks show the option-based form serializer exists inv0.28.0and later;maxDepthappears in the1.xline from the form recursion fix.Proof of Concept of Attack
Constrained local demonstration:
Expected safe behavior is that the default max depth is used unless the caller sets an own
formSerializer.maxDepth. Current behavior reads the inherited value and can throwERR_FORM_DATA_DEPTH_EXCEEDED.For serializer alteration, polluting
Object.prototype.dots = truechanges nested field naming from bracket notation to dot notation when the caller did not opt into that behavior.Workarounds
Avoid serializing attacker-controlled objects as form data in a process with known prototype pollution. As a partial mitigation, callers can pass an own
formSerializerobject that sets explicit safe values for all relevant keys, includingvisitor,maxDepth,dots,indexes,metaTokens, andBlob.Original report
Summary
axios v1.18.1 contains a read-side prototype pollution gadget in its form data serialization logic. Six option properties (
visitor,maxDepth,dots,indexes,metaTokens,Blob) are read from a plain JavaScript object that inherits fromObject.prototypewithouthasOwnPropertyguards. WhenObject.prototypehas been polluted elsewhere in the process a common consequence of compromised transitive npm dependencies, these polluted values silently control axios' form serialization behavior.The highest-impact gadget is
visitor: a polluted function onObject.prototype.visitoris invoked for every key-value pair during multipart and URL-encoded form serialization, receiving the value, key, path, and internal helper functions as arguments.Details
Root Cause
The attack chain has three steps:
Step 1:
formSerializeris read safely, butundefinedflows throughIn
lib/defaults/index.js, the defaulttransformRequestfunction readsformSerializerfrom config using theown()helper, which enforceshasOwnProp:When the user does not explicitly configure
formSerializer, this correctly returnsundefined. Thatundefinedis then passed as theoptionsparameter totoFormData():Step 2:
toFlatObjectreturns a plain-object defaultInside
lib/helpers/toFormData.js,options(which isundefined) is merged with defaults viautils.toFlatObject():toFlatObjecthas an early-return for null/undefined sources:Since
optionsisundefined, the function returnsdestObjunchanged — the plain object{ metaTokens: true, dots: false, indexes: false }. This object's prototype isObject.prototype.Step 3: Options are read without
hasOwnPropguardsThe six option properties are read directly from the plain object:
None of these reads use
utils.hasOwnProp(). Since theoptionsobject inherits fromObject.prototype, any property set onObject.prototypeby a compromised dependency is resolved through the prototype chain.Why the Existing Defenses Didn't Catch This
axios has extensive prototype pollution defenses. However, those defenses are all focused on the config object (created by
mergeConfig, which returnsObject.create(null)). ThetoFormDatafunction creates its own internal options object that sits outside that boundary, and the 6 reads on that internal object were never audited.PoC
Reproduction Steps
Environment
Any environment with Node.js and npm. Tested on:
- Node.js v24.15.0, npm 11.13.0
- axios v1.18.1 (latest release at time of writing)
Step 1: Create a fresh project
Step 2: Create the PoC file
Create
poc.mjswith the following content:Step 3: Run the PoC
Impact
1. Data Exfiltration via
visitor(Confidentiality: High)A polluted
Object.prototype.visitorfunction is called as the form data visitor:The attacker receives:
-
value— the raw value being serialized (passwords, tokens, PII, API keys)-
key— the field name-
path— the full path array (e.g.,['profile', 'address', 'street'])-
exposedHelpers— internal helpers includingdefaultVisitor,convertValue,isVisitableBy delegating to
helpers.defaultVisitor, the attack is completely transparent, the request succeeds normally and the server receives intact data. The exfiltration is invisible to both the caller and the server.2. Denial of Service via
maxDepth(Availability: Low)A polluted
Object.prototype.maxDepthof1or2causes any moderately nested form data request to throwERR_FORM_DATA_DEPTH_EXCEEDED. Applications that send nested objects as form data (common with APIs that acceptprofile[name],address[city], etc.) will experience mysterious failures.3. Data Corruption via
dots,indexes,metaTokens(Integrity: Low)Polluting these options changes the serialization format of form field names:
-
dots: true— changes bracket notation (user[name]) to dot notation (user.name)-
indexes: true— changes array serialization (items[]) to indexed (items[0],items[1])-
metaTokens: false— changesobj{}keys to raw json stringsThe server may misinterpret the submitted form data, leading to silent data corruption.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:H/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Release Notes
axios/axios (axios)
v1.20.0Compare Source
v1.20.0 — August 19, 2026
This release hardens runtime option handling, adds RFC 9110 status-code aliases, fixes Node.js and XHR reliability issues, and refreshes project tooling and documentation.
⚠️ Breaking Changes & Deprecations
🔒 Security Fixes
🐛 Bug Fixes
🔧 Maintenance & Chores
🌟 New Contributors
We are thrilled to welcome our new contributors. Thank you for helping improve axios:
Full Changelog (https://github.com/axios/axios/compare/v1.19.0...v1.20.0)
v1.19.0Compare Source
This release raises the form-data security floor, adds configuration and type-system capabilities, and fixes NO_PROXY matching, interceptor errors, progress reporting, and serialization edge cases.
v1.18.1Compare Source
v1.18.1 — June 21, 2026
This release focuses on Node HTTP adapter fixes, safer AxiosError serialisation, runtime/type correctness fixes, documentation updates, and dependency maintenance.
🐛 Bug Fixes
encoder.call(this)receives theAxiosURLSearchParamsinstance correctly. (#11019)🔧 Maintenance & Chores
Documentation: Documented sensitive headers and status transition behaviour, prepared cleaned-up docs, added Deno install instructions, and clarified that request data is request-specific (#11007, #11010, #11023, #11025)
Dependencies: Bumped vite, rollup, form-data, js-yaml, and multer across the root project, docs, smoke tests, and module test workspaces. (#11011, #11012, #11013, #11014, #11015, #11016, #11017, #11026)
🌟 New Contributors
We are thrilled to welcome our new contributors. Thank you for helping improve axios:
Full Changelog
v1.18.0Compare Source
This release hardens redirect and URL handling, improves the validateStatus configuration semantics, and includes updates to documentation, dependencies, and release metadata.
v1.17.0Compare Source
This release adds Node HTTP zstd decompression, hardens config and release workflows, and fixes authentication, header, proxy, and type-handling regressions.
v1.16.1Compare Source
This release ships a defence-in-depth fix for prototype pollution in
formDataToJSON, hardens proxy and CI workflows, restores Webpack 4 compatibility for the fetch adapter, and includes several small bug fixes and maintenance improvements.Configuration
📅 Schedule: (in timezone Europe/Berlin)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Mend Renovate CLI.
deps(deps): update dependency axios to v1.20.0to deps(deps): update dependency axios to v1.20.0 - autoclosedPull request closed