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