fix(deps): raise jupyter floors for 7 CVEs in jupyter extra [PYSDK-124]#631
fix(deps): raise jupyter floors for 7 CVEs in jupyter extra [PYSDK-124]#631helmut-hoffer-von-ankershoffen wants to merge 1 commit intomainfrom
Conversation
Raise lower bounds on three packages reachable through the `jupyter` extra so that downstream consumers (`pip install aignostics[jupyter]`, `uvx --with aignostics[jupyter]`) can no longer resolve versions vulnerable to recently disclosed advisories. * `jupyterlab`: `>=4.4.9` → `>=4.5.7` — adds CVE-2026-40171 (High, CVSS 8.4, GHSA-rch3-82jr-f9w9, stored XSS / token theft via CommandLinker), CVE-2026-42266 (High, CVSS 8.8, GHSA-37w4-hwhx-4rc4, extension allowlist bypass), CVE-2026-42557 (High, CVSS 8.6, GHSA-mqcg-5x36-vfcg, arbitrary command execution via crafted HTML buttons). * `notebook`: new floor `>=7.5.6` — adds CVE-2026-40171 (High) and CVE-2026-42557 (High); shipped via Renovate/Dependabot in #614/#616 but the floor was not lifted in `pyproject.toml`. * `jupyter-server`: new floor `>=2.18.0` — adds CVE-2025-61669 (Medium, GHSA-qh7q-6qm3-653w, open redirect via `?next=`), CVE-2026-35397 (High, GHSA-5789-5fc7-67v3, sibling-directory path traversal escape from `root_dir`), CVE-2026-40110 (High, GHSA-24qx-w28j-9m6p, CORS Origin-header bypass via unanchored `re.match`), CVE-2026-40934 (Medium, GHSA-5mrq-x3x5-8v8f, authentication cookie persistence across password rotation). Key reviewer property: every new lower bound is <= the currently locked version in uv.lock (jupyterlab 4.5.7, notebook 7.5.6, jupyter-server 2.18.1). No dependency is upgraded; the diff only records tighter consumer-facing constraints. uv lock produced no version changes — only requires-dist specifier and extras-set metadata updates. make audit and make lint green locally. make test_unit exhibits a pre-existing flake (32 failures in client_cache_test / client_me_retry_test due to tenacity retry logic vs the 10s pytest-timeout) that reproduces identically on main without any of these changes — unrelated to this PR. Resolves PYSDK-124 (Anomaly). Generated by Claude Opus 4.7 (cloud routine pysdk-audit-daily) for helmut@aignostics.com. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
PR Review Complete ✅I've completed a thorough review of this security-focused dependency floor bump PR. This is excellent work addressing 7 CVEs in the Critical Checks ✅ (All Passing)1. Test MarkersN/A - No new tests added (dependency-only change) 2. Test CoverageN/A - No code changes (dependency-only change) 3. Code Quality✅ PASS - 4. Conventional Commits✅ PASS - Correct format: Detailed ReviewSecurity & Audit ✅✅ Dependency Changes ✅Verified all three packages have floors ≤ locked versions:
Key property verified: No actual dependency upgrades occurred. This is purely a floor raise to match already-locked versions, meaning zero behavioral regression risk. CVE Coverage ✅All 7 CVEs are properly documented with inline comments: High Severity (4):
Medium Severity (2):
Breaking Changes ✅✅ No breaking changes - Only raising minimum version floors. Downstream consumers installing uv.lock Consistency ✅Verified
30-Day Bot-PR Floor-Sync Sweep ✅Verified the PR's claim about recent security PRs. Example: PR #616 (merged 2026-05-06) updated jupyterlab to 4.5.7 in Documentation ✅✅ Comprehensive PR description - Includes CVE details, rationale, verification steps Suggestions (Non-blocking)1. Pre-existing Test Flake (Out of Scope)The PR description mentions a pre-existing timeout flake in Recommendation: After merging this PR, create a separate issue to investigate the tenacity retry logic interaction with pytest-timeout. This is unrelated to the dependency changes and shouldn't block critical security fixes. 2. Minor: CVE Comment Consistency (Very Minor)The inline comments are excellent. One tiny observation: some CVE entries include the PR reference (e.g., "Renovate #616") while others don't. This is purely cosmetic and doesn't affect functionality - just noting for future bot runs if consistency is desired. Architecture & CI/CD Impact ✅✅ No architecture changes - Dependency-only change in optional extras group Test ExecutionSince this PR has no code changes:
Medical Device & Compliance ✅As this is medical device software (computational pathology SDK), security patches are critical: ✅ HIPAA compliance maintained - No data handling changes Final AssessmentThis PR exemplifies best practices for security maintenance:
Why This Matters
Verdict: ✅ claude:review:passedBlocking Issues: None |
There was a problem hiding this comment.
Pull request overview
Raises published lower bounds for the jupyter optional extra so downstream installs (pip install aignostics[jupyter], uvx --with ...) cannot resolve known-vulnerable Jupyter components, while keeping the locked dev/CI environment unchanged.
Changes:
- Raised the
jupyterlablower bound to>=4.5.7in thejupyterextra. - Added explicit lower bounds for
notebook>=7.5.6andjupyter-server>=2.18.0to thejupyterextra. - Regenerated
uv.lockmetadata so the project’srequires-dist/extras reflect the updated floors.
Reviewed changes
Copilot reviewed 1 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| uv.lock | Updates the package metadata for the jupyter extra (adds jupyter-server/notebook, raises jupyterlab floor) without changing resolved versions. |
| pyproject.toml | Raises/adds lower bounds in [project.optional-dependencies].jupyter with CVE annotations for downstream consumer safety. |
Codecov Report✅ All modified and coverable lines are covered by tests. |



