◐ Shell
clean mode source ↗

fix!: only trust x-forwarded-host from configured trusted proxies by geokat · Pull Request #26204 · coder/coder

Subdomain app routing derived the app identity from
httpapi.RequestHost, which returned the client-supplied
X-Forwarded-Host header verbatim. No middleware validated or stripped
that header, so a request from an untrusted peer could forge it. Since
the application_connect cookie is scoped to the wildcard apps domain,
JavaScript in a share=authenticated app could fetch() with a forged
X-Forwarded-Host pointing at a victim's owner-only app; coderd routed
and authorized the request as the victim and returned the private app
response same-origin to the attacker.

Replace RequestHost with httpmw.EffectiveHost, which honors
X-Forwarded-Host only when the original socket peer is a configured
trusted origin, otherwise falling back to the received Host header.
This ties host trust to the same RealIPConfig model already used for
X-Forwarded-For and -Proto. Wire it into HandleSubdomain for both
coderd and wsproxy, and log both the effective host and the raw
received_host.

Add coverage: EffectiveHost unit tests assert the trust decision uses
the socket peer rather than the spoofable forwarded client IP, and a
HandleSubdomain test confirms a forged X-Forwarded-Host from an
untrusted peer never reaches token resolution.

Refs: https://linear.app/codercom/issue/PLAT-259

geokat

@geokat geokat marked this pull request as ready for review

June 10, 2026 17:23

@geokat geokat added the release/breaking

This label is applied to PRs to detect breaking changes as part of the release process

label

Jun 10, 2026

@github-actions github-actions Bot changed the title fix: only trust x-forwarded-host from configured trusted proxies fix!: only trust x-forwarded-host from configured trusted proxies

Jun 10, 2026

@geokat

johnstcn

@geokat

@geokat geokat deleted the george/plat-259/only-trust-x-forwarded-host-from-trusted-proxies branch

June 11, 2026 17:55