SHA-3 алгоритмінің негізгі іске асырылуымен кітапханадағы осалдық

XKCP (eXtended Keccak Code Package) пакетінде ұсынылған SHA-3 (Keccak) криптографиялық хэш функциясын іске асыруда осалдық (CVE-2022-37454) анықталды. Бұл осалдық арнайы пішімделген деректерді өңдеу кезінде буфердің толып кетуіне әкелуі мүмкін. Мәселе алгоритмнің өзіндегі осалдықтан емес, нақты SHA-3 іске асыру кодындағы қатеден туындайды. XKCP Keccak әзірлеушілер тобымен бірлесіп жасалған SHA-3 ресми іске асыруы ретінде насихатталады және әртүрлі бағдарламалау тілдеріндегі 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