Skip to content

2.4.0-rc.20

Pre-release
Pre-release

Choose a tag to compare

@lakhansamani lakhansamani released this 13 Aug 13:40
· 23 commits to main since this release
5715865

Security release on top of 2.4.0-rc.19. Upgrading from rc.19 or earlier requires one configuration change — see Breaking change below.

This release closes four vulnerabilities found by verifying a backlog of community-reported security advisories. All four were confirmed live on main with a reproducing test before being fixed.

⚠️ Breaking change: --url is now required

Authorizer will refuse to start without a valid --url (e.g. --url=https://auth.example.com).

Without it, every self-referential URL this server emits — password-reset links, email-verification links, magic links, the JWT iss claim, the OIDC discovery and JWKS URLs — was derived from request headers. An unauthenticated attacker could send a forgot-password request carrying their own Host, and the victim would receive a genuine reset link pointing at the attacker's domain. Clicking it handed over the token, and because iss was validated against the same header-derived host, the attacker redeemed it by replaying the spoofed header. Account takeover with no prior access and no mailbox compromise (CWE-640).

An unusable value is refused too (--url=auth.example.com with no scheme, or one containing user info), because such a value was previously discarded and silently fell back to header derivation — looking configured while staying vulnerable.

--url is not --allowed-origins. You need both:

Flag Answers Shape
--url What address is this server reachable at? Used for the links it emails, its iss claim, its OIDC discovery document. One value, required
--allowed-origins Which apps may this server redirect users and tokens to, and which browser origins may call it? A list, wildcards allowed

Typically --url is your Authorizer deployment (https://auth.example.com) and --allowed-origins are your applications (https://app.example.com). They usually differ. Adding your app to --allowed-origins does not satisfy --url, and setting --url does not let you omit --allowed-origins.

One interaction worth knowing: when --allowed-origins is empty or *, redirects are restricted to the server's own host — which now comes from --url.

Security fixes

Redirect/CORS allowlist bypass via lookalike domains. An exact allowlist entry was spliced into a regular expression with its dots left unescaped, so https://login.acme.com compiled to ^login.acme.com$ where every . matches any character. An attacker who registered loginxacme.com or login-acme.com passed validation and received OAuth access tokens, ID tokens and password-reset tokens. Only the wildcard branch escaped its dots; the exact branch — the documented production hardening — did not. This was an incomplete fix of GHSA-x3f4-v83f-7wp2 / CVE-2026-54072.

Exact origins are now compared as strings, never as patterns. Wildcards are escaped whole with only the * re-opened. Both validators route through one matcher, since the duplicated blocks are how they came to diverge.

SSRF guard bypass via IPv6 transition addresses. The private-range blocklist did not cover the transition mechanisms that embed an IPv4 address inside an IPv6 one, so 2002:a9fe:a9fe:: (6to4) and 64:ff9b::a9fe:a9fe (NAT64) both reached 169.254.169.254, the cloud metadata endpoint, through webhook and OIDC endpoint validation. 2002::/16, 2001::/32, 64:ff9b::/96, 64:ff9b:1::/48, ::/128 and 100::/64 are now blocked. Admin-privileged to reach.

Password-reset poisoning via Host header. Closed by the --url requirement above.

Also in this release

SECURITY.md now states the three outcomes every report reaches — confirmed (reproduced with a failing test that ships with the fix), not accepted (closed with a written reason, original preserved), or needs-info — and AGENTS.md carries the triage runbook behind them.

Upgrade notes

Set --url and you are done. If you are upgrading from rc.15 or earlier, read the rc.16 notes first — that release carried the full 22-finding pre-release security audit. Note that rc.15 was tagged but its build was cancelled — no rc.15 image was ever published.

Matching SDK releases

SDK Version
authorizer-js 4.0.0-rc.0 (npm rc tag)
authorizer-react 2.2.0-rc.7 (npm rc tag)
authorizer-go v2.2.0-rc.5
authorizer-py 0.3.0rc4
authorizer-proto-go v0.2.0-rc.1
authorizer-proto 0.2.0rc1