XKCP(扩展Keccak代码包)中提供的SHA-3(Keccak)加密哈希函数的实现存在一个漏洞(CVE-2022-37454)。该漏洞可能导致在处理特殊格式的数据时发生缓冲区溢出。此问题是由特定SHA-3实现的代码错误引起的,而非算法本身的漏洞。XKCP是SHA-3的官方实现,由Keccak开发团队开发,并被用作多种编程语言中SHA-3函数的基础(例如,Python模块hashlib、Ruby包digest-sha3和PHP函数hash_*都使用了XKCP代码)。
据发现该漏洞的研究人员称,他们利用该漏洞破坏了哈希函数的加密特性,找到了第一和第二原像,并检测到了碰撞。他们还宣布创建了一个原型漏洞利用程序,该程序允许在计算特制文件的哈希值时执行代码。该漏洞也可能被用于攻击使用 SHA-3 的数字签名验证算法(例如 Ed448)。攻击方法的详细信息计划在漏洞得到广泛修复后公布。
该漏洞在实际应用中的影响程度尚不明确,因为只有当代码使用循环块哈希计算时才会出现此问题,且处理的其中一个数据块大小必须约为 4 GB(至少 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
