此工具用于计算棘手的规范哈夫曼直方图,该直方图能够触发易受攻击的libwebp库(即 libwebp <= 1.3.1)的越界(OOB)写入。此漏洞编号为 CVE-2023-4863 或 CVE-2023-41064。我们最多可以溢出预分配的哈夫曼表 132 个条目。
原理在于,libwebp 假设每个 webp 图像中包含的哈夫曼直方图格式良好。也就是说,解码树必须是一棵完全树。基于这一假设,libwebp 团队利用 enough 工具来估算构建解码哈夫曼表(一种用于快速解码规范哈夫曼码的强大结构)所需的最大内存大小。然而,攻击者能够构造一棵不完全树来突破此内存限制,从而溢出预分配的内存。
此构建工具通过修改 enough 并添加不完全树支持而创建。
使用以下命令编译代码:
gcc -o NotEnough ./main.c
对于一个包含 40 个符号、8 位根表且最大深度为 15 的哈夫曼表,表条目的最大数量为 410。然而,通过构造一棵不完全树,表条目数量可能达到 542。尝试以下命令:
./NotEnough 40 8 15
此类树的一个示例如下:
注意,为简洁起见,我们剪去了没有叶子的分支。
然后,您可以使用 craft 工具构建一个有效的 webp 图像来溢出 dwebp 工具(版本 <= 1.3.1)。将哈夫曼码直方图 code_lengths_counts[4] 相应地更改为 {0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 5, 9, 17, 1, 1, 3},然后重新构建该工具:
vim craft.c # 相应地更改哈夫曼码直方图,例如在第 495 行附近。
gcc -o craft craft.c
./craft -o bad_542.webp
请查阅 @benhawkes 的博客 以更好地了解 CVE-2023-4863。