Read the docs
TI-2026-82664 Aliases CVE-2026-62374GHSA-f9j6-8p6x-r9j6

SD JWT JS silently drops tampered disclosures

Priority HIGH 70CWE-176Published · Updated

Key facts

Attack vector
Network
Privileges required
Low
User interaction
None
Attack complexity
Low
Attack requirements
None
Impact type
—
Confidentiality · integrity · availability
None · High · None
Fix status
Fixed

Attack profile from CVSS 4.0 · CNA. Fix status from CNA and GitHub.

Summary

In @sd-jwt/core and @sd-jwt/decode through 0.19.0, the decoder silently drops a Disclosure whose digest no longer matches the Issuer-signed _sd array and returns a reduced claim set without an error (CWE-754). The TextDecoder and Buffer decoding path replaces malformed UTF-8 in a Disclosure with U+FFFD instead of rejecting it. A malicious holder, or an on-path attacker where key binding is not enforced, can remove claims while the Issuer signature still verifies, which can change an authorization decision when missing claims default to allowing access.

Written with Claude Haiku 5.5 from the sources below · 2026-11-06

Description from the CNA

SD JWT JS is a JavaScript implementation of the Selective Disclosure JWT (SD-JWT) specification. In version 0.19.0 and earlier, `@sd-jwt/decode`, also used by `@sd-jwt/core`, silently drops a tampered Disclosure whose digest no longer matches the Issuer-signed `_sd` array and returns a reduced claim set, reporting success while the Issuer signature remains valid. Both a tampered Disclosure that remains valid JSON and a Disclosure containing invalid UTF-8 bytes reach this silent-drop behavior. In the latter case, the `TextDecoder / Buffer` decoding path substitutes U+FFFD replacement characters, recovering syntactically valid disclosure data instead of rejecting the malformed input. This violates RFC 9901 section 7.1 step 5, which requires rejection of unreferenced Disclosures, and section 7.1 step 3 / section 4.2.1, which require rejection of invalid Disclosures. A malicious holder can exploit this omission primitive, including through `SDJwtInstance.verify()` when key binding is required. An on-path attacker can also tamper with a Disclosure when the relying party does not enforce key binding; enforced key binding rejects on-path tampering because it invalidates the KB-JWT `sd_hash` binding. If the relying party defaults to allowing access when a constraining age, role, or restriction claim is absent, the silent claim reduction can change an authorization decision without an error. This issue is fixed in `@sd-jwt/core` version 0.20.0; no patched version of the standalone `@sd-jwt/decode` package is identified.

Why it matters now

Exploitation Proof of concept CISA SSVC · not in CISA KEV
EPSS 0.00226 13th percentileScored 2026-11-07
Fix Fixed @sd-jwt/core (npm): 0.20.0

SSVC decision points

CISA ADP · SSVC 2.0.3

Exploitation
Poc
Automatable
Yes
Technical impact
Partial

The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.

Affected products

VendorProductAffected versionsFixed inStatusSource
openwallet-foundation@sd-jwt/coreup to 0.19.0—No fix listedCNA
openwallet-foundation@sd-jwt/decodeup to 0.19.0—No fix listedCNA
—@sd-jwt/decode (npm)up to 0.19.0—No fix listedGHSA-f9j6-8p6x-r9j6
—@sd-jwt/core (npm)before 0.20.00.20.0Patch availableGHSA-f9j6-8p6x-r9j6
  • @sd-jwt/core Vendoropenwallet-foundation Affected up to 0.19.0 Fixed in — No fix listed CNA
  • @sd-jwt/decode Vendoropenwallet-foundation Affected up to 0.19.0 Fixed in — No fix listed CNA
  • @sd-jwt/decode (npm) Vendor— Affected up to 0.19.0 Fixed in — No fix listed GHSA-f9j6-8p6x-r9j6
  • @sd-jwt/core (npm) Vendor— Affected before 0.20.0 Fixed in 0.20.0 Patch available GHSA-f9j6-8p6x-r9j6

Remediation

Update @sd-jwt/core to version 0.20.0. The sources list no fixed version for @sd-jwt/decode.

Written with Claude Haiku 5.5 from the sources below · 2026-11-06

  • Fix · GHSA-f9j6-8p6x-r9j6 @sd-jwt/core (npm) Fixed in 0.20.0 Advisory →

Vendor assessments

Red Hat

Red Hat's page for this CVE →

Not affected: 1 product
  • Red Hat

Timeline

  1. 2026-10-29 Threatist record created from CVE-2026-62374
  2. 2026-10-31 Priority changed: MEDIUM → LOW
  3. 2026-11-02 Alias added: GHSA-f9j6-8p6x-r9j6
  4. 2026-11-02 Fix available: npm/@sd-jwt/[email protected] · GHSA-f9j6-8p6x-r9j6
  5. 2026-11-02 CVSS score added · GHSA-f9j6-8p6x-r9j6
  6. 2026-11-02 Weakness changed · GHSA-f9j6-8p6x-r9j6
  7. 2026-11-02 5 new references · GHSA-f9j6-8p6x-r9j6
  8. 2026-11-04 CISA SSVC decision points changed
  9. 2026-11-04 Priority changed: LOW → HIGH
  10. 2026-11-06 Affected versions changed · Red Hat
  11. 2026-11-06 CVSS score added · Red Hat

References

Sources