fix(security): refresh roave guard via web-token/jwt-library (unblocks stale advisories pin) - #2301
Merged
rubenvdlinde merged 2 commits intoAug 4, 2026
Conversation
…-token/jwt-library The lockfile pinned roave/security-advisories to a 2026-05-22 commit, freezing its conflict rules — and all protection against CVEs published since — at that date. Refreshing it was blocked by an aliasing artifact: roave conflicts with web-token/jwt-experimental <4.1.7, and web-token/jwt-framework 3.4.10 replaces jwt-experimental at self.version, so the patched 3.4.10 monolith trips a rule whose range was written without the <3.4.10 carve-out the same advisory carries against jwt-framework itself. Every upstream web-token advisory is fixed in 3.4.10, and composer audit --locked reports 0 here — this was never a live vulnerability. Rather than force a major upgrade to ^4, depend directly on the split package we actually use: - "web-token/jwt-framework": "^3" + "web-token/jwt-library": "^3.4.10" Same version, 3.4.10. All 24 distinct Jose\\Component classes used across openregister, doriath and openconnector were checked to resolve inside the jwt-library 3.4.10 dist (with a positive control); all 24 resolve. No usage of Jose\\Bundle, JoseFramework or Jose\\Experimental anywhere in lib/ or tests/. This reduces attack surface: jwt-experimental, the package that genuinely carries an unbounded advisory range, is no longer installed. composer audit --locked: 0 advisories before -> 0 after.
Contributor
Quality Report — ConductionNL/openregister @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 173/173 | |||
| npm | ✅ | ✅ 713/713 | |||
| PHPUnit | ✅ | ||||
| Newman | ❌ | ||||
| Playwright | ❌ |
Quality workflow — 2026-08-03 10:25 UTC
Download the full PDF report from the workflow artifacts.
Contributor
Quality Report — ConductionNL/openregister @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| composer | ✅ | ✅ 173/173 | |||
| npm | ✅ | ✅ 713/713 | |||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ |
Quality workflow — 2026-08-04 01:35 UTC
Download the full PDF report from the workflow artifacts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Refreshes the stale
roave/security-advisoriesguard, and unblocks that refresh by narrowingweb-token/jwt-framework(the monolithic metapackage) toweb-token/jwt-library— the splitpackage that actually provides every class this app uses. Same major version, 3.4.10 → 3.4.10.
This is not an upgrade.
Why the guard was stuck
roave/security-advisoriesis declareddev-latest, butcomposer.lockpins a specific commitand
composer installhonours that pin — so this repo's conflict rules, and all protectionagainst CVEs published since, were frozen months ago.
Refreshing it failed:
That conflict is an aliasing artifact, not a live vulnerability
We are on
web-token/jwt-framework3.4.10, and every upstream advisory for that package isfixed in exactly 3.4.10 (
<3.4.10|>=4.0.0,<4.0.7|>=4.1.0,<4.1.7) — the RSA1_5 paddingoracle, the Chacha20Poly1305 missing-auth-tag bug, the JWSVerifier algorithm-confusion bug and
the PBES2 unbounded-
p2cbug.composer audit --lockedreports 0 advisories here.The block comes from the
replacesmechanism: the advisory as recorded against the splitpackage
web-token/jwt-experimentalcarries the range<=4.1.6, without the<3.4.10carve-out the same advisory has against
jwt-framework. Because the monolith declaresreplace: web-token/jwt-experimental: self.version, Composer sees "jwt-experimental 3.4.10",tests it against
<4.1.7, and conflicts. Roave encodes the range correctly for the siblings:The fix, and why it is safe
Rather than force a major upgrade to
^4for a vulnerability we are already patched against,this depends directly on the split package we actually use:
web-token/jwt-library3.4.10 autoloadsJose\Component\at its root and shipsChecker,Console,Core,Encryption,KeyManagement,NestedTokenandSignature.Verified mechanically: every
use Jose\...statement acrossopenregister,doriathandopenconnectorwas extracted (24 distinct classes) and each was checked to resolve to a realfile inside the
jwt-library3.4.10 dist. All 24 resolve. The check was run with a positivecontrol (a known-good path returns present, a deliberately bogus path returns absent), so a
"present" result is not something a broken lookup could manufacture.
Also checked, with zero hits in
lib/andtests/:Jose\Bundle/JoseFramework/Jose\Experimental, and the transitive packages that drop out as a result(
symfony/http-foundation,symfony/http-kernel,symfony/var-dumper,spomky-labs/aes-key-wrap) — those were pulled in only by the bundle/experimental parts of themetapackage.
Net effect: this reduces attack surface.
jwt-experimental— the package that genuinelycarries an unbounded advisory range — is no longer installed at all.
Beyond a lockfile bump
This PR intentionally touches
composer.json, so flagging it explicitly. Besides the swap, theresolver moved a set of Symfony components by patch/minor (e.g.
symfony/string,symfony/http-client,symfony/console, several polyfills) andspomky-labs/pki-framework1.4.2 → 1.5.0. No major upgrades.
Verification
composer audit --locked: 0 before, 0 after.historical lockfiles elsewhere in the fleet and correctly reported their advisories
(softwarecatalog pre-fix → 9, nextcloud-app-template pre-fix → 6, petstore
main→ 6). Thecommand demonstrably can fail, so a clean result here is meaningful.
composer auditignore/allow-list entry was added, and the guard was not removed.