Repository navigation
build(composer): raise dev-tool lower bounds past advisory-affected versions (Ref #69) - #74
Conversation
…ersions (Ref #69) require-dev allowed advisory-affected lower bounds, so a supported `--prefer-lowest` resolution under Composer < 2.9 (no default audit.block-insecure) selected phpunit/phpunit 11.5.0 (CVE-2026-24765) and symfony/process 5.4.47 (CVE-2026-24739) and failed `composer audit`. Hosted CI (Composer 2.10.2) only passed because it filters them out. - phpunit/phpunit ^11.5 -> ^11.5.50 - add dev-only symfony/process constraint that excludes every affected branch (5.4<5.4.51, 6.4<6.4.33, 7.3<7.3.11, 7.4<7.4.5, 8.0<8.0.5). No friendsofphp/php-cs-fixer release (latest v3.95.27) narrows the parent constraint, so the parent cannot remediate it. No change to require, php >=8.2, config.platform, src, tests or CI. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Technical Lead — independent Fresh Full Re-Review (current disposition: CODE ACCEPTED; MERGE NO-GO until exact-HEAD CI completed)Identity & scope checked independently: PR #74, Base Audit of code/standards:
CI blocker is procedural, not demonstrated code failure: exact HEAD GitHub Actions run 39867801298 currently Decision: No blocking code findings in the one-file patch; MERGE NO-GO (CI PENDING). The English Mermaid Follow Chart has been added to the PR description by the Technical Lead. Once exact-HEAD CI resolves, independently verify all jobs and post a final MERGE GO/NO-GO. #69 stays OPEN for post-merge main tree/CI and issue reconciliation. Owner's separate approval remains necessary for merge; absolutely no new repo, package migration, tag or release here. |
Technical Lead — FINAL Fresh Full Re-Review: MERGE GO (exact HEAD / Tree)Identity and merge preflight verified directly against GitHub (2026-10-23):
Final gate — independently verified from GitHub Actions logsRun #39867801298 attempt 1 on exact HEAD: COMPLETED / SUCCESS; all 10/10 check-runs and jobs COMPLETED / SUCCESS, including Workflow lint, Quality PHP 8.2, Unit/Regression PHP 8.2/8.3/8.4/8.5, Lowest PHP 8.2/MySQL 8.4.10, real-MySQL Integration PHP 8.2 and 8.5, and stable CI Gate. Relevant independently read logs:
Architectural/security conclusionThe previously accepted one-file remediation has no open blocking findings. PHPUnit security floor Decision: FINAL MERGE GO for exact HEAD Mandatory after Owner merges: confirm actual squash merge SHA and merged Tree matching |
Summary
Dev-only fix for #69 (investigation: report, Lead disposition: F69-01).
require-devstill allowed advisory-affected lower bounds; hosted CI only passes because Composer 2.10.2 filters them (audit.block-insecure, default since 2.9).Only
composer.jsonrequire-devchanges. No change torequire,php >=8.2,config.platform.php,src/,tests/, CI, standards, audit policy; no audit ignores /--no-audit; no lockfile.Why a direct
symfony/processconstraint (parent-first was checked)SECURITY.mdstep 4 asks to fix a transitive finding through its parent first. I inspected everyfriendsofphp/php-cs-fixerrelease on Packagist: the latest, v3.95.27, still requiressymfony/process ^5.4.47 || ^6.4.24 || ^7.2 || ^8.0, i.e. it admits affected versions on every branch (5.4.47, 6.4.24–32, 7.3.0–10, 7.4.0–4, 8.0.0–4). No parent release can remediate it, so a dev-only constraint is the minimum. It is one OR-ed term per maintained branch, so it never forces a branch and~7.3.11stops 7.3 from reaching 7.4.0–7.4.4 (^7.3.11would not).Advisory ranges (Packagist API): CVE-2026-24739
>=8.0,<8.0.5|>=7.4,<7.4.5|>=7.3,<7.3.11|>=6.4,<6.4.33|<5.4.51; CVE-2026-24765>=11.0.0,<11.5.50; older CVE-2024-51736 (<5.4.46,<6.4.14,<7.1.7) is also excluded.Baseline
main@3fe55d7d3a779fed93d8f4419d512390dcc803bf, treebe13452ad666ee07eaa94e5897c42f465d0ef94dba609cb6bb633d140fef6d5e036f2c14b3c67acf, tree1a7beb6871698010a4727b2b9f52da0d9fd3fedfRED → GREEN (isolated dirs, own
COMPOSER_HOME/cache;--prefer-lowest --prefer-stable, thencomposer audit --locked --abandoned=fail)Composer 2.10.2 = official phar, sha256
5ee7125f…8027matched getcomposer.org's published sum.config.platform.php=8.2.0in all cells.audit.block-insecure=false(scratch only)block-insecure=falseEvery affected Symfony branch (
composer update --prefer-lowest --with symfony/process:~X, platform 8.4 in scratch so 8.x resolves)All audit-clean. Additionally, a
composer/semvercheck of every published stablesymfony/processversion that the parent allows (48 versions, 17 advisory-affected): 0 affected versions remain allowed by the new constraint.Full gates on real MySQL 8.4.10 (dedicated disposable container; PHP 8.4.4 locally)
For each of {lowest, latest} × {Composer 2.8.6, 2.10.2}:
validate --strict,update,check-platform-reqs,audit --abandoned=fail,dump-autoload --optimize --strict-psr,check:syntax, PHPStan ([OK] No errors), php-cs-fixer--dry-run, unit (383 tests), regression (97), integration ×2 (223 each), consumer harness,check:residue,check:whitespace— all 4 combinations passed, audit "No security vulnerability advisories found" in each. Lowest resolves phpunit 11.5.50 / process v5.4.51 on both Composer versions; latest resolves phpunit 11.5.57 / process v7.4.21.Not run locally: the suites on PHP 8.2 (no local 8.2 with
pdo_mysql); PHP 8.2 resolution/audit was proven in Dockerphp:8.2-cli. The PHP 8.2 test runs are covered by this PR's CI.Notes
#69should stay open for post-merge reconciliation; hence "Ref", not "Fixes".maatify/php-persistence(^8.4) must not copy the old constraints; this PR leaves that for its own WU.🤖 Generated with Claude Code
Follow Chart — Technical Lead
flowchart TD A[Confirm baseline and advisory ranges] --> B[Reproduce vulnerable lowest resolution RED] B --> C{Can the direct parent remove vulnerable versions?} C -->|Yes| D[Use safe parent constraint] C -->|No, validated| E[Add minimal dev-only security bounds] D --> F[Verify all Symfony branches and PHPUnit floor] E --> F F --> G[GREEN: Composer 2.8 and 2.10 resolutions plus audit] G --> H[Full local quality and real-MySQL tests] H --> I[GitHub 10/10 CI on exact HEAD] I --> J[Independent Technical Lead fresh full review] J --> K{Lead MERGE GO and Owner approval?} K -->|No| L[Remediate or keep PR open] K -->|Yes| M[Owner merges the reviewed HEAD] M --> N[Post-merge main tree, CI and issue reconciliation]Technical Lead status: exact-tree CI and independent final acceptance pending; this chart does not authorize merge or release.