{"id":"CVE-2026-113603","kind":"vulnerability","aliases":["CVE-2026-113603"],"related":[],"title":"x402 SIWX extension lets paid clients unlock unpaid routes","description":"The x402 SIWX server extension in @x402/extensions 2.3.1 through 2.28.0, x402 PyPI 2.11.0 through 2.25.0, and Go module 2.16.0 through 2.28.0 contains an authorization bypass vulnerability that allows paying clients to unlock unpaid routes by supplying a mismatched PaymentPayload.resource URL. Attackers can pay for the cheapest SIWX-protected route while setting resource.url to an expensive route, then repeatedly access it using only a SIGN-IN-WITH-X header without further payment.","summary":"The x402 SIWX server extension in the npm, PyPI and Go packages does not check that a payment matches the route it unlocks. A paying client can pay for a cheap route, point the payment's resource URL at an expensive route, and then reuse a sign-in header to access the expensive route without paying.","severity":"medium","cvss":6.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["go","node","package","python","self-hosted","x402"],"not_affected_if":["no-siwx-extension","single-price-route"],"how_to_check":"- Check the installed version of `@x402/extensions` in package.json or the lockfile, and of `x402` in the Python environment (`pip show x402`), and the Go module version in go.mod.\n- Look for SIWX (SIGN-IN-WITH-X) route protection in your x402 server configuration.","fix":"- Upgrade `@x402/extensions` past `2.28.0` (fixed version unknown from the sources).\n- Upgrade the PyPI `x402` package past `2.25.0` and the Go module past `2.28.0` (fixed versions unknown from the sources).","status":"open","published_at":"2026-10-20T16:17:10+00:00","first_seen_at":"2026-10-23T21:57:20+00:00","triaged_at":"2026-10-25T03:40:29+00:00","updated_at":"2026-10-25T03:40:29+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-10-25T03:40:29Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade `@x402/extensions` past `2.28.0` (fixed version unknown from the sources).\n- Upgrade the PyPI `x402` package past `2.25.0` and the Go module past `2.28.0` (fixed versions unknown from the sources).","reach":"internet","title":"x402 SIWX extension lets paid clients unlock unpaid routes","impact":"medium","summary":"The x402 SIWX server extension in the npm, PyPI and Go packages does not check that a payment matches the route it unlocks. A paying client can pay for a cheap route, point the payment's resource URL at an expensive route, and then reuse a sign-in header to access the expensive route without paying.","category":"package","nicknames":[],"who_cares":["x402","node","python","go","self-hosted"],"confidence":0.7,"needs_auth":"yes","worst_case":"Attackers access expensive paid routes after paying only for a cheaper one.","analyst_note":"Confirm fixed versions for @x402/extensions, x402 PyPI and the Go module from the NVD entry or the upstream advisory; the sources give only affected ranges.","how_to_check":"- Check the installed version of `@x402/extensions` in package.json or the lockfile, and of `x402` in the Python environment (`pip show x402`), and the Go module version in go.mod.\n- Look for SIWX (SIGN-IN-WITH-X) route protection in your x402 server configuration.","needs_analyst":true,"not_affected_if":["no-siwx-extension","single-price-route"],"who_is_affected":"Servers that use the x402 payment protocol with the SIWX extension to protect paid routes are exposed, because the server trusts the resource URL supplied in the client's payment payload. Teams that do not use the SIWX extension, or that do not sell access to multiple priced routes through x402, can skip it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000679,"input_tokens":3433,"output_tokens":671,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-113603':12A,15A '-2026':11A,14A '2.11.0':93C '2.16.0':99C '2.25.0':95C '2.28.0':90C,101C '2.3.1':88C 'access':75B,140C 'allow':108C 'attack':121C 'author':104C 'bypass':105C 'cheap':54B 'cheapest':126C 'check':38B 'client':6A,49B,110C 'contain':102C 'cve':10A,13A 'expens':64B,77B,136C 'extens':3A,28B,85C 'go':16B,34B,97C 'header':73B,150C 'host':22B 'let':4A 'match':42B 'mismatch':118C 'modul':98C 'node':17B 'npm':31B 'packag':18B,35B 'paid':5A 'pay':48B,51B,80B,109C,123C 'payment':41B,58B,153C 'paymentpayload.resource':119C 'point':56B 'protect':129C 'pypi':32B,92C 'python':19B 'repeat':139C 'resourc':60B 'resource.url':133C 'reus':68B 'rout':9A,44B,55B,65B,78B,114C,130C,137C 'self':21B 'self-host':20B 'server':27B,84C 'set':132C 'sign':71B,146C 'sign-in':70B 'sign-in-with-x':145C 'siwx':2A,26B,83C,128C 'siwx-protect':127C 'suppli':116C 'unlock':7A,46B,112C 'unpaid':8A,113C 'url':61B,120C 'use':142C 'vulner':106C 'without':79B,151C 'x':149C 'x402':1A,23B,25B,82C,91C 'x402/extensions':87C","nicknames":[],"mitigations":[],"who_affected":"Servers that use the x402 payment protocol with the SIWX extension to protect paid routes are exposed, because the server trusts the resource URL supplied in the client's payment payload. Teams that do not use the SIWX extension, or that do not sell access to multiple priced routes through x402, can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-20T16:17:10+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/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":"disclosure@vulncheck.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-113603","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-113603","severity":null,"published_at":"2026-10-20T16:17:10+00:00","modified_at":"2026-10-21T16:17:23+00:00","first_seen_at":"2026-10-23T21:57:20+00:00","fetched_at":"2026-10-23T22:28:58+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}