I implementeringen af den kryptografiske hash-funktion SHA-3 (Keccak), som tilbydes i pakken XKCP (eXtended Keccak Code Package), blev der fundet en sårbarhed (CVE-2022-37454), som kan føre til buffer overflow under behandlingen af specifikt formaterede data. Problemet skyldes en fejl i koden for den specifikke implementering af SHA-3 og er ikke en sårbarhed i selve algoritmen. Pakken XKCP præsenteres som den officielle implementering af SHA-3, udvikles med deltagelse af Keccak-udviklerteamet og bruges som grundlag for funktioner, der arbejder med SHA-3 i forskellige programmeringssprog (for eksempel bruges koden fra XKCP i Python-modulet hashlib, Ruby-pakken digest-sha3 og PHP-funktionerne hash_*).
Ifølge erklæringen fra forskeren, der opdagede problemet, har han formået at udnytte sårbarheden til at kompromittere de kryptografiske egenskaber af hash-funktionen og finde både første og anden præbillede samt identificere kollisioner. Desuden er det blevet rapporteret, at der er oprettet en prototype exploit, som muliggør udførelse af kode ved beregning af hash af en specifikt formateret fil. Potentielt kan sårbarheden også udnyttes til angreb på algoritmer til verifikation af digitale signaturer, der bruger SHA-3 (for eksempel Ed448). Detaljer om angrebsmetoderne planlægges offentliggjort senere, efter den generelle udbedring af sårbarheden.
Hvorvidt sårbarheden påvirker eksisterende applikationer i praksis er endnu ikke klart, da der i koden skal anvendes cyklisk hashberegning af blokke, og en af de behandlede blokke skal være omkring 4 GB (mindst 2^32 — 200 bytes). Når inddata behandles på én gang (uden sekventiel hashberegning i dele) opstår problemet ikke. Som den mest enkle beskyttelsesmetode foreslås det at begrænse den maksimale datastørrelse, der indgår i én iteration af hashberegningen.
Sårbarheden skyldes en fejl i blokbehandlingen af inputdata. På grund af en ukorrekt sammenligning af værdier med typen "int" bestemmes den forkerte størrelse af de data, der venter på at blive behandlet, hvilket fører til skrivning af halen uden for den tildelte buffer. Især ved sammenligning blev udtrykket "partialBlock + instance->byteIOIndex" brugt, hvilket ved store værdier af de delkomponenter førte til heltalsoverskridelse. Desuden indeholder koden en forkert typekonvertering "(unsigned int)(dataByteLen - i)", der førte til overskridelse på systemer med 64-bit type size_t.
Eksempel på kode, der fører til overskridelse: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())
Kilde: opennet.ru
