Attacker-controlled AES-GCM authentication tag length allows tag forgery in jose
Impact
The pure-Erlang AES-GCM fallback in jose_jwa_aes derives the number of verified authentication tag bits from the attacker-supplied tag itself. In the {aes_gcm, Bits} clause of block_decrypt/4, the incoming tag is guarded only by is_binary/1, with no check on its length. Verification in gcm_block_decrypt/6 then computes TBits = bit_size(T) and compares only those bits of the real 128-bit tag. An attacker who controls a JWE token can truncate the authentication tag to as little as 8 bits, so only 8 bits are ever checked. This reduces forgery resistance from 2^-128 to 2^-8, and a forged…
Source excerpt · OSVWhat to do
Ensure the runtime provides a crypto provider with native AES-GCM support (a standard Erlang/OTP build linked against OpenSSL) so that JOSE dispatches AES-GCM to the native crypto NIF instead of the jose_jwa_aes fallback.
Affected packages
Start with the recorded fix for your release branch. Check your installed version and test compatibility before upgrading. Fixing this advisory does not rule out other vulnerabilities in the release.
| Affected range | Recorded fix |
|---|---|
| From 1.2.0 before 1.11.13Semantic versions | 1.11.13 |
Version evidence: OSV · EEF-CVE-2026-65625
View original version evidence (40 explicit versions)
Affected products
Vendor version evidence. Product records are separate from automatic dependency matching.
potatosalad · jose
Other versions: unaffected
| Version / range | Source status |
|---|---|
| 1.2.0 to before 1.11.13 | affected |
potatosalad · jose
Other versions: unaffected
| Version / range | Source status |
|---|---|
| 8848b172575fb7d7e1e2977e8ae0a21678d2157a to before 3fa1f8e3efda0da5ce6f4c9984789f979dc02740 | affected |
Original source description
Summary
The pure-Erlang AES-GCM fallback in jose_jwa_aes derives the number of verified authentication tag bits from the attacker-supplied tag itself. In the {aes_gcm, Bits} clause of block_decrypt/4, the incoming tag is guarded only by is_binary/1, with no check on its length. Verification in gcm_block_decrypt/6 then computes TBits = bit_size(T) and compares only those bits of the real 128-bit tag. An attacker who controls a JWE token can truncate the authentication tag to as little as 8 bits, so only 8 bits are ever checked. This reduces forgery resistance from 2^-128 to 2^-8, and a forged ciphertext is reliably accepted as authentic within 256 attempts without knowledge of the key (an authentication tag forgery and integrity bypass). Supplying a tag longer than 128 bits instead causes a badmatch that crashes the decrypting process. The fallback is reached through the public JWE decryption path whenever AES-GCM is not provided by a native crypto NIF, for example on FIPS or stripped or older OTP builds.
This issue affects jose: from 1.2.0 before 1.11.13.
Workarounds
Ensure the runtime provides a crypto provider with native AES-GCM support (a standard Erlang/OTP build linked against OpenSSL) so that JOSE dispatches AES-GCM to the native crypto NIF instead of the jose_jwa_aes fallback.
Configurations
This vulnerability is only exploitable when AES-GCM is handled by the pure-Erlang jose_jwa_aes fallback. That fallback is used on deployments where the Erlang/OTP crypto NIF does not expose native AES-GCM (for example FIPS builds, or stripped or older OTP releases). Deployments with a native AES-GCM crypto provider dispatch GCM through crypto and are not affected.
Source version evidence
This source records affected versions without identifying a package ecosystem and name. This evidence is not used for package matching.
References
- Security advisory github.com/potatosalad/erlang-jose/security/advisories/GHSA-6gxw-6f7r-cjr6
- Security advisory cna.erlef.org/cves/CVE-2026-65625.html
- Patch github.com/potatosalad/erlang-jose/commit/8848b172575fb7d7e1e2977e8ae0a21678d2157a
- Patch github.com/potatosalad/erlang-jose/commit/3fa1f8e3efda0da5ce6f4c9984789f979dc02740
- Source reference hex.pm/packages/jose
- Security advisory osv.dev/vulnerability/EEF-CVE-2026-65625