Вразливість у бібліотеці з основною реалізацією алгоритму SHA-3

У реалізації криптографічної хеш-функції SHA-3 (Keccak), пропонованої в пакеті XKCP (eXtended Keccak Code Package), виявлено вразливість (CVE-2022-37454), яка може призвести до переповнення буфера в процесі обробки визначених даних. Проблема викликана помилкою в коді конкретної реалізації SHA-3, а не вразливістю в алгоритмі. Пакет XKCP подається як офіційна реалізація SHA-3, розвивається за участю команди розробників Keccak і використовується як основа у функціях для роботи з SHA-3 у різних мовах програмування (наприклад, код XKCP використовується в Python-модулі hashlib, Ruby-пакеті digest- sha3 та PHP-функціях hash_*).

За заявою дослідника, який виявив проблему, йому вдалося використати вразливість для порушення криптографічних властивостей хеш-функції та знаходження першого та другого прообразу, а також визначення колізій. Крім того, заявлено про створення прототипу експлоїту, що дозволяє досягти виконання коду при обчисленні хеша спеціально оформленого файлу. Потенційно вразливість також може бути використана для атак на алгоритми перевірки цифрових підписів, які використовують SHA-3 (наприклад, Ed448). Подробиці методів проведення атак планується опублікувати пізніше після повного усунення вразливості.

Наскільки вразливість торкається існуючих додатків на практиці поки не ясно, тому що для прояву проблеми в коді має застосовуватися циклічне обчислення хеша блоками і один з блоків, що обробляються, повинен мати розмір близько 4 ГБ (не менше 2^32 — 200 байт). При обробці вхідних даних разом (без послідовного обчислення хеша частинами) проблема не проявляється. Як найпростіший метод захисту пропонується обмежити максимальний розмір даних, що беруть участь в одній ітерації обчислення хеша.

Вразливість викликана помилкою при блоковій обробці вхідних даних. Через некоректне порівняння значень з типом «int» визначається неправильний розмір очікуваних обробки даних, що призводить до запису хвоста за межі виділеного буфера. Зокрема, при порівнянні використовувався вираз «partialBlock + instance->byteIOIndex», який при великих значеннях складових частин призводив до цілісного переповнення. Крім того, в коді було неправильне приведення типів "(unsigned int) (dataByteLen - i)", що призводило до переповнення на системах з 64-розрядним типом size_t.

Приклад коду, що веде до переповнення: import hashlib h = hashlib.sha3_224() m1 = b»\x00″ * 1; m2 = b "x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())

Джерело: opennet.ru

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