ZeroHour

CVE-2026-53939

niche

Hard-coded zero CEK in OpenIDC cjose JWE encryption

CVSS 3.1
9.1 critical
EPSS
<1%p9
Published
()
Modified
AI analysis

cjose, the OpenIDC C library implementing Javascript Object Signing and Encryption (JOSE), generates an all-zero content-encryption key (CEK) instead of a random one when encrypting a JWE with an AES-CBC-HMAC content-encryption algorithm (A128CBC-HS256, A192CBC-HS384, or A256CBC-HS512) together with any key-management algorithm that generates a fresh CEK. Because the CEK is fixed and publicly known, the resulting JWE is encrypted and authenticated under a known key, so anyone who obtains the ciphertext can recover the plaintext and forge or modify its content without possessing any secret. Applications and services using cjose versions 0.6.1 through 0.6.2.5 for JWE encryption with these algorithm combinations are affected, and any data already encrypted this way remains readable and forgeable by anyone holding the JWE. The flaw is fixed in version 0.6.2.6, where the CEK is generated from RAND_bytes and covered by a regression test; there is no public proof-of-concept, no CISA KEV entry, and no known in-the-wild exploitation, with EPSS estimating only a 0.2% probability of exploitation in the next 30 days.

What to do: Upgrade to cjose 0.6.2.6, where the CEK is randomly generated. Until then, for new ciphertexts use an AES-GCM enc (A128GCM/A192GCM/A256GCM), use alg=dir with a caller-supplied CEK, or avoid cjose for JWE encryption with an AES-CBC-HMAC enc paired with fresh-CEK key management. Audit existing cjose-encrypted data for the affected combinations: anything already encrypted under the zero key is compromised, so re-encrypt it and rotate any secrets it contained.

Affected
OpenIDC cjose0.6.1 through 0.6.2.5 (fixed in 0.6.2.6)
Estimated exposure
nicheunknown, plausibly no more than low thousands of deployments (estimate) — No public install counts, market-share data, or internet-exposure scans exist for this small C library; the niche classification reflects its role as a specialized JOSE dependency embedded in a limited set of applications rather than a…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

OpenIDC/cjose is a C library implementing the Javascript Object Signing and Encryption (JOSE). In versions 0.6.1 through 0.6.2.5, when cjose encrypts a JWE using an AES-CBC-HMAC content-encryption algorithm (`A128CBC-HS256`, `A192CBC-HS384`, or `A256CBC-HS512`) together with any key-management algorithm that generates a fresh content-encryption key (CEK), the CEK is all zero bytes instead of being randomly generated. The resulting JWE is therefore encrypted and authenticated under a fixed, publicly known key, so anyone who obtains the JWE can recover the plaintext and forge or modify the content. This is fixed in version 0.6.2.6 by `_cjose_jwe_set_cek_aes_cbc()` generating the CEK from `RAND_bytes`. A regression test asserts that the `encrypted_key` differs across two encryptions for each AES-CBC-HMAC variant. Until upgrading, for data encrypted with cjose, three options are available. Use an AES-GCM `enc` (`A128GCM` / `A192GCM` / `A256GCM`) instead of an AES-CBC-HMAC `enc`, use `alg=dir` with a caller-supplied CEK, or avoid using cjose for JWE encryption with the affected algorithm pair. These are mitigations for new ciphertexts only; data already encrypted under the zero key remains compromised and should be re-encrypted (and any secrets it contained rotated).

Weakness
CWE-321, CWE-330
Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N

In the news

No ingested article mentions this CVE yet.