Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit mismatched-kty peer JWK to ECDH endpoint
-
Deliveryshared_secret/2 falls into infinite tail recursion
-
ExploitErlang scheduler pinned at 100% CPU
-
ExecutionRepeat requests to exhaust all schedulers
-
ImpactService-wide denial of service
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Recursion depth limits
|
| Exploitation Conditions | Exploitation requires that the application call jose_jwk:shared_secret/2 (Elixir JOSE.JWK.shared_secret/2) to derive an ECDH shared secret using an externally supplied peer public JWK, AND that it does so without first validating that the peer key's kty (and crv for EC/OKP keys) matches its own key - the advisory's stated vulnerable pattern. The attacker then sends a single JWK whose kty differs from the server's key (e.g. an RSA public key against the server's EC P-256 key), which is enough to hang the deriving process indefinitely. No authentication or privilege is needed beyond the ability to submit a peer key to the derivation flow (PR:N, UI:N). Limiting factors: only affects deployments on jose 1.5.0 through before 1.11.13 that actually use the shared_secret/2 ECDH path on untrusted input - applications using jose solely for JWS/JWE/JWT signing and verification do not reach the vulnerable clause. |
| Impact | This is a genuine but modest-priority availability issue, not a drop-everything emergency. The vendor CVSS 4.0 score is 5.9 (medium), with impact confined to availability (VA:H; VC/VI:N) - there is no confidentiality or integrity exposure, only CPU-exhaustion denial-of-service via an infinite tail-recursive loop (CWE-674/835). EPSS is very low at 0.14% (3rd percentile) and the CVE is NOT in CISA KEV, so there is no sign of active or widespread exploitation. Countervailing that, a verified public proof-of-concept exploit script (with run logs showing a hung scheduler) is published in the GHSA advisory, and the trigger is a single crafted request requiring no authentication (PR:N) and no user interaction (UI:N), making it trivially automatable once a vulnerable code path is reachable. The signals conflict on attack vector: the supplied CVSS 4.0 vector asserts AV:L (local), yet the advisory describes a remotely triggerable DoS where an attacker-controlled peer JWK arrives over the wire in an ordinary ECDH key-agreement endpoint - treat the realistic vector as network-reachable and verify with the vendor rather than trusting AV:L. The AT:P (attack requirements) metric reflects the real limiter: the flaw is only reachable when an application derives a shared secret from an untrusted peer key without first checking kty/crv, which is a narrower usage pattern than generic JWT signing/verification. Net: for operators running Elixir/Erlang services that perform ECDH shared-secret derivation with jose on externally supplied keys, this warrants prompt patching (consistent with the vuln.today 'this_month' decision label); for everyone else using jose only for JWS/JWE/JWT, real exposure is low. |
| Exploit ScenarioDerived | An unauthenticated remote attacker submits an attacker-controlled peer public JWK of a mismatched key type (for example an RSA key) to an application that derives an ECDH shared secret against its own EC P-256 key via JOSE.JWK.shared_secret/2 on untrusted input. The kty mismatch makes the function re-enter itself with identical arguments, pinning a BEAM scheduler at 100% CPU per request so the call never returns; repeated requests exhaust the available schedulers and take the service down. A verified public proof-of-concept script demonstrating this is published in the GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
The Erlang/Elixir JOSE library (potatosalad/erlang-jose) can be driven into an unbounded tail-recursive loop through JOSE.JWK.shared_secret/2 when an application derives an ECDH shared secret from an attacker-supplied peer JWK whose key type differs from the application's own key. A single mismatched JWK (for example an RSA public key submitted to a server holding an EC P-256 key) never returns and never crashes, pinning one BEAM scheduler at 100% CPU; repeated submissions exhaust schedulers and degrade or take down the service. Only deployments on jose 1.5.0 through 1.11.12 that actually call shared_secret/2 on untrusted input are reachable - applications using jose purely for JWS/JWE/JWT signing and verification do not hit the vulnerable clause. Severity is a genuine but modest-priority availability issue: EPSS is 0.14% (3rd percentile), there is no CISA KEV listing, priority is 'this_month', but a public proof-of-concept script published with the vendor advisory demonstrates the scheduler hang. Fixed in 1.11.13.
RemediationAI
Upgrade to jose 1.11.13 or later - the released fix makes shared_secret/2 raise {badarg, [ModuleA, ModuleB]} when both already-decoded JWKs have different key types instead of recursing forever (patch commit https://github.com/potatosalad/erlang-jose/commit/26182a7de63b91550035d3f08741f7d17f1f675a, advisory https://github.com/potatosalad/erlang-jose/security/advisories/GHSA-fpj2-9h59-32pp). If upgrading is not immediately possible, the advisory's workaround is to check before calling shared_secret/2 that both keys have the same kty - and for EC/OKP keys the same crv - rejecting the request otherwise; the trade-off is that this validation must be added at every call site that handles untrusted peer keys, and any missed path remains exploitable. The advisory additionally recommends running key agreement on untrusted input under a timeout; note this is containment rather than a fix, since a timed-out derivation has already pinned a scheduler until the worker is forcibly killed, so it limits blast radius per request without preventing scheduler consumption. Callers that never invoke shared_secret/2 on externally supplied JWKs (for example deployments using jose only for JWS/JWE/JWT) are not exposed and can schedule the upgrade on the 'this_month' priority indicated by the decision data rather than as an emergency; there is no CISA KEV entry and EPSS is 0.14% (3rd percentile).
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 affected component is jose_jwk, the JWK handling module of potatosalad's pure-Erlang JOSE implementation, specifically shared_secret/2 as defined around lines 962-965 of src/jwk/jose_jwk.erl. The function has two clauses: the first pattern-matches both #jose_jwk{} records on the same kty module (shared_secret(#jose_jwk{kty={Module,YourKey}}, #jose_jwk{kty={Module,MyKey}})), and because the Module variable is bound once, that clause doubles as the guard preventing a cross-type derive_key call. The fallback clause, shared_secret(YourJWK, MyJWK) -> shared_secret(from(YourJWK), from(MyJWK)), exists to normalize unparsed input - but from/1 is idempotent and returns an already-parsed #jose_jwk{} record unchanged, so when two records with different kty modules are passed the fallback re-enters itself with identical arguments. The result is a tail-recursive spin with no base case and no exception, matching CWE-674 (uncontrolled recursion) and, per the GitHub advisory, CWE-835 (loop with unreachable exit condition). Because BEAM reductions are preemptible but this loop is a pure tail call that continually makes progress, the affected process never yields its scheduler back to useful work, so a single request permanently consumes a scheduler rather than merely a process. The fix in 1.11.13 makes the mismatched-type case raise {badarg, [ModuleA, ModuleB]}, exposing only key-type module names and no key material. The flaw was introduced with shared_secret/2 itself in 1.5.0 and is confined to the EC/OKP ECDH key-agreement path; it does not affect symmetric or signature operations.
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:N/VI:N/VA:H/SC:N/SI:N/SA:N
Peer JWK arrives over the wire so AV:N (vendor used AV:L), no auth or interaction so PR:N/UI:N; only availability is harmed via scheduler exhaustion (A:H, C/I:N); the app-must-use-unvalidated-peer-key precondition is a deployment condition not expressible in 3.1 (captured as AT:P in 4.0).
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
jose_jwk:shared_secret/2 (exposed in Elixir as JOSE.JWK.shared_secret/2) derives an ECDH shared secret from two JWKs. Its first function clause only matches when both JWKs carry the same key type (kty) module, and its fallback clause re-invokes itself as shared_secret(from(YourJWK), from(MyJWK)). Because from/1 returns an already-parsed jose_jwk record unchanged, passing two JWKs whose key types differ (for example an EC key and an RSA key) makes the fallback clause re-enter with identical arguments, producing an unbounded tail-recursive loop that never returns and never crashes.
An application that derives a shared secret from an externally supplied peer public key without first checking that the peer key's type and curve match its own key can be driven into this loop by an attacker-controlled JWK, pinning an Erlang scheduler at 100% CPU. Repeated requests exhaust the available schedulers, resulting in a denial of service.
This issue affects jose: from 1.5.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
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
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
Authentication-tag forgery in the Erlang JOSE library (jose 1.2.0 through 1.11.12) lets an unauthenticated remote attack
Bleichenbacher padding-oracle weakness in erlang-jose's pure-Erlang RSAES-PKCS1-v1_5 decryption (jose 1.3.0 through befo
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-110307
NVD
CVE.org
EPSS
GitHub
Exploit-DB