Skip to content

fix: enforce proxy_allow_ips and tighten PROXY parsing in ASGI#3620

Merged
benoitc merged 1 commit into
masterfrom
fix/asgi-proxy-protocol-trust-and-parsing
May 3, 2026
Merged

fix: enforce proxy_allow_ips and tighten PROXY parsing in ASGI#3620
benoitc merged 1 commit into
masterfrom
fix/asgi-proxy-protocol-trust-and-parsing

Conversation

@benoitc

@benoitc benoitc commented May 3, 2026

Copy link
Copy Markdown
Owner

Three findings against the ASGI PROXY-protocol path; the WSGI parser already enforces all three.

  • An untrusted peer could surface a spoofed client address to the app. `_setup_callback_parser` now passes `proxy_protocol='off'` to the parser when the peer is not in `proxy_allow_ips`; `_effective_peername` adds a defensive re-check.
  • PROXY v1 TCP4/TCP6 addresses are now validated with `socket.inet_pton` instead of being copied raw.
  • PROXY v2 with INET/INET6 family but non-STREAM (DGRAM) protocol is now rejected; gunicorn is an HTTP server.

Three findings against the ASGI PROXY protocol path:

- High: an untrusted peer could send a PROXY v1/v2 header and have the
  client address surfaced to the app. _setup_callback_parser now passes
  proxy_protocol='off' to the parser when the peer is not in
  proxy_allow_ips. _effective_peername adds a defensive re-check.
- Medium: PROXY v1 TCP4/TCP6 addresses were copied as strings without
  validation. Validate with socket.inet_pton, mirroring the WSGI parser.
- Medium: PROXY v2 quietly mapped non-STREAM (DGRAM) protocols to
  UDP4/UDP6. gunicorn is an HTTP server; reject non-STREAM with
  InvalidProxyHeader, mirroring the WSGI parser.
@benoitc benoitc merged commit 31f2618 into master May 3, 2026
24 checks passed
@benoitc benoitc deleted the fix/asgi-proxy-protocol-trust-and-parsing branch May 3, 2026 20:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant