3.1.1¶
CVE-2016-0740——tiffdecode.c中的缓冲区溢出¶
当与X64上的libtiff>4.0.0链接时,Pillow3.1.0及更早版本在读取特制的tiff文件时可能溢出缓冲区。
具体来说,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有一个缓冲区溢出错误。
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
有缓冲区溢出错误。
这个 state.buffer
对于 PcdDecode.c
根据每像素3字节的大小分配,其中 PcdDecode.c
写入缓冲区,假设每像素4个字节。这会将超过缓冲区末尾的768字节写入其他Python对象存储中。在某些情况下,这会导致segfault,而在其他情况下则会导致内部python malloc错误。
resample.c中的整数溢出¶
如果一个较大的值被传递到图像的新大小中,则有可能溢出传递到malloc的int32值。
kk=malloc(xsize*kmax*sizeof(float));…xbounds=malloc(xsize*2*sizeof(int));
xsize
是受信任的用户输入。这些乘法可能溢出,导致malloc的缓冲区过小。这些分配后面跟着一个写越界的循环。这可能导致具有攻击者控制的浮点数据的python进程堆损坏。
奈德·威廉姆森发现了这个问题。