logo头像

Hello World

PHP-GD库漏洞可导致服务器宕机

简介

通过精心构造的恶意图片,可以在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_gifin.c中,其中在LWZReadByte函数中存在一个循环(while-loop):

1
2
3
4
do {
sd->firstcode = sd->oldcode =
GetCode(fd, &sd->scd, sd->code_size, FALSE, ZeroDataBlockP);
} while (sd->firstcode == sd->clear_code);

其调用的GetCode

1
2
3
4
5
6
7
8
9
10
11
static int
GetCode_(gdIOCtx *fd, CODE_STATIC_DATA *scd, int code_size, int flag, int *ZeroDataBlockP)
{
int i, j, ret;
unsigned char count;
...
if ((count = GetDataBlock(fd, &scd->buf[2], ZeroDataBlockP)) <= 0)
scd->done = TRUE;
...

}

GetCode_ 会调用GetDataBlock来读取GIF图片中的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static int
GetDataBlock_(gdIOCtx *fd, unsigned char *buf, int *ZeroDataBlockP)
{
unsigned char count;

if (! ReadOK(fd,&count,1)) {
return -1;
}

*ZeroDataBlockP = count == 0;

if ((count != 0) && (! ReadOK(fd, buf, count))) {
return -1;
}
return count;
}

该漏洞依赖于从整形(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
2
<?php
imagecreatefromgif("poc.gif");

因为本机的环境限制了PHP CPU的使用,可以避免物理机死机。不过仍可以看到这时CPU占用达到了35%左右。
QQ截图20180202112716.jpg
这时PHP服务已经宕掉了。访问其它项目,发现也无法访问报504错误。
QQ截图20180202112943.jpg

漏洞修复

更新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

上一篇