{"schema":"threatline.record/2","record":{"id":"GHSA-c5g7-c47h-f6c3","aliases":["GHSA-c5g7-c47h-f6c3"],"summary":"An upload destination's address was called by the server without checking it against private and metadata networks","details":"### Summary\n\n`POST /v1/cloud-upload/targets` and `POST /v1/cloud-upload/targets/test` take a `base_url` from the request body and call `{base_url}/v1/me` from the server to learn which workspace a key belongs to; an upload to a stored destination then calls `{base_url}/v1/uhp`. Neither call checked the address. Anyone holding an API key could make the server request any host and port, including private, loopback and link-local (cloud metadata) addresses, and read back the status the target answered with and the workspace fields it returned. MCP server, database and git addresses already passed the server's internal-address check; this path never called it.\n\n### Who is affected\n\nDeployments from 0.9.0 up to and including 0.31.12 where one gateway serves several organizations through a shared runner pool. A self-hosted install of the image, whose runner runs beside its gateway, is not affected: there a key holder's tasks already run commands on the box's own network, and that network stays allowed for upload destinations, as it does for MCP servers and databases.\n\n### Patches\n\nFixed in **0.31.13**. On a shared deployment a destination's address must be https, and a name that resolves to a private, local or metadata network, or that does not resolve, is refused before any call, with every address the name resolves to checked. A destination stored before the fix is checked again before each upload. Redirects were not followed and still are not.\n\nIn 0.31.13 the check resolved the name before the call and the connection resolved it again, so a name that changed its answer between the two was not covered. **0.32.1** closes that for every address the server checks this way: the connection goes only to an address classified in the same step.\n\n### Workarounds\n\nUntil you can upgrade, block the gateway's outbound traffic to private, loopback and link-local networks at the network layer.\n\n### Credits\n\nReported privately by @mikannse.","categories":["Unclassified"],"product":"harnessrouter/harnessrouter","vendor":"","ecosystem":null,"affected_ranges":[{"source":"GitHub Advisory Database","source_url":"https://github.com/HarnessRouter/harnessrouter/security/advisories/GHSA-c5g7-c47h-f6c3","source_modified_at":"2026-10-08T04:16:22Z","fetched_at":"2026-10-23T19:00:29.328130Z","package":{"ecosystem":"other","name":"harnessrouter/harnessrouter"},"range":">= 0.9.0, < 0.31.13"}],"fixed_versions":[{"source":"GitHub Advisory Database","source_url":"https://github.com/HarnessRouter/harnessrouter/security/advisories/GHSA-c5g7-c47h-f6c3","source_modified_at":"2026-10-08T04:16:22Z","fetched_at":"2026-10-23T19:00:29.328130Z","package":{"ecosystem":"other","name":"harnessrouter/harnessrouter"},"version":"0.31.13"}],"cvss":6.4,"severity":"Medium","kev":{"listed":false},"epss":{"probability":null,"percentile":null,"score_date":null},"published_at":"2026-10-08T01:58:14Z","modified_at":"2026-10-08T04:16:22Z","provenance":[{"source":"GitHub Advisory Database","url":"https://github.com/HarnessRouter/harnessrouter/security/advisories/GHSA-c5g7-c47h-f6c3","fetched_at":"2026-10-23T19:00:29.328130Z","source_modified_at":"2026-10-08T04:16:22Z"}],"sources":["GitHub Advisory Database"],"references":[],"locations":[],"motoko_assessment":{"status":"requires_architecture_review","automatic_remediation":false},"classification":{"method":"product-first software-layer rules","rules_version":"2.1","matched_on":null,"confidence":"unknown","reviewed":false},"change_timestamp":"2026-10-08T04:16:22Z","content_hash":"a6b87ed3693cd84f4f49c68b3ff3d4c0247a62ceef74fdab067e4bc5ab01ef7b"}}
