No signal changes detected since 2026-11-06.
| Environment | pytest | ruff | ty | bandit | pip-audit |
|---|---|---|---|---|---|
| linux-x64 / py3.14 | |||||
| linux-x64 / py3.14t | |||||
| linux-x64 / py3.15 | |||||
| macos-arm64 / py3.13 | |||||
| windows-x64 / py3.13 |
| Advisory | Package | Severity | Summary |
|---|---|---|---|
| GHSA-6q48-6c7w-9gw2 | certifi 2026.5.20 | critical | certifi bundles emSign root CAs with compromised intermediate CA keys |
| GHSA-ffc3-869f-jxw9 | pyjwt 2.13.0 | critical | PyJWT: Asymmetric-PEM detection bypass: whitespace/line-ending-mutated public keys skip the HS/asymmetric confusion guard |
| GHSA-9j54-fg26-wv3r | pyjwt 2.13.0 | high | PyJWT: PyJWK accepts empty HMAC keys, bypassing PyJWT's empty-key validation |
| GHSA-9v7f-9g4p-ffgj | pyjwt 2.13.0 | high | PyJWT: PyJWKClient follows redirects when fetching JWKS |
| GHSA-p4g4-x82p-q773 | pyjwt 2.13.0 | high | PyJWT: Public keys in DER form are accepted as HMAC secrets, bypassing the CVE-2022-29217 guard |
| GHSA-pxh4-856f-4h89 | pyjwt 2.13.0 | high | PyJWT: HS256/384/512 verify accepts empty HMAC key via oct JWK (PyJWK/PyJWKClient) enabling token forgery |
| GHSA-r6x4-923q-g947 | pyjwt 2.13.0 | high | PyJWT BOM Bypass |
| GHSA-w2cx-738m-mc7w | pyjwt 2.13.0 | high | PyJWT accepts public JWK containers as HMAC secrets |
| GHSA-2gx3-rcp4-g85q | pyjwt 2.13.0 | moderate | PyJWT: PyJWKClient still amplifies unauthenticated JWKS fetches on unknown kid values (incomplete fix of CVE-2026-48524) |
| GHSA-42vr-xj54-vc7v | pyjwt 2.13.0 | moderate | PyJWT: Unauthenticated RecursionError DoS in pre-verification payload parse (PyJWKClient.get_signing_key_from_jwt / verify_signature=False) |
| GHSA-5h93-6whr-6q8j | mcp 1.28.1 | moderate | Model Context Protocol Python SDK: HTTP client transports followed cross-origin redirects carrying custom headers and bodies |
| GHSA-84m7-p3x7-pcfv | mcp 1.28.1 | moderate | MCP Python SDK: Unbounded Session Accumulation in StreamableHTTP Transport Enables Resource Exhaustion |
| GHSA-8wjv-2p76-3863 | pyjwt 2.13.0 | moderate | PyJWT: Uncaught RecursionError in jwt.decode() on deeply nested token header |
| GHSA-gvp8-978c-rx2q | pyjwt 2.13.0 | moderate | PyJWT.decode() reintroduces options-dict mutation, enabling silent claim-verification bypass on dict reuse |
| GHSA-hxm8-2xgr-2p9m | pyjwt 2.13.0 | moderate | PyJWT: Non-canonical signature segments enable raw-token revocation bypass |
| GHSA-jwrc-g2q2-pq5p | pyjwt 2.13.0 | moderate | PyJWT: ReDoS vulnerability when calling the `is_pem_format` function. |
| GHSA-rwrf-2pqf-9j8j | mcp 1.28.1 | moderate | Model Context Protocol Python SDK: Client fetched server-chosen $ref URLs while validating tool results against output schemas |
| GHSA-w4fh-qvv9-3v23 | mcp 1.28.1 | moderate | Model Context Protocol Python SDK: Server bearer-token authentication accepts tokens issued for a different resource server |
| GHSA-w6j9-cwv2-h6wq | pyjwt 2.13.0 | moderate | PyJWT: Malformed RSA JWK aborts parsing of an entire JWK Set |
| GHSA-x33g-cr3x-6449 | pyjwt 2.13.0 | moderate | PyJWT accepts inconsistent OKP x/d JWKs, causing public/private key identity confusion |
Suppressions are markers that silence a linter, type-checker, or security scanner. See security.html for the full ledger across the org.
Counts non-blank, non-comment lines (sloc). Excludes .venv,
target, dist, build,
__pycache__, _site, and lockfiles
(uv.lock, Cargo.lock). Tests are paths whose
ancestors contain tests, test, or
benches. Authorship: this codebase is
AI-assisted — lines were generated with Claude (Anthropic) and
human-reviewed before commit. We count what's in git;
we do not claim humans typed every character.