Идентификувана е ранливост (CVE-3-2022) при имплементацијата на криптографската хаш-функција SHA-37454 (Keccak) понудена во пакетот XKCP (eXtended Keccak Code Package), што може да доведе до прелевање на баферот при обработка на одредени податоци. Проблемот е предизвикан од грешка во кодот на одредена имплементација на SHA-3, а не од ранливост во самиот алгоритам. Пакетот XKCP се смета за официјална имплементација на SHA-3, развиен со влез од тимот за развој на Keccak и се користи како основа за функциите SHA-3 на различни програмски јазици (на пр., кодот XKCP се користи во хашлибот на Python модул, функциите на Ruby digest пакет sha3 и PHP hash_*).
Според истражувачот кој го идентификувал проблемот, тој можел да ја искористи ранливоста за да ги наруши криптографските својства на хаш функцијата и да ги пронајде првата и втората слика, како и да открие судири. Дополнително, беше најавено дека ќе биде креиран прототип на експлоатација што ќе овозможи извршување на кодот при пресметување на хашот на специјално дизајнираната датотека. Ранливоста може потенцијално да се користи и за напад на алгоритми за верификација на дигитален потпис кои користат SHA-3 (на пример, Ed448). Деталите за методите на напад се планира да бидат објавени подоцна, откако ранливоста ќе биде елиминирана насекаде.
Сè уште не е јасно колку ранливоста влијае на постоечките апликации во пракса, бидејќи за проблемот да се манифестира во кодот, мора да се користат циклични хаш пресметки во блокови и еден од обработените блокови мора да биде со големина од околу 4 GB (барем 2^32 - 200 бајти). Кога се обработуваат влезните податоци одеднаш (без последователно пресметување на хашот во делови), проблемот не се појавува. Како наједноставен метод за заштита, се предлага да се ограничи максималната големина на податоците вклучени во една повторување на пресметката на хашот.
Ранливоста е предизвикана од грешка во блок обработката на влезните податоци. Поради неправилна споредба на вредностите со типот „int“, се утврдува неточната големина на податоците што чекаат, што доведува до тоа опашката да се запише надвор од доделениот бафер. Конкретно, во споредбата се користеше изразот „partialBlock + instance->byteIOIndex“, што доведе до прелевање на цели броеви за големи вредности на составните делови. Дополнително, имаше погрешен тип cast „(unsigned int)(dataByteLen - i)“ во кодот, што предизвика прелевање на системи со 64-битен тип size_t.
Пример код кој предизвикува прелевање: увезете хашлиб h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.ажурирање(m1) h.ажурирање(m2) print(h.hexdigest())
Извор: opennet.ru
