3.1.1#

CVE-2016-0740——tiffdecode.c中的缓冲区溢出#

当在x64上链接到libtiff>=4.0.0时,Pillow 3.1.0及更早版本在读取巧尽心思构建的TIFF文件时可能会溢出缓冲区 (CVE-2016-0740 )。

具体来说,libtiff>=4.0.0更改了 TIFFScanlineSizeint32 依赖于机器 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进程堆上具有攻击者控制的浮点数据的损坏。

奈德·威廉姆森发现了这个问题。