CVE-2016-0740——tiffdecode.c中的缓冲区溢出
当在x64上链接到libtiff>=4.0.0时,Pillow 3.1.0及更早版本在读取巧尽心思构建的TIFF文件时可能会溢出缓冲区 (CVE-2016-0740 )。
具体来说,libtiff>=4.0.0更改了 TIFFScanlineSize
从 int32
依赖于机器 int32|64
. 如果扫描线的大小使其溢出 int32
,可以将其解释为负数,然后将通过大小签入 TiffDecode.c
第236行。为此,逻辑扫描线大小必须大于2GB,对于测试文件,分配的缓冲区大小为64K,而扫描线大小大约为4GB。超过64K的任何图像数据都会写入堆,从而导致segfault。
这个问题是由安全研究员fourone发现的。
CVE-2016-0775——flidecode.c中的缓冲区溢出
在Pillow的所有版本中,至少可以追溯到最新的PIL 1.1.7版本,FliDecode.c存在缓冲区溢出错误 (CVE-2016-0775 )。
在第192行附近:
case 16:
/* COPY chunk */
for (y = 0; y < state->ysize; y++) {
UINT8* buf = (UINT8*) im->image[y];
memcpy(buf+x, data, state->xsize);
data += state->xsize;
}
break;
memcpy有错误 x
添加到目标缓冲区地址。 X
在多个内部临时变量角色中使用,但可以获取最大为图像宽度的值。 Im->image[y]
是一组行指针,指向与行大小相同的内存段。在最大 y
,这会将该行的内容从内存缓冲区的末尾写入,从而导致segfault。
这个问题是由阿丽莎·贝塞林在亚特兰蒂斯发现的。
CVE-2016-2533——pcddecode.c中的缓冲区溢出
在Pillow的所有版本中,至少可以追溯到最新的PIL 1.1.7版本, PcdDecode.c
具有缓冲区溢出错误 (CVE-2016-2533 )。
这个 state.buffer
对于 PcdDecode.c
根据每像素3字节的大小分配,其中 PcdDecode.c
写入缓冲区,假设每像素4个字节。这会将超过缓冲区末尾的768字节写入其他Python对象存储中。在某些情况下,这会导致segfault,而在其他情况下则会导致内部python malloc错误。
resample.c中的整数溢出
如果将较大的值传递给图像的新大小,则可能会溢出 int32
传递给malloc的值。
kk = malloc(xsize * kmax * sizeof(float));
...
xbounds = malloc(xsize * 2 * sizeof(int));
xsize
是受信任的用户输入。这些乘法可能会溢出,从而导致 malloc
缓冲区太小。这些分配之后是一个写出边界的循环。这可能会导致Python进程堆上具有攻击者控制的浮点数据的损坏。
奈德·威廉姆森发现了这个问题。
讨论区