Уязвимост в библиотеката с основната реализация на алгоритъма 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster