Вразливість у реалізаціях постквантового алгоритму шифрування Kyber

У реалізації алгоритму шифрування Kyber, який переміг на конкурсі криптоалгоритмів, стійких до підбору на квантовому комп'ютері, виявлено вразливість, яка допускає проведення атак сторонніми каналами для відтворення секретних ключів на основі вимірювання часу операцій під час розшифрування наданого атакуючим шифротексту. Проблема зачіпає як еталонну реалізацію механізму інкапсуляції ключів CRYSTALS-Kyber KEM, так і багато сторонніх бібліотек шифрування з підтримкою Kyber, у тому числі бібліотеку pqcrypto, що застосовується в месенджері Signal.

Суть уразливості, яка отримала кодове ім'я KyberSlash, у використанні в процесі декодування повідомлення операції поділу "t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;", в якій ділимое містить секретне значення "t" з типом «double», а дільник загальновідоме громадське значення KYBER_Q. Проблема в тому, що час операції розподілу не є константою і в різних оточеннях кількість циклів CPU, що виконуються для розподілу, залежить від вхідних даних. Таким чином, на підставі зміни часу операцій можна отримати уявлення про характер даних, що використовуються при розподілі.

Деніел Бернштейн (Daniel J. Bernstein), відомий експерт у галузі криптографії, зумів підготувати робочу демонстрацію доказу можливості здійснення атаки на практиці. У двох із трьох проведених експериментів під час виконання коду на платі Raspberry Pi 2 вдалося повністю відтворити закритий ключ Kyber-512 на підставі вимірювання часу декодування даних. Метод також може бути адаптований для ключів Kyber-768 та Kyber-1024. Для успішного проведення атаки необхідно, щоб шифротекст, що задається атакуючим, оброблявся з використанням однієї і тієї ж пари ключів і щоб можна було точно виміряти час виконання операції.

У деяких бібліотеках виявлено ще один витік (KyberSlash2), який також виникає через використання секретного значення при виконанні поділу. Відмінність першого варіанта зводиться до виклику на стадії шифрування (у функціях poly_compress і polyvec_compress), а чи не під час розшифровки. При цьому другий варіант може виявитися корисним для атаки лише у випадках використання процедури в операціях повторного шифрування, у яких висновок зашифрованого тексту вважається конфіденційним.

Вразливість вже усунута в бібліотеках:

  • zig/lib/std/crypto/kyber_d00.zig (22 грудня),
  • pq-crystals/kyber/ref (30 грудня),
  • symbolicsoft/kyber-k2so (19 грудня),
  • cloudflare/circl (8 січня),
  • aws/aws-lc/crypto/kyber (4 січня),
  • liboqs/src/kem/kyber (8 січня).

Бібліотеки, що спочатку не схильні до вразливості:

  • boringssl/crypto/kyber,
  • filippo.io/mlkem768,
  • formosa-crypto/libjade/tree/main/src/crypto_kem,
  • kyber/common/amd64/avx2,
  • formosa-crypto/libjade/tree/main/src/crypto_kem/kyber/common/amd64/ref,
  • pq-crystals/kyber/avx2,
  • pqclean/crypto_kem/kyber*/avx2.

Вразливість залишається невиправленою в бібліотеках:

  • antontutoveanu/crystals-kyber-javascript,
  • Argyle-Software/kyber,
  • debian/src/liboqs/unstable/src/kem/kyber,
  • kudelskisecurity/crystals-go,
  • mupq/pqm4/crypto_kem/kyber* (20 грудня виправлено лише 1 варіант уразливості),
  • PQClean/PQClean/crypto_kem/kyber*/aarch64,
  • PQClean/PQClean/crypto_kem/kyber*/clean,
  • randombit/botan (20 грудня виправлено лише 1 варіант уразливості),
  • rustpq/pqcrypto/pqcrypto-kyber (5 січня виправлення додано в libsignal, але в самому pqcrypto-kyber вразливість поки не виправлена).

Джерело: opennet.ru

Додати коментар або відгук