CVE-2026-62374: CVE-2026-62374: Silent Claim-Set Reduction and Verification Bypass in SD JWT JS
CVE-2026-62374: Silent Claim-Set Reduction and Verification Bypass in SD JWT JS Vulnerability ID: CVE-2026-62374 CVSS Score: 7.1 Published: 2026-11-02 CVE-2026-62374 (GHSA-f9j6-8p6x-r9j6) is a verification bypass vu
CVE-2026-62374: Silent Claim-Set Reduction and Verification Bypass in SD JWT JS
Vulnerability ID: CVE-2026-62374
CVSS Score: 7.1
Published: 2026-11-02
CVE-2026-62374 (GHSA-f9j6-8p6x-r9j6) is a verification bypass vulnerability in the OpenWallet Foundation SD JWT JS library (@sd-jwt/core and @sd-jwt/decode versions 0.19.0 and earlier). Due to permissive UTF-8 decoding and the omission of mandatory reference checks during presentation verification, tampered or unreferenced disclosures are silently dropped rather than rejected. This deviates from RFC 9901 ยง7.1 requirements and allows attackers to execute silent claim-set reduction attacks against relying parties.
TL;DR
Versions 0.19.0 and earlier of @sd-jwt/core and @sd-jwt/decode fail to reject invalid UTF-8 byte sequences in base64url disclosures and do not verify that all presented disclosures match an Issuer-signed _sd digest. Attackers can corrupt specific disclosures to strip restrictive claims from a credential presentation while still passing cryptographic signature verification.
โ ๏ธ Exploit Status: POC
Technical Details
- CVE ID: CVE-2026-62374 (GHSA-f9j6-8p6x-r9j6)
- Primary CWE: CWE-754 (Improper Check for Unusual Conditions) / CWE-176 (Improper Handling of Unicode Encoding)
- CVSS v4.0 Score: 7.1 High (CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N)
- Attack Vector: Network (Tampered SD-JWT Disclosure Segment)
- Impact: Silent Claim-Set Reduction / Verification Integrity Bypass
- Affected Packages: @sd-jwt/core <= 0.19.0, @sd-jwt/decode <= 0.19.0
- Patched Version: @sd-jwt/core 0.20.0
- Exploit & KEV Status: PoC Available / Not Listed in CISA KEV (EPSS: 0.23%)
Affected Systems
- @sd-jwt/core (npm)
- @sd-jwt/decode (npm)
-
@sd-jwt/core: <= 0.19.0 (Fixed in:
0.20.0) -
@sd-jwt/decode: <= 0.19.0 (Fixed in:
Consolidated into @sd-jwt/core 0.20.0)
Code Analysis
Commit: 3d8a72a
Enforce strict UTF-8 JSON decoding on disclosures and reject unreferenced or duplicate disclosure digests per RFC 9901.
--- a/packages/core/src/utils/disclosure.ts
+++ b/packages/core/src/utils/disclosure.ts
- const item = JSON.parse(base64urlDecode(s)) as DisclosureData<T>;
+ const item = decodeBase64urlJsonStrict<DisclosureData<T>>(
+ s,
+ 'Invalid disclosure data',
+ );
--- a/packages/core/src/decode/decode.ts
+++ b/packages/core/src/decode/decode.ts
export const unpackObj = (obj: unknown, map: Record<string, Disclosure>) => {
const copiedObj = JSON.parse(JSON.stringify(obj));
const seenDigests = new Set<string>();
const result = unpackObjInternal(copiedObj, map, '', seenDigests);
+
+ // RFC 9901 Section 7.1 step 5: reject unreferenced disclosures
+ const mapDigests = Object.keys(map);
+ const unusedDigests = mapDigests.filter((d) => !seenDigests.has(d));
+ if (unusedDigests.length > 0) {
+ throw new SDJWTException('Unreferenced disclosure(s) detected in SD-JWT');
+ }
+
return result;
};
Exploit Details
- GitHub: Unit test and reproduction case demonstrating byte tampering (0xF2 injection) in pull request #380.
- GitHub Advisory: Official GitHub Security Advisory detailing the silent claim-set reduction mechanism and differential fuzzing results.
Mitigation Strategies
- Upgrade @sd-jwt/core to version 0.20.0 or higher to enforce RFC 9901 ยง7.1 compliance.
- Migrate away from the deprecated standalone @sd-jwt/decode package to @sd-jwt/core.
- Implement fail-closed (default-deny) schema validation on verified claim payloads at the Relying Party.
- Enforce Holder Key Binding (KB-JWT) to protect disclosure integrity against on-path tampering.
Remediation Steps:
- Audit project dependencies (package.json and lockfiles) for @sd-jwt/core and @sd-jwt/decode versions <= 0.19.0.
- Run
npm uninstall @sd-jwt/decodeif the standalone decode package is directly installed. - Run
npm install @sd-jwt/core@^0.20.0orpnpm update @sd-jwt/core@^0.20.0. - Update TypeScript/JavaScript import paths from
@sd-jwt/decodeto@sd-jwt/core. - Verify that unit and integration tests pass and confirm that malformed disclosures throw SDJWTException.
References
- GitHub Security Advisory: GHSA-f9j6-8p6x-r9j6
- NVD - CVE-2026-62374
- CVE Record: CVE-2026-62374
- GitHub Pull Request #380
- Fix Commit 3d8a72a0a279d67439db038c9c2b52621568b866
- OpenWallet Foundation SD-JWT-JS Repository
- RFC 9901: Selective Disclosure for JSON Web Tokens
Read the full report for CVE-2026-62374 on our website for more details including interactive diagrams and full exploit analysis.
Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes โ full credit and traffic to the original publisher.