CVE-2024-14041
PoC massTiming Side-Channel (KyberSlash) in Bouncy Castle Java ML-KEM Key Decapsulation
Bouncy Castle for Java versions 1.73 through before 1.78 has an observable timing discrepancy (CWE-208) — the KyberSlash1 and KyberSlash2 flaws — in its ML-KEM (CRYSTALS-Kyber) routines Poly.toMsg, Poly.compressPoly, and PolyVec.compressPolyVec, which divide secret-derived polynomial coefficients by the modulus q. An attacker who can initiate or observe a large number of ML-KEM decapsulation operations performed with the same long-term private key and measure their timing can use the secret-dependent division timing to recover that key. Key recovery defeats the confidentiality of the post-quantum key exchange (CVSS 4.0 rates this 8.2 High with high attack complexity and High confidentiality impact); encapsulation-side compression is unaffected because it only operates on values that become the public ciphertext. Any application or service using affected bc-java releases for ML-KEM/Kyber decapsulation is affected, particularly deployments that reuse static ML-KEM keys across many exchanges. No in-the-wild exploitation is known (EPSS 0.3%, not in CISA KEV), but public proof-of-concept timing attacks are published at kyberslash.cr.yp.to.
What to do: Upgrade Bouncy Castle for Java to 1.78 or later, which removes the secret-dependent divisions in the ML-KEM routines. Inventory applications bundling bc-java jars in the 1.73–1.77 range and prioritize those performing ML-KEM/Kyber decapsulation with long-term (reused) keys, rotating such keys after patching. Where an immediate upgrade is not possible, treat high-volume, network-observable ML-KEM decapsulation paths as the highest risk.
| Bouncy Castle (bouncycastle) Bouncy Castle for Java (bc-java) | 1.73 up to but not including 1.78 (all 1.73–1.77 releases) |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
In Bouncy Castle for Java from 1.73 to before 1.78, three ML-KEM (CRYSTALS-Kyber) routines divided secret-derived polynomial coefficients by the modulus q: Poly.toMsg, which decodes the decrypted message, and the ciphertext compression routines Poly.compressPoly and PolyVec.compressPolyVec. An attacker able to measure the timing of a large number of decapsulations performed with the same long-term private key can recover that key. These are the KyberSlash1 (Poly.toMsg) and KyberSlash2 (ciphertext compression) divisions. Compression performed during encapsulation operates on values that become the public ciphertext and is not affected.
- Vendors
- bouncycastle
- Products
- bc-java
- Weakness
- CWE-208
- Vector
- CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:Amber
In the news0 stories
No ingested article mentions this CVE yet.