Skip to content

fix(proxy): bump gunicorn to >=26.0.0 for HTTP request smuggling fix#33416

Open
devin-ai-integration[bot] wants to merge 1 commit into
litellm_internal_stagingfrom
litellm_upgrade_gunicorn_26
Open

fix(proxy): bump gunicorn to >=26.0.0 for HTTP request smuggling fix#33416
devin-ai-integration[bot] wants to merge 1 commit into
litellm_internal_stagingfrom
litellm_upgrade_gunicorn_26

Conversation

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Relevant issues

Fixes #33405

Linear ticket

Pre-Submission checklist

  • I have added meaningful tests
  • My PR passes all CI/CD checks (e.g., lint, format, unit tests)
  • My PR's scope is as isolated as possible; it only solves 1 specific problem
  • I have received a Greptile Confidence Score of at least 4/5 before requesting a maintainer review

Screenshots / Proof of Fix

Captured at commit ca4b1812db

Before, the proxy extra allowed gunicorn>=23.0.0,<24.0 and the lockfile resolved gunicorn==23.0.0, which falls in the affected 0.1 through 25.3.0 range reported by Aikido advisory AIKIDO-2026-10742 (HTTP request smuggling / framing). After the change the proxy install resolves the fixed 26.0.0 release

$ grep gunicorn-26 uv.lock | head -1
sdist = { url = ".../gunicorn-26.0.0.tar.gz", hash = "sha256:ca9346f8...", ... }

$ uv sync --frozen --extra proxy   # accepts the lock, no re-resolution needed
$ uv run --no-sync python -c "import gunicorn; print(gunicorn.__version__)"
26.0.0

The existing gunicorn CLI tests still pass on 26.0.0

$ LITELLM_LOCAL_MODEL_COST_MAP=True uv run --no-sync pytest tests/test_litellm/proxy/test_proxy_cli.py -k gunicorn -q
3 passed, 58 deselected

Type

🐛 Bug Fix

Changes

Moved the proxy extra's gunicorn constraint from >=23.0.0,<24.0 to >=26.0.0,<27.0 in pyproject.toml, and updated uv.lock so the proxy install resolves gunicorn==26.0.0 (the release Aikido lists as fixed) instead of the vulnerable 23.0.0. 26.0.0 was published 2026-05-05, so it is well past the 7-day aging window for supply-chain safety, and its only runtime dependency is still packaging, so nothing else in the lock changes

The lock edit is surgical: only gunicorn's package block and its requires-dist specifier move, leaving the rest of the resolution untouched

Final Attestation

  • The tests check the right things, including the edge cases, and regressions in the respective real-world customer use-cases are not possible after this PR

Link to Devin session: https://app.devin.ai/sessions/8356f189c70b445b8e15eeca7309063f

@devin-ai-integration devin-ai-integration Bot requested a review from a team July 15, 2026 18:07
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@greptile-apps

greptile-apps Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR performs a targeted security hardening of the proxy by bumping the gunicorn version constraint in pyproject.toml from >=23.0.0,<24.0 to >=26.0.0,<27.0, and regenerating uv.lock to resolve gunicorn==26.0.0.

  • pyproject.toml: Version constraint updated in the proxy optional-dependency group only; all other deps are untouched.
  • uv.lock: sdist URL, wheel URL, SHA-256 hashes, and the requires-dist specifier are all updated consistently; gunicorn's sole runtime dependency (packaging) is unchanged, so no other packages are re-resolved.
  • Compatibility check: gunicorn 26.0.0 drops the eventlet worker class, but litellm's proxy unconditionally uses uvicorn.workers.UvicornWorker, so the breaking change does not apply here.

Confidence Score: 5/5

Safe to merge — the change is a minimal, surgical version bump of a single optional proxy dependency with no functional regressions

The diff touches exactly two lines in pyproject.toml and the corresponding block in uv.lock. The gunicorn 26.0.0 wheel's only runtime dependency is packaging, so nothing else in the resolution changes. The one breaking change introduced by gunicorn 26.0.0 (removal of the eventlet worker) is irrelevant here because proxy_cli.py hard-codes UvicornWorker. The lock file hashes are consistent with the published PyPI artifacts, and the existing gunicorn CLI tests were reported to pass on 26.0.0.

No files require special attention. Note that tests/code_coverage_tests/liccheck.ini still carries the old gunicorn: >=23.0.0 lower-bound entry — this is not a functional issue (26.0.0 satisfies >=23.0.0), but updating it to >=26.0.0 would keep it consistent with the new minimum.

Important Files Changed

Filename Overview
pyproject.toml Bumps gunicorn proxy extra constraint from >=23.0.0,<24.0 to >=26.0.0,<27.0; change is correctly scoped to the proxy optional dependency group
uv.lock Updates gunicorn from 23.0.0 to 26.0.0 in the lock file; sdist/wheel URLs, hashes, and the requires-dist specifier are all updated consistently; sole runtime dependency (packaging) is unchanged

Reviews (1): Last reviewed commit: "fix(proxy): bump gunicorn to >=26.0.0 fo..." | Re-trigger Greptile

@codecov

codecov Bot commented Jul 15, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@codspeed-hq

codspeed-hq Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_upgrade_gunicorn_26 (ca4b181) with litellm_internal_staging (4580ad0)

Open in CodSpeed

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.

Upgrade gunicorn to 26 for proxy security fix

0 participants