Biblioteka Bouncy Castle dla Java zawiera podatność klasy timing side-channel (CWE-208) w implementacji algorytmu ML-KEM (CRYSTALS-Kyber), umożliwiającą odtworzenie długoterminowego klucza prywatnego. Atakujący mierzący czas wykonania dużej liczby operacji dekapsulacji może statystycznie odtworzyć sekretny klucz.
▸ Pokaż oryginał (EN)
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.
W wersjach od 1.73 do przed 1.78 trzy procedury ML-KEM wykonują dzielenie współczynników wielomianów, wyprowadzonych z sekretu, przez modulus q: Poly.toMsg (dekodowanie odszyfrowanej wiadomości), Poly.compressPoly oraz PolyVec.compressPolyVec (kompresja szyfrogramu). Czas wykonania dzielenia jest zależny od wartości danych wejściowych, co tworzy mierzalny kanał boczny. Są to podatności określane jako KyberSlash1 (Poly.toMsg) i KyberSlash2 (kompresja szyfrogramu). Operacja kompresji wykonywana podczas enkapsulacji działa na wartościach wchodzących w skład publicznego szyfrogramu i nie jest podatna na ten atak.
Atakujący zdolny do wielokrotnego mierzenia czasu operacji dekapsulacji wykonywanych z użyciem tego samego długoterminowego klucza prywatnego może odtworzyć ten klucz, co prowadzi do całkowitego ujawnienia poufnych danych chronionych tym kluczem.
Należy zaktualizować Bouncy Castle dla Java do wersji 1.78 lub nowszej, w której błędne dzielenia zostały poprawione. Patche dostępne są w repozytorium projektu (commity wskazane w referencjach producenta).
Bouncy Castle dla Java w wersjach od 1.73 do przed 1.78 (implementacja ML-KEM/CRYSTALS-Kyber)
Podatność obejmuje dwie oddzielne ścieżki ataku: KyberSlash1 (procedura Poly.toMsg) i KyberSlash2 (procedury kompresji szyfrogramu), opisane szczegółowo pod adresem kyberslash.cr.yp.to. Atak wymaga możliwości wykonania dużej liczby pomiarów czasu dekapsulacji (AC:H, AT:P), co ogranicza jego praktyczność, lecz nie eliminuje zagrożenia w scenariuszach z trwałymi kluczami długoterminowymi.
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:AmberBouncycastle Bc Java
APPBouncycastle1.73 – 1.78 (bez)
Powiązane podatności
Bouncy Castle dla Java — bypass Name Constraints przez trailing dot
Bouncy Castle Java: brak walidacji wartości peer w protokole MTI/A0 DH
Bouncy Castle for Java — błędna weryfikacja OCSP (CWE-295)
Bouncy Castle Java: błędna weryfikacja hostname (CN-fallback) w JSSE
Niebezpieczna refleksja przy deserializacji klucza XMSS w Bouncy Castle