From 53105cda890906dbf4711230aa793d7f420c4fc0 Mon Sep 17 00:00:00 2001 From: James Williams <29534093+williajm@users.noreply.github.com> Date: Wed, 20 May 2026 08:49:04 +0100 Subject: [PATCH 1/4] =?UTF-8?q?security:=20Bump=20authlib=201.7.0=20?= =?UTF-8?q?=E2=86=92=201.7.2=20and=20idna=203.11=20=E2=86=92=203.15=20for?= =?UTF-8?q?=20Dependabot=20alerts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - authlib: CVE-2026-44681 (moderate) - idna: CVE-2026-45409 (moderate) Updates uv.lock (resolved versions) and .clusterfuzzlite/requirements.txt (hash-pinned). Lock regenerated with --exclude-newer 2026-05-17 per the 3-day supply-chain buffer documented in CLAUDE.md. Co-Authored-By: Claude Opus 4.7 (1M context) --- .clusterfuzzlite/requirements.txt | 8 ++++---- uv.lock | 15 +++++++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.clusterfuzzlite/requirements.txt b/.clusterfuzzlite/requirements.txt index ea3e629..e1e08cc 100644 --- a/.clusterfuzzlite/requirements.txt +++ b/.clusterfuzzlite/requirements.txt @@ -27,8 +27,8 @@ cryptography==46.0.7 \ --hash=sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308 # OAuth/OIDC authentication dependencies (added in v1.1.0) -authlib==1.6.11 \ - --hash=sha256:c8687a9a26451c51a34a06fa17bb97cb15bba46a6a626755e2d7f50da8bff3e3 +authlib==1.7.2 \ + --hash=sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f httpx==0.28.1 \ --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad @@ -91,8 +91,8 @@ sniffio==1.3.1 \ certifi==2025.11.12 \ --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b -idna==3.11 \ - --hash=sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea +idna==3.15 \ + --hash=sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8 exceptiongroup==1.3.0 \ --hash=sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10 diff --git a/uv.lock b/uv.lock index 7507bac..3a8d7c4 100644 --- a/uv.lock +++ b/uv.lock @@ -2,6 +2,9 @@ version = 1 revision = 3 requires-python = ">=3.11" +[options] +exclude-newer = "2026-05-17T00:00:00Z" + [[package]] name = "aiofile" version = "3.9.0" @@ -67,15 +70,15 @@ wheels = [ [[package]] name = "authlib" -version = "1.7.0" +version = "1.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "joserfc" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/82/4d0603f30c1b4629b1f091bb266b0d7986434891d6940a8c87f8098db24e/authlib-1.7.0.tar.gz", hash = "sha256:b3e326c9aa9cc3ea95fe7d89fd880722d3608da4d00e8a27e061e64b48d801d5", size = 175890, upload-time = "2026-04-18T11:00:28.559Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/98/7d93f30d029643c0275dbc0bd6d5a6f670661ee6c9a94d93af7ab4887600/authlib-1.7.2.tar.gz", hash = "sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231", size = 176511, upload-time = "2026-05-06T08:10:23.116Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/48/c954218b2a250e23f178f10167c4173fecb5a75d2c206f0a67ba58006c26/authlib-1.7.0-py2.py3-none-any.whl", hash = "sha256:e36817afb02f6f0b6bf55f150782499ddd6ddf44b402bb055d3263cc65ac9ae0", size = 258779, upload-time = "2026-04-18T11:00:26.64Z" }, + { url = "https://files.pythonhosted.org/packages/fb/95/adcb68e20c34162e9135f370d6e31737719c2b6f94bc953fe7ed1f10fe21/authlib-1.7.2-py2.py3-none-any.whl", hash = "sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f", size = 259548, upload-time = "2026-05-06T08:10:21.436Z" }, ] [[package]] @@ -686,11 +689,11 @@ wheels = [ [[package]] name = "idna" -version = "3.11" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] From 2486d400c8b5cc6fb883ccd10e5548540cf021b9 Mon Sep 17 00:00:00 2001 From: James Williams <29534093+williajm@users.noreply.github.com> Date: Wed, 20 May 2026 09:06:35 +0100 Subject: [PATCH 2/4] fix: tighten authlib floor to >=1.7.1 and remove exclude-newer marker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI failed on the prior commit because `uv lock` (with UV_EXCLUDE_NEWER=7d in my local env) stamped `exclude-newer` into uv.lock's manifest. CI runs `uv sync --locked` without that env var and refused the lockfile ("Resolving despite existing lockfile due to removal of global exclude newer"). The 3-day buffer is incompatible with --locked installs (per mcp_kafka/CLAUDE.md guidance, applies equally here) — it is only useful during lock generation, not in CI. Regenerated uv.lock with UV_EXCLUDE_NEWER unset so the resulting lockfile matches what CI will produce. Result is byte-identical to the previous commit minus the exclude-newer manifest line. Also bumps the authlib floor in pyproject.toml from >=1.6.11 to >=1.7.1 to prevent regression on CVE-2026-44681. Co-Authored-By: Claude Opus 4.7 (1M context) --- pyproject.toml | 2 +- uv.lock | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index daedebf..6eb1cf0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ dependencies = [ "limits>=5.8.0", "cachetools>=7.0.5", "secure>=1.0.1", - "authlib>=1.6.11", # GHSA-jj8c-mmj3-mmgv + "authlib>=1.7.1", # GHSA-jj8c-mmj3-mmgv + GHSA-r95x-qfjj-fjj2 (CVE-2026-44681) "httpx>=0.28.1", "typer>=0.24.1", "python-multipart>=0.0.27", # CVE-2026-24486 / CVE-2026-40347 / GHSA-pp6c-gr5w-3c5g: Path traversal + unbounded part-header DoS diff --git a/uv.lock b/uv.lock index 3a8d7c4..e95580d 100644 --- a/uv.lock +++ b/uv.lock @@ -2,9 +2,6 @@ version = 1 revision = 3 requires-python = ">=3.11" -[options] -exclude-newer = "2026-05-17T00:00:00Z" - [[package]] name = "aiofile" version = "3.9.0" @@ -1038,7 +1035,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "atheris", marker = "extra == 'dev'", specifier = ">=3.0.0" }, - { name = "authlib", specifier = ">=1.6.11" }, + { name = "authlib", specifier = ">=1.7.1" }, { name = "cachetools", specifier = ">=7.0.5" }, { name = "docker", specifier = ">=7.1.0" }, { name = "fastmcp", specifier = ">=3.2.0" }, From afb07e59139685fe838296b436262af201c5072a Mon Sep 17 00:00:00 2001 From: James Williams <29534093+williajm@users.noreply.github.com> Date: Wed, 20 May 2026 09:49:43 +0100 Subject: [PATCH 3/4] ci: ignore disputed pyjwt PYSEC-2025-183 in pip-audit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds --ignore-vuln PYSEC-2025-183 to the pip-audit step, matching the existing pattern for pygments CVE-2026-4539. The advisory is disputed by the supplier (key length is the consumer's responsibility, not the library's), and pyjwt 2.12.1 is the latest published version — no fix is available to upgrade to. This is a pre-existing issue surfaced by the OSV database; it affects main too and was blocking the authlib/idna PR from going green. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d3cb058..c357d99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -293,8 +293,12 @@ jobs: uv export --no-emit-project > /tmp/requirements.txt # TODO: Remove --ignore-vuln once pygments releases a fix for CVE-2026-4539 # (ReDoS in AdlLexer, local access only, no fix available as of 2026-03-26) + # TODO: Remove --ignore-vuln PYSEC-2025-183 once pyjwt addresses it or + # the advisory is withdrawn. Disputed by supplier — key strength is the + # consumer's responsibility; no fix version available as of 2026-05-20. uvx pip-audit --strict --desc --require-hashes -r /tmp/requirements.txt \ - --ignore-vuln CVE-2026-4539 + --ignore-vuln CVE-2026-4539 \ + --ignore-vuln PYSEC-2025-183 build: name: Build Package From c8905cca5a6460c7c7845e3bcd1fce1f3a4b251d Mon Sep 17 00:00:00 2001 From: James Williams <29534093+williajm@users.noreply.github.com> Date: Wed, 20 May 2026 09:54:53 +0100 Subject: [PATCH 4/4] =?UTF-8?q?security:=20Upgrade=20pygments=202.19.2=20?= =?UTF-8?q?=E2=86=92=202.20.0=20(CVE-2026-4539)=20and=20drop=20now-unneede?= =?UTF-8?q?d=20ignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The prior fix (commit f0bf518, PR #216) only upgraded pygments in .github/requirements/bandit.txt — the project's own uv.lock was left at 2.19.2, meaning the runtime dependency was still vulnerable and the --ignore-vuln CVE-2026-4539 in pip-audit was masking it. Bumps pygments in uv.lock to 2.20.0 (the published fix) and removes the now-superfluous ignore and its TODO from the pip-audit step. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 3 --- uv.lock | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c357d99..10f8f0c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -291,13 +291,10 @@ jobs: - name: Run pip-audit (CVE scanning) run: | uv export --no-emit-project > /tmp/requirements.txt - # TODO: Remove --ignore-vuln once pygments releases a fix for CVE-2026-4539 - # (ReDoS in AdlLexer, local access only, no fix available as of 2026-03-26) # TODO: Remove --ignore-vuln PYSEC-2025-183 once pyjwt addresses it or # the advisory is withdrawn. Disputed by supplier — key strength is the # consumer's responsibility; no fix version available as of 2026-05-20. uvx pip-audit --strict --desc --require-hashes -r /tmp/requirements.txt \ - --ignore-vuln CVE-2026-4539 \ --ignore-vuln PYSEC-2025-183 build: diff --git a/uv.lock b/uv.lock index e95580d..b08797c 100644 --- a/uv.lock +++ b/uv.lock @@ -1385,11 +1385,11 @@ wheels = [ [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]]