如何使用 ImageMagick 防止图像炸弹?

2024-03-17

我目前在 PHP 上使用 Imagick 库,并使用 Image Magick 的调整大小功能。我刚刚了解了减压炸弹以及 ImageMagick 如何容易受到它的攻击。

我已经检查了如何 ping 图像并验证图像的尺寸,而无需实际将其加载到内存/磁盘中。限制 ImageMagick 的内存和磁盘限制也更安全,这样它就不会在磁盘上写入一个巨大的文件。

我已经阅读过并且可以使用 setResourceLimit() 来做到这一点。http://php.net/manual/en/imagick.setresourcelimit.php http://php.net/manual/en/imagick.setresourcelimit.php

IMagick::setResourceLimit(IMagick::RESOURCETYPE_MEMORY , 100);
IMagick::setResourceLimit(IMagick::RESOURCETYPE_DISK , 100);

$thumb = new Imagick('image.png');
$thumb->resizeImage(320,240,Imagick::FILTER_LANCZOS,1);

但是,发生的情况是,在设置磁盘和内存限制后,如果图像确实达到此限制,我得到的只是分段错误错误,不会引发异常。这让我无法妥善处理。

Update:

以下是我正在使用的软件包版本:

dpkg -l | grep magick
ii  imagemagick-common                    8:6.6.9.7-5ubuntu3.3              image manipulation programs -- infrastructure
ii  libmagickcore4                        8:6.6.9.7-5ubuntu3.3              low-level image manipulation library
ii  libmagickwand4                        8:6.6.9.7-5ubuntu3.3              image manipulation library
ii  php5-imagick                          3.1.0~rc1-1                       ImageMagick module for php5

设置“资源区域”限制仅设置图像不保存在内存中而是分页到磁盘的大小。如果您想使用该设置来实际限制可以打开的最大图像尺寸,您还需要设置“资源磁盘”限制。

下面的代码正确地给出了所拍摄图像炸弹的内存分配错误从这里 http://www.aerasec.de/security/advisories/decompression-bomb-vulnerability.html.

try {
    Imagick::setResourceLimit(Imagick::RESOURCETYPE_AREA, 2000 * 2000);
    Imagick::setResourceLimit(Imagick::RESOURCETYPE_DISK, 2000 * 2000);

    $imagick = new Imagick("./picture-100M-6000x6000.png");
    $imagick->modulateImage(100, 50, 120);
    $imagick->writeImage("./output.png");

    echo "Complete";
}
catch(\Exception $e) {
    echo "Exception: ".$e->getMessage()."\n";
}

输出是:

异常:内存分配失败 `./picture-100M-6000x6000.png' @ error/png.c/MagickPNGErrorHandler/1630

如果您想设置宽度和高度资源,并且 ImageMagick >= 6.9.0-1 的版本您应该能够直接使用 WidthResource = 9、HeightResource = 10 的值

//Set max image width of 2000
Imagick::setResourceLimit(9, 2000);
//Set max image height of 1000
Imagick::setResourceLimit(10, 1000);

这些不必以编程方式设置,您可以通过策略.xml http://www.imagemagick.org/script/resources.php使用 ImageMagick 安装的文件。 ImageMagick 读取该文件并使用这些设置(如果程序中没有设置) - 这可能是设置它们的更方便的方法,因为您可以在每台机器上更改它们。

这让我无法妥善处理。

让你无法应对在同一个过程中。您可以通过在后台任务中运行图像处理来很好地处理它。

就我个人而言,我认为无论如何在由网络浏览器直接访问的服务器中使用 Imagick 都是疯狂的。将其作为后台任务运行要安全得多(由类似的东西管理)http://supervisord.org/ http://supervisord.org/)并通过需要处理的作业队列与该后台任务进行通信。

这不仅解决了“不良图像可能导致网站瘫痪”的问题,还使监控资源使用情况变得更加容易,或者将图像处理转移到 CPU 比 Web 前端服务器所需的速度更快的计算机上。

来源 - 我是 Imagick 扩展的维护者,我最近将其添加到 Imagick 自述文件中:

Security

PHP 扩展 Imagick 通过调用 ImageMagick 库来工作。 尽管 ImageMagick 开发人员非常小心地避免错误,但 代码中不可避免地会出现一些错误。图像魔术师 还使用了很多第三方库来打开、读取和操作 文件。这些库的作者在写的时候也很用心 他们的代码。然而每个人都会犯错,并且难免会犯错 存在一些错误。

因为ImageMagick是用来处理图像的,所以是可行的 黑客可以创建包含无效数据的图像来尝试 利用这些错误。因此,我们建议如下:

1)不要在可直接访问的服务器上运行Imagick 在您的网络之外。最好将其用作背景 使用 SupervisorD 之类的任务或在单独的环境中运行它 不能直接通过互联网访问的服务器。

这样做将使黑客很难利用漏洞,即使 是否应该存在于 ImageMagick 正在使用的库中。

2)将其作为特权非常低的进程运行。尽可能地 Imagick 的 PHP 脚本可访问的文件和系统资源 正在拨打的电话应该被锁定。

3)检查图像处理结果是否为有效的图像文件 在将其显示给用户之前。在极不可能发生的情况下 黑客能够将任意文件传输到 Imagick 的输出, 检查它是一个图像文件,而不是你的源代码 正在发送的申请是明智的预防措施。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ImageMagick 防止图像炸弹? 的相关文章

随机推荐