🛡️ Resolves PYSDK-124 — governed by PR-SOP-01 Problem Resolution and Non-Conforming Products, part of our ISO 13485-certified QMS | Ketryx Project.
Opened by the
pysdk-audit-dailycloud routine on 2026-05-07 ~07:10 UTC againstmainat59506a28.Why this PR exists
pip-audit(against ouruv.lock) is currently green. That only proves our dev/CI environment is clean — it does not protect downstream consumers, who resolve against the[project]metadata we publish to PyPI, not againstuv.lock. Three packages reachable through thejupyterextra now ship security patches that Renovate/Dependabot landed inuv.lockbut did not lift inpyproject.toml. A consumer doingpip install aignostics[jupyter](oruvx --with aignostics[jupyter]) can still resolve the older, vulnerable versions.Key property: no dependency was upgraded
Every new lower bound in this diff is
<=the currently locked version. Verified programmatically:uv.lockjupyterlab>=4.5.74.5.7notebook>=7.5.67.5.6jupyter-server>=2.18.02.18.1uv lockafter the bumps produced no version changes — onlyrequires-distspecifier updates and theextrasset in our own package's lockeddependenciesblock. Behavioural regression risk equals a comment-only edit.What changed
Runtime-optional (
[project.optional-dependencies].jupyter) — thejupyterextras block:jupyterlab>=4.4.9→jupyterlab>=4.5.7— adds:notebook>=7.5.6— adds CVE-2026-40171 (High) and CVE-2026-42557 (High). The same CommandLinker/XSS pair also affects thenotebookpackage; Dependabot opened #614 to bumpuv.lockbut the closing of that PR left no follow-up to lift the floor.jupyter-server>=2.18.0— adds:?next=URL parameter, useful for phishing.root_dirvia incorrectstartswith()check on sibling directories that share a name prefix.re.matchwithout an end anchor letshttp://trusted.example.com.evil.com/impersonatetrusted.example.com.Runtime-core / dev-only: no changes.
Accepted advisories: re-verified
noxfile.pycarries no--ignore-vulnentries today. Trivially passes re-verification (skill Step 1c).30-day bot-PR floor-sync sweep (skill Step 1d.1)
All other security-tagged Renovate/Dependabot PRs merged into
mainin the last 30 days (lxml→6.1.0,pillow→12.2.0,pytest→9.0.3,uv→0.11.6,marimo→0.23.0,nicegui→3.11.0,nbconvert→7.17.1,python-multipart→0.0.26,cryptography→46.0.7) are already reflected as matching lower bounds inpyproject.toml. No additional drift to close.Non-security bot PRs in the same window (
packaging→26,pyarrow→23,fastparquet→2026.3.0,idc-index-data→23.10.1,python-dotenv→1.2.2,authlib→1.6.11,pandasconstraint move) were verified against pyproject.toml floors — all in sync.Docs + tooling
SUPPLY_CHAIN_VULNERABILITIES.mdwas deleted frommainin commit59506a28(revert of #580) on 2026-05-06, after the previous run of this routine had drafted updates to it. This PR therefore does not touch that doc — the only canonical record of CVE protections is now the inline# CVE-…comments on each lower bound inpyproject.toml, which this PR keeps consistent: each affected line carries severity ((High),(Medium)) and the fix-version per CVE.No changes to
noxfile.py,.pre-commit-config.yaml, or any tooling — the[tool.uv]required-versionandastral-sh/uv-pre-commitrev are already in sync at>=0.11.6.Test plan
make auditgreen (zero advisories frompip-audit)make lintgreen (ruff format, ruff check, pyright, mypy)make test_unit— see note below: a pre-existing flake (32 failures intests/aignostics/platform/client_cache_test.pyandclient_me_retry_test.py, all "Failed: Timeout (>10.0s) from pytest-timeout") reproduces identically onmainwithout any of these changes. The flake is in tenacity-based retry logic interacting with the 10spytest-timeout; it is unrelated to dependency floor changes.main— never a lower (packaging.version.Versioncomparison).<=the currently locked version (no upgrade).SUPPLY_CHAIN_VULNERABILITIES.mddeleted onmain).Out of scope
client_cache_test/client_me_retry_testtimeout flake — separate concern, will be flagged on the ticket.#614,#615,#628) that originally proposed these bumps — they will be auto-superseded once this PR merges (theiruv.lock-only changes are equivalent or older).🤖 Generated by Claude Opus 4.7 (cloud routine
pysdk-audit-daily) for helmut@aignostics.com.