Repository navigation
Move fast-uri to 3.1.9 - #38
Conversation
fast-uri is bundled into dist through verifier-core's ajv. Of the two packages in #37 that reach the built plugin, it is the only one with a fix (@stablelib/ed25519 waits on verifier-core#84). The lockfile moves from 3.1.8 to 3.1.9 (published 19 October 2026 with npm provenance); nothing else changes, and package.json is untouched. The built plugin differs from main's only in fast-uri: dist/index.js is byte-identical outside fast-uri's three bundled modules, and THIRD_PARTY_LICENSES.md changes only its version line. Checked: lint, typecheck, 105,720 tests, 60 browser tests (1 skipped, as on any local run). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Try it: https://digitalcredentials.github.io/verifier-plugin/pr-38/ Updates on every push to this PR, and goes away when it closes. The browser tests run against this copy too. |
Smoke testThe live demo (main at d575001, Expected, written before running: no case differs. Automated, with a local compare script at phone width, comparing every line the verifier-plugin box shows:
By hand, both sites side by side:
Each case is identical on both sites. "How it was built" is the only row that depends on CI also passed on Node 24, including the browser tests run against the published preview. |
Post-merge check (29 October 2026)Checked on the live demo and the
The rescan at merge raised 7 new The wallet still pins an earlier build (a4ca3e6), so this reaches it only when that pin is bumped. |








Part of #37 (PR 1 of 3). It leaves #37 open: the
@stablelib/ed25519alert stays open until digitalcredentials/verifier-core#84 is resolved.What changes
package-lock.jsononly:fast-uri3.1.8 → 3.1.9, three lines (version, address, checksum).package.jsonis untouched, because 3.1.9 is within the^3.0.1thatajvasks for. 3.1.9 was published on 19 October 2026 by fast-uri's own GitHub Actions, with npm provenance (built fromfastify/fast-uria1d0da2 onv3.x; npm'sgitHead, 0def703, is the bot's version bump on top of it). The advisories were published on 23 October, after the fix.This should close the four
fast-urialerts (GHSA-w74x-v6f9-j3xg, GHSA-wjr9-j795-jxcr, GHSA-xhq7-xmqj-769h, GHSA-333x-w4r6-6crp).fast-uriis the only package bundled into the plugin that has a fix in #37: it reachesdist/through verifier-core →ajv.The built plugin differs only in fast-uri (verified)
Built at
main(d575001) and at this branch, then compared:dist/index.jsis byte-for-byte identical outsidefast-uri's three bundled modules (index.js,lib/utils.js,lib/schemes.js). Upstream, 3.1.9 changesindex.jsandlib/utils.jsand leaveslib/schemes.jsalone, and the bundledlib/schemes.jsis unchanged too.dist/THIRD_PARTY_LICENSES.mdchanges one line:fast-uri - 3.1.8becomes3.1.9.dist/changes.What was exposed, and why it's low
All four advisories describe the same situation: an app gives
fast-urian untrusted address, then trusts what comes back (a%6A-encodedjavascript:decoded into a live one, a host silently rewritten, leading..segments dropped, a colon left unescaped).Verified, by wrapping
fast-uri's functions and recording every call, with its answer, while credentials were checked in Node (both through verifier-core directly and through the built plugin's ownverify()):fast-uricall happens while a credential is being checked, whatever it contains.fast-uriis called only whileajvcompiles a schema, and only on schema addresses.fast-uriisajv(throughajv/dist/runtime/uri), andajvis used only by verifier-core's Open Badges schema check.credentialSchemadoesn't choose one. Everyfast-uricall was on a schema address (the json-schema.org metaschemas and the bundled purl.imsglobal.org schemas): 306 calls for one credential, 800 when compiling all four bundled schemas, and none carried anything from a credential. That held even when a hostile credential was checked first, beforeajvhad compiled anything.@-smuggled host, a%6A-encoded scheme, leading..segments, a tab in the host, a barejavascript:):urlandimage, achievementid,imageandcriteria, a declaredcredentialSchema), signed by a demo issuer: where the credential got as far as the schema check, the check ran andfast-uriwas not called. The%6A,..and tab forms never get that far: the signing library refuses them, and signed with its safe mode off, verifier-core rejects them first (its structure check, or the signature check).name,description): the schema check ran on all of them, andfast-uriwas not called.A correction to #37, which said a credential's web addresses are checked by a regular expression in
ajv-formats. They aren't: none of the four bundled schemas usesformat: uri(onlydateanddate-time), sourland theids are checked only as strings. Neitherfast-urinor that regular expression sees them. #37 is corrected to match.So the fix is worth taking, and we found no way for a credential to reach the vulnerable code.
Checks
fast-uri. A lone difference on a link case would come from a real registry or status list, and would be rerun before being believed.Result: 0 of 21 differ, as expected (live demo at d575001 against pr-38 at b41d54a, 29 October 2026). The same comparison of the live demo against itself, run first as a noise check, also gave 0 of 21. Details, and a check by hand, in the smoke-test comment below.
Reaching the wallet
Nothing changes in the wallet until its verifier-plugin pin is bumped. Its lockfile pins release commit a4ca3e6 (15 October), an older build than the current
releasebranch, and that build also bundlesfast-uri3.1.8 (checked 29 October 2026).Separately, the wallet has its own
fast-uri3.1.7, through its ownajv(used by its verifier-core 1.x and byvanilla-jsoneditor). Neither this PR nor a pin bump changes that copy; it needs the wallet's own lockfile.🤖 Generated with Claude Code