Skip to content

fix(deps): raise PyJWT floor to 2.15.0 (VULN-120053) - #284

Open
etserend wants to merge 2 commits into
mainfrom
fix/vuln-120053-pyjwt
Open

etserend wants to merge 2 commits into
mainfrom
fix/vuln-120053-pyjwt

Conversation

@etserend

@etserend etserend commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Raises the pyjwt floor from 2.13.0 to 2.15.0 and updates the lockfile (2.13.0 -> 2.15.1) to fix CVE-2026-102267.

In PyJWT before 2.14.0, PyJWKClient does not revalidate redirect destinations against the JWKS trust boundary. If a configured, trusted JWKS endpoint returns an attacker-influenced redirect, the client follows it and uses the redirected response as key material. Forwarded credentials may be disclosed, or verification keys may be substituted. The scanner's remediation version is 2.15.0.

Exposure in this repository

  • src/ has no direct PyJWT use.
  • No other package installed in the development environment (including mcp, galileo-core and crewai) references PyJWKClient.
  • The fix still matters for users who combine splunk-ao with other libraries that use PyJWKClient, so the published package should not allow an affected version.

Changes

  • Example manifests: examples/logging-samples/openai-responses/requirements.txt and examples/agent/startup-simulator-3000/requirements.txt now pin pyjwt==2.15.1, and examples/agent/langgraph-fsi-agent/before/poetry.lock locks pyjwt 2.15.1 (lock refresh only, no other package changes; its dependent allows >=2.8.0,<3.0.0). These were the only other tracked files pinning an affected version. Earlier vulnerability fixes (fix(deps): bump python-dotenv to 1.2.2 for VULN-88817 #151, fix(deps): bump requests to 2.33.0 for VULN-88819 #152, fix(deps): require aiohttp >=3.14.1 for VULN-88795 #123) updated example pins in the same PR.
  • pyproject.toml: pyjwt = ">=2.13.0,<3.0.0" -> ">=2.15.0,<3.0.0". This raises an existing direct dependency's floor; nothing new is added.
  • poetry.lock: pyjwt 2.13.0 -> 2.15.1, plus the content-hash. No other package changes.
  • The packages that depend on pyjwt allow the new version: crewai >=2.9.0, galileo-core >=2.8.0,<3.0.0, mcp >=2.10.1.

Test plan

  • poetry check --lock: passes
  • tests/test_deployment.py: 32 passed (pyjwt 2.15.1 installed in the test environment)
  • Full unit suite: 24 failed, 6 errors, 2211 passed. The failing test IDs are identical to the baseline on main, so the change adds and fixes none of them.
  • invoke type-check: no issues in 118 source files
  • Every tracked manifest (poetry.lock, uv.lock, requirements*.txt) scanned: none pins pyjwt below 2.15.0
  • pip install --dry-run -r examples/agent/startup-simulator-3000/requirements.txt resolves with the new pin
  • poetry update pyjwt --lock on a copy of the langgraph-fsi-agent example changes only pyjwt (6 lines, content-hash unchanged)
  • CI

Limits: examples/logging-samples/openai-responses/requirements.txt does not resolve with pip install -r on main either, because it pins galileo-core==3.84.0 while the unpinned splunk-ao requires >=4.4.0. That conflict exists before this change and is unrelated to pyjwt, so it is not addressed here. Also: no test exercises PyJWKClient or its redirect handling, so the tests show nothing broke at 2.15.1 but do not demonstrate the vulnerable path itself. ruff check src tests reports existing findings in files this PR does not touch.

This PR and the anyio upgrade PR (#281) both change the content-hash line in poetry.lock. Whichever merges second needs a one-line poetry lock refresh.

🤖 Generated with Claude Code

etserend and others added 2 commits October 20, 2026 20:18
PyJWT before 2.14.0 does not revalidate redirect destinations against the JWKS
trust boundary in PyJWKClient, so a trusted JWKS endpoint that returns an
attacker-influenced redirect can lead to disclosed credentials or substituted
verification keys (CVE-2026-102267). The remediation version is 2.15.0.

Raise the existing direct pyjwt floor from 2.13.0 to 2.15.0 and update the
lockfile: pyjwt 2.13.0 -> 2.15.1. No other package changes.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Three example manifests still pinned the affected PyJWT 2.13.0, so following
their instructions installs a vulnerable version, and the unpinned splunk-ao
in the requirements files would conflict with the new pyjwt floor after the
next release. Earlier vulnerability fixes updated example pins in the same PR.

- examples/logging-samples/openai-responses/requirements.txt: pyjwt 2.15.1
- examples/agent/startup-simulator-3000/requirements.txt: pyjwt 2.15.1
- examples/agent/langgraph-fsi-agent/before/poetry.lock: pyjwt 2.15.1 (lock
  refresh only; no other package changes)

Co-Authored-By: Claude Code <noreply@anthropic.com>

@etserend etserend left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 This review was generated by the Astra agent (claude-opus-5-5). It may contain mistakes.

Verdict: approve — The PyJWT floor, the root lock and all three example manifests now exclude the affected versions. The lock diff changes only pyjwt.

Addressed before this review

  • The vulnerable pyjwt==2.13.0 stayed pinned in the openai-responses and startup-simulator-3000 requirements files, and in the langgraph-fsi-agent/before/poetry.lock file. Fixed in 4ad8640: all three now resolve to 2.15.1.

@etserend
etserend marked this pull request as ready for review October 21, 2026 02:08

This branch has not been deployed

No deployments
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