# CVE-2026-62374: SD JWT JS: Tampered disclosures silently dropped instead of rejected

Status: published. Published: 2026-10-29. Updated: 2026-11-04.

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.

## Remediation

- fix: @sd-jwt/core (npm): OSV reports a fixed version 0.20.0. Check the advisory for supported release branches. (source: OSV GHSA-f9j6-8p6x-r9j6) — https://github.com/advisories/GHSA-f9j6-8p6x-r9j6

## Affected products and versions

- openwallet-foundation / @sd-jwt/core: <= 0.19.0 (affected). Source: CNA: GitHub_M
- openwallet-foundation / @sd-jwt/decode: <= 0.19.0 (affected). Source: CNA: GitHub_M
-  / @sd-jwt/decode (@sd-jwt/decode): ≥ 0; ≤ 0.19.0 (affected, semver); OSV events: introduced 0; last affected 0.19.0. Source: OSV GHSA-f9j6-8p6x-r9j6
-  / @sd-jwt/core (@sd-jwt/core): ≥ 0; < 0.20.0 (affected, semver); OSV events: introduced 0; fixed 0.20.0. Source: OSV GHSA-f9j6-8p6x-r9j6

## Severity and prioritization

- CVSS 4.0: 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; source: CNA: GitHub_M

- CISA KEV: No listing in collected sources

- EPSS: 0.23% as of 2026-11-03; percentile 13.34%

- SSVC: exploitation poc; automatable yes; technical impact partial; source ADP: CISA-ADP

- Weaknesses: CWE-754, CWE-176

## Exploit evidence

- exploit: https://github.com/openwallet-foundation/sd-jwt-js/security/advisories/GHSA-f9j6-8p6x-r9j6 (ADP: CISA-ADP)

## References

- https://github.com/openwallet-foundation/sd-jwt-js/security/advisories/GHSA-f9j6-8p6x-r9j6 (CNA: GitHub_M; x_refsource_CONFIRM)

- https://github.com/openwallet-foundation/sd-jwt-js/security/advisories/GHSA-f9j6-8p6x-r9j6 (ADP: CISA-ADP; exploit)

- https://github.com/advisories/GHSA-f9j6-8p6x-r9j6 (OSV / GitHub Security Advisories; advisory)

- https://osv.dev/vulnerability/GHSA-f9j6-8p6x-r9j6 (OSV / GitHub Security Advisories; osv)

## Provenance

- CNA: GitHub_M: https://www.cve.org/CVERecord?id=CVE-2026-62374; retrieved 2026-11-04; source updated 2026-11-04

- OSV / GitHub Security Advisories: https://osv.dev/vulnerability/GHSA-f9j6-8p6x-r9j6; retrieved 2026-11-04; source updated 2026-11-02

- FIRST EPSS: https://api.first.org/data/v1/epss?cve=CVE-2026-62374; retrieved 2026-11-04; source updated Not reported

Revision: c446fd5dc3003244caeccac814c78988a4a492b8c31acc300b8f9f8765580a92

Canonical: https://y2.dev/cve/CVE-2026-62374

## Agent and API access

Public CVE pages, Markdown, and JSON are free to read without an account or API key.

- Public catalog: https://y2.dev/cve/index.json. Follow nextCursor with the same search, filters, sort, and limit (1–100). A null cursor marks the end.

- WebMCP: search_cve_disclosures, get_cve_disclosure, get_cve_page_markdown, get_y2_cve_access. Available in compatible browsers.

- Cyber API: https://api.y2.dev/api/v2/cyber/cves and https://api.y2.dev/api/v2/cyber/cves/{cveId}.

- Y2 Pro or Elite: create a workspace API key with the intel:cyber scope and send Authorization: Bearer <Y2_API_KEY>. Setup: https://y2.dev/docs/api/create-key.

- x402: Pay per request without an account or API key. Omit Authorization, read the HTTP 402 PAYMENT-REQUIRED challenge, validate its current requirements, and retry with PAYMENT-SIGNATURE through an authorized payment client. These browser tools never make payments. Guide: https://y2.dev/docs/api/x402.

- OpenAPI: https://y2.dev/api/openapi.yaml. Agent access metadata: https://y2.dev/cve/agent.json.

Collected public records only. Check source status for coverage and freshness.