Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix numerous message parsing issues (v2) #3113

Merged
merged 16 commits into from
Dec 25, 2023
Merged

Conversation

pajod
Copy link
Contributor

@pajod pajod commented Dec 12, 2023

@pajod
Copy link
Contributor Author

pajod commented Dec 15, 2023

Further changes added:

  • less aggressive incompatible change: offer tri-state --header-map instead of just reject/permit
  • style/typos (mostly in git commit messages)
  • improved diff master readability (at the expense of the diff-diff, naturally)

pajod and others added 15 commits December 15, 2023 13:33
and unbreak test depending on backslash escape
* update HEADER_RE and HEADER_VALUE_RE to match the RFCs
* update chunk length parsing to disallow 0x prefix and digit-separating underscores.
- Unify HEADER_RE and METH_RE
- Replace CRLF with SP during obs-fold processing (See RFC 9112 Section 5.2, last paragraph)
- Stop stripping header names.
- Remove HTAB in OWS in header values that use obs-fold (See RFC 9112 Section 5.2, last paragraph)
- Use fullmatch instead of search, which has problems with empty strings. (See GHSA-68xg-gqqm-vgj8)
- Split proxy protocol line on space only. (See proxy protocol Section 2.1, bullet 3)
- Use fullmatch for method and version (Thank you to Paul Dorn for noticing this.)
- Replace calls to str.strip() with str.strip(' \t')
- Split request line on SP only.

Co-authored-by: Paul Dorn <pajod@users.noreply.github.com>
* refusing lowercase and ASCII 0x23 (#) had been partially enforced before
* do not casefold by default, HTTP methods are case sensitive
Ambiguous mappings open a bottomless pit of "what is user input and what is proxy input" confusion.
Default to what everyone else has been doing for years now, silently drop.

see also https://nginx.org/r/underscores_in_headers
Somehow exception logging was conditional on successful request uri parsing.
Add it back for the other branch.
If we promise wsgi.input_terminated, we better get it right - or not at all.
* chunked encoding on HTTP <= 1.1
* chunked not last transfer coding
* multiple chinked codings
* any unknown codings (yes, this too! because we do not detect unusual syntax that is still chunked)
* empty coding (plausibly harmless, but not see in real life anyway - refused, for the moment)
In common configuration unlikely a big security problem in itself
you are just fooling the remote about https.
However, it is offers an oracle for otherwise invisible proxy request headers,
so it might help exploiting other vulnerabilities.
Do the validation on the original, not the result from unicode case folding.

Background:
latin-1 0xDF is traditionally uppercased 0x53+0x53 which puts it back in ASCII
Note: This is unrelated to a reverse proxy potentially talking HTTP/3 to clients.
This is about the HTTP protocol version spoken to Gunicorn, which is HTTP/1.0 or HTTP/1.1.

Little legitimate need for processing HTTP 1 requests with ambiguous version numbers.
Broadly refuse.

Co-authored-by: Ben Kallus <benjamin.p.kallus.gr@dartmouth.edu>
further information to be published in security advisories, published out of tree on Github
chunk extensions are silently ignored before and after this change;
its just the whitespace handling for the case without extensions that matters
applying same strip(WS)->rstrip(BWS) replacement as already done in related cases

half-way fix: could probably reject all BWS cases, rejecting only misplaced ones
@benoitc
Copy link
Owner

benoitc commented Dec 22, 2023

LGTM. I am deploying it in semi prod to check.

@benoitc benoitc merged commit 0b4c939 into benoitc:master Dec 25, 2023
16 checks passed
@jugmac00
Copy link

If all things look good, could we please have a new release? Thank you!

@lgp171188
Copy link

If all things look good, could we please have a new release? Thank you!

@benoitc, icymi. Thanks!

@beaylott
Copy link

@benoitc firstly thanks for all your work in maintaining and developing gunicorn . It is a great piece of software.

This has now hit the vulnerability databases and so it is starting to block downstream pipelines. If there is some way we could expedite this fix to a release it would be much appreciated.

@nijave
Copy link

nijave commented Apr 16, 2024

@benoitc firstly thanks for all your work in maintaining and developing gunicorn . It is a great piece of software.

This has now hit the vulnerability databases and so it is starting to block downstream pipelines. If there is some way we could expedite this fix to a release it would be much appreciated.

You can install from git e.x. https://github.com/nijave/webhook-dyn-dnsimple/pull/11/files

requirements.txt

gunicorn @ git+https://github.com/benoitc/gunicorn@88fc4a43152039c28096c8ba3eeadb3fbaa4aff9

@WPettersson
Copy link

For those tracking this issue, version 22.0.0 has now been published

@beaylott
Copy link

beaylott commented Apr 17, 2024

@nijave thanks for this tip this would have worked until this release.

@WPettersson noted thanks.

Thanks to all maintainers and contributors for dealing with this so quickly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment