Skip to content

fix: v3.15.3 hotfix — python-multipart CVE + recover from broken v3.15.2 tag#23

Merged
cdeust merged 1 commit into
mainfrom
hotfix/v3.15.3-python-multipart-cve
May 9, 2026
Merged

fix: v3.15.3 hotfix — python-multipart CVE + recover from broken v3.15.2 tag#23
cdeust merged 1 commit into
mainfrom
hotfix/v3.15.3-python-multipart-cve

Conversation

@cdeust
Copy link
Copy Markdown
Owner

@cdeust cdeust commented May 9, 2026

Why a hotfix

Two issues converged.

1. CVE: python-multipart DoS via unbounded part headers

python-multipart 0.0.26 (transitive via fastmcp) has a denial-of-service vulnerability in MultipartParser header parsing. An attacker can send oversized individual header values OR many repeated headers without terminating the header block; both cause CPU exhaustion before request rejection. Affects every ASGI / Starlette / FastAPI app in the dep chain.

Patched in 0.0.27 by enforcing default parser limits for max header count and header size.

Dependabot opened PR #21 with this bump. I closed it earlier today thinking it was a routine patch bump — that was the wrong call given it carries a CVE fix. This hotfix re-applies the bump on a current branch.

2. v3.15.2 release was tagged at the wrong commit

PR #22 merged on GitHub at 6b19ec4 (with pyproject correctly bumped to 3.15.2 and the v3.15.2 CHANGELOG section). My local main was stuck at 308ed41 due to a stale uv.lock blocking the fast-forward, so when I ran git tag -a v3.15.2 && git push, the tag landed at 308ed41 (where pyproject still says 3.15.1, no v3.15.2 CHANGELOG, GitHub release notes empty).

The broken v3.15.2 tag stays as a graveyard entry (force-push of a tag that's been live ~10 minutes is destructive; not worth the rewrite). v3.15.3 is the canonical version that bundles BOTH PR #22's contents AND this security fix.

What lands here

  • uv.lock: python-multipart 0.0.26 → 0.0.27
  • pyproject.toml: 3.15.2 → 3.15.3
  • .claude-plugin/marketplace.json: 3.15.2 → 3.15.3
  • CHANGELOG.md: new v3.15.3 section explaining both issues; v3.15.2 section preserved for history
  • All v3.15.2-bound features (PR fix(mcp): ${CLAUDE_PLUGIN_ROOT} substitution + cortex-doctor mcp diagnostic #22's robust .mcp.json + cortex-doctor mcp) carry through unchanged

52 targeted tests still pass locally.

Upgrade path

If you're on v3.15.0, v3.15.1, or v3.15.2 — upgrade directly to v3.15.3. Skip v3.15.2 (broken tag).

Process lessons

  1. Never run git tag from a working tree that hasn't successfully git pull'd the merge commit. The release scripting now needs a guard.
  2. Don't close dependabot PRs without checking the security tab first.

…5.2 tag

Two issues bundled into one hotfix release.

1. python-multipart 0.0.26 → 0.0.27: patches a DoS vulnerability in MultipartParser header parsing (unbounded part headers cause CPU exhaustion). Affects every ASGI app in the FastMCP dep chain. The dependabot PR (#21) flagged this; closing it was wrong on my part.

2. v3.15.2 was tagged at 308ed41 (pre-PR-#22 merge) instead of 6b19ec4 because a stale uv.lock blocked the local fast-forward during release scripting. The broken v3.15.2 tag stays as a graveyard. v3.15.3 is the canonical version with both the MCP startup robustness work (PR #22 contents) AND this security bump.
@cdeust cdeust merged commit 99948d9 into main May 9, 2026
11 checks passed
@cdeust cdeust deleted the hotfix/v3.15.3-python-multipart-cve branch May 9, 2026 10:54
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