Restore dependency security gate while preserving the course runtime pin
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- python
- Lĩnh vực
- build-system, security, testing
Hướng nghiên cứu
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.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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.
- Ngôn ngữ chính
- Python
- Star
- 0
- Fork
- 0
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Không có mẫu pull request
- Không có hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của DataTalksClub/website
-
bug infra operations P1 testing
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
DataTalksClub/website#329 ·
-
bug content data-migration documentation events operations P1
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
DataTalksClub/website#327 ·
-
bug frontend P0 testing
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 90/100
DataTalksClub/website#300 · 7 bình luận ·
-
bug data-migration events P0 testing
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
DataTalksClub/website#295 · 6 bình luận ·
-
admin courses data-migration email enhancement integration operations P1
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
DataTalksClub/website#468 · 6 bình luận ·
Tất cả issue của DataTalksClub/website
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
SwiftKickMobile/skai#84 ·
-
Lychee link check failedĐang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 82/100
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
jxxghp/MoviePilot#7070 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
flop-labs/technocore-chat#997 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
tunneld on Windows: Wi-Fi devices are not discovered because uvicorn runs on a ProactorEventLoopĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
doronz88/pymobiledevice3#2051 ·
Maintainer thường phản hồi trong vòng 1 ngày