Restore dependency security gate while preserving the course runtime pin
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- python
- Ambito
- build-system, security, testing
Direzione di ricerca
Start with root pyproject.toml and uv.lock, then read core/tests/test_pyjwt_dependency_security.py and scripts/ci.py for the dependency and verification conventions. Add the specified JWT and urllib3 regression coverage in the two named test files, preserving the existing tests and runtime pin. Done means the locked versions, targeted tests, affected coverage, security scan, and required independent verification evidence all pass without unrelated changes.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Restore the dependency security gate and preserve the course runtime
The required security gate exposed four advisories in the existing application lock. Remediate those dependencies so course backend unification can continue without changing visible behavior or activating a different course runtime.
Authority
- _docs/PROCESS.md: isolated engineer worktree, independent tester and PM acceptance, then engineer commit and orchestrator merge/push; no pull requests.
- _docs/specs/07-security-privacy-operations.md: locked security updates, safe authentication failures and HTTP boundaries.
- _docs/specs/10-verification-strategy.md: isolated synthetic tests and required security/container evidence.
- _docs/security/dependency-vulnerability-policy.md and its JSON policy: fail closed for advisory findings, scanner errors, stale locks or missing evidence.
- _docs/ci/change-selective-ci.md: computed plan, exact evidence envelopes, independent tester recomputation and four-bucket report.
Independently verified intake
At origin/main c5f4b301197394812b1d95ed69389fe87e90b787, the application locks PyJWT 2.14.0, urllib3 2.7.0, and community-base 0.5.10 from immutable tag v0.5.10 resolved to 4c692db461f4c7cbbc2f60afaa05162987a640f6.
| Locked dependency | Advisory | Upstream finding | First fixed release |
|---|---|---|---|
| PyJWT 2.14.0 | CVE-2026-101918 / GHSA-42vr-xj54-vc7v | Deeply nested JWT payload leaks RecursionError before signature verification | 2.15.0 |
| urllib3 2.7.0 | CVE-2026-97687 / GHSA-8988-9cw3-xx77 | HTTPS proxy TLS policy ignored or overridden | 2.8.0 |
| urllib3 2.7.0 | CVE-2026-97689 / GHSA-vxq7-64xx-v4gw | Unbounded chunk-size line buffering | 2.8.0 |
| urllib3 2.7.0 | CVE-2026-97688 / GHSA-gh4c-6fx4-qh6g | Chunked Deflate streaming infinite loop | 2.8.0 |
Primary sources: PyJWT CNA record, PyJWT advisory, 2.15.0 changelog, urllib3 2.8.0 release, proxy TLS advisory, chunk-size advisory, Deflate advisory. PM checked all three maintainer advisory API records for exact CVE mappings; release-note order alone is insufficient. Medium upstream severity does not waive this site's fail-closed scanner policy.
Frozen #446 evidence, read-only in /data/agents/dtc-website/worktrees/issue-446-source-policy:
.tmp/dtc446/SWE-handoff.md: SHA-2562e9a67e068156177d8909fc7edb8cf633eba5465439b33fd1f2e0d9850a18abf..tmp/dtc446/v22-corrected/security-check.log: SHA-256d4d89cc704a69574ec0242235cd2d92a67943faad5f1a52c58bd2751ebd5356c; four blocking findings..tmp/dtc446/v22-corrected/security-findings.json: SHA-256de49ce729bc4f7c1a92b880eef7aaeba839011334aa91b3b54738c8065c77ae6; audit exit 1, root lock SHA-256d634452d31e2dd7fde510713c1866bf01a092ec98a293f9dd310c0312d8a5b78.
PM independently read and hashed those three files. They establish the failure, not a green receipt for #449.
Scope and expected files
- In an isolated engineer worktree based on the verified current main, raise the existing PyJWT floor to
>=2.15,<3and establish the existing transitive urllib3 security floor>=2.8,<3in rootpyproject.toml. Lock the minimal fixed releases 2.15.0 and 2.8.0 using targeted resolution in rootuv.lock; retain other package versions/sources unless an actual resolver incompatibility requires a documented follow-up decision. - Extend
core/tests/test_pyjwt_dependency_security.pywith real nested-payload regression coverage for unverified decode andPyJWKClient.get_signing_key_from_jwt, asserting documented safe PyJWT exceptions rather than raw RecursionError. Retain the existing real-signature, expiry, audience, algorithm and malformed-JWK tests. - Add
core/tests/test_urllib3_dependency_security.pywith bounded synthetic advisory regression coverage for proxy/destination TLS separation, oversized chunk-size lines and malformed chunked Deflate termination, plus ordinary valid HTTP behavior. Exercise the locked library rather than replacing it with a mock. Use in-memory or isolated loopback fixtures and deterministic bounds; no public services, credentials or production endpoints. No new test dependency is authorized.
Expected tracked scope is exactly these four files. Scratch, baseline comparison logs and evidence remain under the isolated worktree's .tmp/. A runtime adapter incompatibility or additional advisory is a concrete stop-and-report condition for scope review, not permission for broad upgrades or production changes.
Non-goals
- No community-base runtime upgrade, branch/local source, tag or resolved-commit change.
- No course schema, storage, readers/writers, migration, content projection, route, template, static, UI, feature or learner-history change.
- No scanner/policy/threshold change, audit waiver, advisory suppression, ignore-list addition or stale evidence reuse.
- No production access, credential access, shared/live database reset, deployment or real-provider traffic during implementation/verification.
- No edits/rebase to the frozen #446 worktree, its proof project or another agent's work.
Dependencies and coordination
This issue has no open implementation prerequisite. #446 depends on this reviewed dependency baseline before its final security evidence and downstream acceptance can pass. After #449 is accepted and merged, the #446 owner must integrate that baseline in its own worktree, regenerate its plan and fresh relevant evidence, and retain the root 0.5.10 versus isolated proof-project distinction. Prior #446 v21 runtime-upgrade success evidence is superseded.
Acceptance criteria
- AC1: Root declaration/lock resolve PyJWT 2.15.0 and urllib3 2.8.0. Record the complete package version/source diff and explain metadata/hash churn. All unrelated package versions/sources remain unchanged, and root community-base remains
v0.5.10/4c692db461f4c7cbbc2f60afaa05162987a640f6. - AC2:
uv lock --check,uv pip checkand freshuv run --frozen python scripts/ci.py security-checkpass on the exact candidate. Retain command output and.tmp/security/security-vulnerability-scan.json(or explicitly configured candidate-local output), showing scanner exit 0, no blocking findings and SHA-256 matching the candidate root lock. No green claim uses the old artifact. - AC3: New JWT and HTTP regression tests pass against the remediated locked libraries. Record a bounded isolated old-version comparison demonstrating the security regression is meaningful, without altering the candidate or frozen #446 environment. Existing positive behavior and safe denials remain green.
- AC4: Affected existing auth/HTTP coverage passes:
core.tests.test_pyjwt_dependency_security,accounts.tests.test_imported_account_social_matching,accounts.tests.test_auth_configuration,courses.tests.test_unit_url_validation,content_sync.tests.test_course_repository_transport_parity,content_sync.tests.test_course_repository_sync,core.tests.test_deployment_oidc_probe, andcontent.tests.test_public_media_store. Use normal test settings and synthetic isolated databases; do not invoke live OIDC/AWS probes. Prove no new external network or email side effect. - AC5: Engineer produces a fresh versioned plan and runs every required component using the maintained verification runner. Root dependency changes trigger full control-plane/SQLite regression coverage and container evidence; do not manually narrow the computed plan. Independent tester recomputes base/head/source manifest/graph/plan digests, verifies artifacts and executes required reruns. Both reports classify every component exactly once with commands/counts, artifact digests and reasons; no required skip or pending evidence is accepted.
- AC6: Independent tester passes and PM accepts preservation of navigation, login/denial behavior, public and course behavior from the selected browser evidence before any engineer commit or orchestrator merge/push. On-call alone owns later post-push CI and deployment-image advisory evidence; a local audit does not replace that release gate.
Verification and browser scenarios
Generate the exact candidate plan and evidence with VERIFY_ISSUE=449 and issue-local output directories:
uv run --frozen python scripts/ci.py verification-plan
uv run --frozen python scripts/ci.py verification-run
uv run --frozen python scripts/ci.py verification-evidence-check
uv run --frozen python scripts/ci.py verification-report-check
VERIFY_CONSUMER=tester uv run --frozen python scripts/ci.py verification-plan
VERIFY_CONSUMER=tester VERIFY_PRODUCER_ROLE=tester VERIFY_PHASE=tester uv run --frozen python scripts/ci.py verification-run
The backend dependency change requires at least the maintained Playwright smoke tier: uv run --frozen python scripts/ci.py test-playwright-smoke, or a broader tier if selected by the graph. Use the existing local synthetic smoke scenarios for public navigation and account/course access/denial. Desktop/mobile product screenshot matrices are not_applicable for this exact no-render-change scope; record that reason in the computed report. If actual render impact appears, return to scope review and satisfy the graph-derived independent screenshot gate.
Freeze the uncommitted engineer worktree after posting exact source identity, package/source diff, command results/counts, lock/scanner hashes, plan/report/envelope digests and evidence paths. Recompute evidence if source, graph, policy, environment or relevant inputs change.
- Lingua principale
- Python
- Stelle
- 0
- Fork
- 0
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di DataTalksClub/website
-
bug infra operations P1 testing
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
DataTalksClub/website#329 ·
-
bug content data-migration documentation events operations P1
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
DataTalksClub/website#327 ·
-
bug frontend P0 testing
Difficoltà 2/5 1-3 ore Idoneità per principianti 90/100
DataTalksClub/website#300 · 7 commenti ·
-
bug data-migration events P0 testing
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
DataTalksClub/website#295 · 6 commenti ·
-
admin courses data-migration email enhancement integration operations P1
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
DataTalksClub/website#468 · 6 commenti ·
Tutte le issue di DataTalksClub/website
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
SwiftKickMobile/skai#84 ·
-
Lychee link check failedAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 82/100
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
jxxghp/MoviePilot#7070 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
flop-labs/technocore-chat#997 ·
I maintainer di solito rispondono entro 1 giorno
-
tunneld on Windows: Wi-Fi devices are not discovered because uvicorn runs on a ProactorEventLoopAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
doronz88/pymobiledevice3#2051 ·
I maintainer di solito rispondono entro 1 giorno