Уразлівасць у бібліятэцы з асноўнай рэалізацыяй алгарытму 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

Дадаць каментар