Pillow 图像变换内存分配失败致双重释放
先了解这件事
GitHub 安全公告库公开了 Pillow 的一个双重释放漏洞及复现脚本和补丁。Pillow 的 ImagingScaleAffine() 在 calloc 失败时会对调用方拥有的输出图像调用 ImagingDelete(),Python 对象析构时再次释放,形成 use-after-free 与双重释放。公告称,能控制 Image.transform() 输出尺寸的人即可触发,但仅在设有内存限制的 worker 或 32 位进程中成立;路径需使用 Transform.EXTENT,或使用纯缩放/平移矩阵的 Transform.AFFINE,并采用默认 NEAREST 重采样。在默认 overcommit 的 64 位 Linux 上,需借助 ulimit -v、uwsgi --limit-as 或 systemd LimitAS= 等地址空间限制。 公告附带的复现脚本在 1 GB 限制的常规构建上运行:transform((300000000, 1), EXTENT) 抛出并捕获 MemoryError 后,进程在 _dealloc() 调用的 free() 中因 SIGSEGV 终止。公告称该缺陷继承自 PIL 1.1.7 的原始 fork 提交,因此自 1.0 起的每个 Pillow 版本均受影响。
AI 根据报道生成 · 18 小时前更新
报道时间线
沿着报道,了解事件的不同侧面。
- GitHub 安全公告库 (GHSA)Pillow 的 Image.transform 在 calloc 失败时双重释放,附复现脚本与补丁
Pillow 的 ImagingScaleAffine()(src/libImaging/Geometry.c:866)在 calloc 失败时对调用方拥有的输出图像调用 ImagingDelete(),随后 Python 对象析构时再次释放,形成 use-after-free 与双重释放。
本事件热度走势
- 可比范围当前
- 5
- 可比范围峰值
- 810月22日 12:00
- 近 24 小时变化
- –
趋势仅比较持续完整观测到的相同主体,范围可能小于当前热度统计。移动指针或点击图表查看每小时热度;键盘可用左右方向键切换。