Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain server public RSA key
-
DeliverySubmit crafted RSA1_5 JWE ciphertexts to decrypt endpoint
-
ExploitObserve padding-conformance oracle (return value or timing)
-
ExecutionRun adaptive Bleichenbacher over ~10^4-10^6 queries
-
ImpactRecover CEK plaintext or forge signature
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V6 - Authentication Timing-safe comparisons
|
| Exploitation Conditions | Requires an application that (1) uses jose to unwrap RSA1_5 JWE keys or otherwise calls decrypt_private/3 with rsa_pkcs1_padding, and (2) exposes the decryption outcome across a trust boundary - a distinguishable return value/error (binary key vs. error/{error,{badsize,_}}) or observable response timing. For the direct return-value oracle the pure-Erlang jose_jwa_pkcs1 implementation must be the active backend (e.g. JOSE.crypto_fallback(true) or routing that pins RSA1_5 to it); the PoC explicitly forced this because OTP otherwise selects native RSA. The attacker needs only the public RSA key (no authentication). LIMITING FACTORS: the application must accept the RSA1_5 algorithm (choosing RSA-OAEP/RSA-OAEP-256 or rejecting RSA1_5 at the protected header avoids it); the attack is adaptive chosen-ciphertext requiring roughly 10^4-10^6 queries, so per-client rate-limiting of decryption failures materially raises cost; even with error-value normalization the non-blinded crypto:mod_pow modexp leaves a measurable timing oracle. Affected: jose 1.3.0 through before 1.11.13. |
| Impact | This is a genuine cryptographic weakness but a moderate real-world priority, not a drop-everything emergency. Signals are internally consistent on the low-to-moderate end: CVSS 5.9 (medium), EPSS 0.09% (0th percentile), no CISA KEV listing, and a vendor-assigned decision label of 'this_month'. The vendor CVSS 4.0 vector (AV:L/AC:L/AT:P/PR:N/UI:N/VC:H) scores confidentiality-only impact, no authentication (public key suffices), but adds AT:P to reflect that exploitation is conditional and non-trivial. There is a notable conflict worth flagging: the vendor chose AV:L (local), yet the description explicitly says an unauthenticated attacker submits ciphertexts to a 'decryption endpoint' - i.e. a network vector (AV:N); the AV:L choice likely reflects the surviving timing side channel rather than the primary return-value oracle, and should be verified against the actual deployment. The attack is real and well-understood (classic Bleichenbacher / Marvin-style), a public PoC demonstrates the distinguisher, and successful exploitation fully recovers plaintext - but it requires an application that both uses jose's RSA1_5 JWE unwrapping and exposes decryption outcomes across a trust boundary, plus roughly 10^4-10^6 adaptive chosen-ciphertext queries. The low EPSS and absence of KEV indicate no observed widespread exploitation, consistent with a targeted, high-effort attack rather than mass scanning. Prioritize patching where RSA1_5 JWE unwrapping is actually exposed; it is a lower priority where RSA1_5 is unused or the pure-Erlang backend is not routed. |
| Exploit ScenarioDerived | An application uses erlang-jose to unwrap RSA1_5-wrapped JWE content-encryption keys at a network-reachable endpoint and reveals (via return value, error channel, or observable timing) whether a decryption had conforming PKCS#1 v1.5 padding. An unauthenticated attacker holding only the server's public RSA key submits on the order of 10^4-10^6 crafted ciphertexts, using each accept/reject answer as a one-bit padding oracle to run Bleichenbacher's adaptive attack and recover the plaintext content-encryption key (and thus the protected message) of an intercepted ciphertext, or to forge a signature. A public PoC in the GHSA advisory demonstrates the distinguishable padding oracle (it proves the one-bit signal, not a full attack implementation). |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
Bleichenbacher padding-oracle weakness in erlang-jose's pure-Erlang RSAES-PKCS1-v1_5 decryption (jose 1.3.0 through before 1.11.13) can let an unauthenticated attacker who knows only the public RSA key recover plaintext from intercepted RSA1_5 JWE content-encryption keys via roughly 10^4 to 10^6 adaptive chosen-ciphertext queries. Exploitation requires an application that unwraps RSA1_5 JWE keys with jose and exposes the decryption outcome, either as distinguishable return values (recovered key versus error) or as observable timing; the direct return-value oracle applies when the pure-Erlang jose_jwa_pkcs1 backend is active. No CISA KEV entry or confirmed active exploitation was identified, EPSS is 0.09%, and a public PoC reference exists but it is not verified as working exploit code.
RemediationAI
Vendor-released patch: upgrade erlang-jose to 1.11.13 or later; the fix substitutes a randomly generated content-encryption key of the required length whenever RSA1_5 key unwrapping fails for any reason, continuing so that the failure surfaces only as ordinary content authentication failure, and the replacement CEK is generated on every decryption. This removes the padding-validity signal from API results but does not make the RSA operation constant-time, and the low-level RSA padding helpers still return errors. Recommended workarounds are to prefer RSA-OAEP or RSA-OAEP-256, or to refuse RSA1_5 by base64url-decoding the protected segment and rejecting tokens whose alg is RSA1_5 before decrypting; rate-limiting decryption failures per client also makes an adaptive attack much more expensive. Deployments that normalize failures should still apply the patch because non-blinded modexp timing can preserve an oracle. Advisory: https://github.com/potatosalad/erlang-jose/security/advisories/GHSA-vwvr-f994-6j9j; patch commit: https://github.com/potatosalad/erlang-jose/commit/0eac8cef9aaa48fb6846f4e47a0002dc4a73966d.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is CWE-203 (observable discrepancy) in RSAES-PKCS1-v1_5 decryption. In jose_jwa_pkcs1, eme_pkcs1_decode/2 accepts only blocks matching the PKCS#1 v1.5 encryption structure (leading 0x00 0x02, at least eight non-zero padding bytes, and a 0x00 separator) and returns the recovered message; otherwise it returns error. The wrapper rsaes_pkcs1_decrypt/2 preserves that distinction and adds {error, {badsize, _}} on length failure, so callers can observe whether padding was valid. No RFC 8017 section 7.2.2 implicit-rejection countermeasure is applied: on padding failure the implementation does not substitute a deterministic pseudo-random plaintext, leaving a one-bit conformance signal. The underlying modular exponentiation in dp/2 uses raw, non-blinded crypto:mod_pow/3, so the padding check can remain distinguishable by timing even if an application normalizes all failures to one error value. The PoC notes that a deployment must route RSA1_5 through the pure-Erlang backend for the direct return-value oracle; on the tested OTP runtime jose otherwise selects native RSA, and the script pins the backend with an ETS override. Applications that use RSA-OAEP or reject RSA1_5 are not exposed through this path.
Know when Jose gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
Remote decryption endpoint and public-key-only attack give AV:N/PR:N; reliance on the app exposing a padding/timing distinction plus many adaptive queries gives AC:H; plaintext recovery is C:H with no integrity/availability loss.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
The pure-Erlang RSAES-PKCS1-v1_5 decryption in the jose_jwa_pkcs1 module is a Bleichenbacher padding oracle. eme_pkcs1_decode/2 returns the recovered message when a decrypted block has valid PKCS#1 v1.5 padding (a leading 0x00 0x02, a padding string of at least eight non-zero bytes, and a 0x00 separator) and returns a distinct error result otherwise, and rsaes_pkcs1_decrypt/2 additionally returns {error, {badsize, _}} when the length check fails. The implementation applies no implicit-rejection countermeasure (RFC 8017 §7.2.2): it does not substitute a deterministic pseudo-random plaintext on a padding failure, so a one-bit padding-conformance signal leaks to the caller. Because the underlying modular exponentiation in dp/2 is a raw, non-blinded crypto:mod_pow/3, the padding check also stays distinguishable by timing even when an application normalizes every failure to a single error value.
An unauthenticated attacker who knows only the public RSA key and can submit ciphertexts to a decryption endpoint that unwraps RSA1_5 JWE keys (or otherwise calls decrypt_private/3 with rsa_pkcs1_padding) can use this oracle to recover the plaintext of intercepted ciphertexts, such as content-encryption keys and thus the protected message, or to forge signatures, through roughly 10^4 to 10^6 adaptive chosen-ciphertext queries.
This issue affects jose: from 1.3.0 before 1.11.13.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
JOSE is "JSON Web Almost Everything" - JWA, JWS, JWE, JWT, JWK, JWKS with no dependencies using runtime's native crypto
Signature verification bypass in the OCaml jose library (ulrikstrid/ocaml-jose) before 0.11.0 lets attackers forge valid
JWT token forgery in appsup-dart/jose library (versions prior to 0.3.5+1) enables remote attackers to bypass authenticat
Password-protected private-key exports produced by the Erlang/Elixir `jose` library between 1.10.0 and 1.11.12 are encry
Memory-exhaustion denial of service in the erlang-jose JOSE/JWE library for Erlang and Elixir (versions 1.0.0 through 1.
CPU-exhaustion denial of service in the erlang-jose library (versions 1.7.7 through 1.11.12) lets remote attackers who c
jose is an npm library providing a number of cryptographic operations. Rated medium severity (CVSS 5.9), this vulnerabil
Recovery of a long-term X25519 private key is possible in erlang-jose 1.10.0 through 1.11.12 whenever the pure-Erlang Cu
The Erlang/Elixir JOSE library (potatosalad/erlang-jose) can be driven into an unbounded tail-recursive loop through JOS
Authentication-tag forgery in the Erlang JOSE library (jose 1.2.0 through 1.11.12) lets an unauthenticated remote attack
jose is JavaScript module for JSON Object Signing and Encryption, providing support for JSON Web Tokens (JWT), JSON Web
ECDSA JWS signature malleability in erlang-jose (potatosalad:jose) 1.0.0 through 1.11.12 lets anyone holding a single le
EUVD-2026-110304
NVD
CVE.org
EPSS
GitHub
Exploit-DB