简介
通过精心构造的恶意图片,可以在GD库使用imagecreatefromgif函数载入图像时,导致cpu耗尽,实现拒绝服务攻击。因此如果项目中使用GD库处理图片,要特别注意。
CVE编号:CVE-2018-5711
漏洞影响版本
PHP 5 < 5.6.33
PHP 7.0 < 7.0.27
PHP 7.1 < 7.1.13
PHP 7.2 < 7.2.1
漏洞细节
漏洞存在于文件ext/gd/libgd/gd_gif_in.c中,其中在LWZReadByte_函数中存在一个循环(while-loop):
1 | do { |
其调用的GetCode
1 | static int |
GetCode_ 会调用GetDataBlock来读取GIF图片中的数据:
1 | static int |
该漏洞依赖于从整形(int)到无符号字符(unsigned char)的类型转换。如果GetDataBlock_返回-1,则第400行中的scd->done将会被设置为True,并停止while循环。但是其定义的count是无符号字符,它总是从0到255的正数,所以这种循环停止动作是不会被触发执行的。
因此,最终结果就是,一张GIF图片就可以实现无限循环,导致服务器资源耗尽,直到崩溃宕机。
漏洞验证
刚好本机开发使用的PHP版本是7.1.8,属于漏洞影响范围。
将构造好的Poc下载到本地。
1 | curl -L https://git.io/vN0n4 | xxd -r > poc.gif |
新建一个PHP文件,使用imagecreatefromgif函数载入Poc
1 |
|
因为本机的环境限制了PHP CPU的使用,可以避免物理机死机。不过仍可以看到这时CPU占用达到了35%左右。
这时PHP服务已经宕掉了。访问其它项目,发现也无法访问报504错误。
漏洞修复
更新PHP版本
Url:http://php.net/downloads.php
更新后,继续测试Poc,会提示
1 | imagecreatefromgif(): 'poc.gif' is not a valid GIF file in |
注:PHP7.2禁用了Object作为类名。一些框架(比如Yii2)或者之前的项目设计很多使用了Object。因此升级到7.2版本需要注意。为了兼容我本机暂时只升级到7.1的最新版本。
2018年2月2日 - PHP 7.1.14.
如果升级PHP7.2,更多变更查看https://wiki.php.net/rfc/deprecations_php_7_2
文中部分引用以下链接内容。内容有删改。
https://bugs.php.net/bug.php?id=75571
http://php.net/ChangeLog-7.php
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5711
http://www.freebuf.com/vuls/161262.html
文章评论