源码级剖析PHP 7.2.x GD拒绝服务漏洞

触发条件:

php 7.2.x,开启gd库。只需要三行代码即可完成!

我在本地调试php的时候发现某个老代码能够直接把php给crash掉,因此成文。

php没有报错,直接死掉了,应该是内部逻辑有问题。再传到服务器上试试:

啊哈,一样的结果。触发这个问题的代码如下:

$im=imagecreate(100,100);
imageantialias($im,true);
imageline($im,0,0,10,10,0xffffff);

话不多说,上vs调试。先看调用堆栈吧。

从这里可以看出是在GD库的画像素点的地方出了错,被调试器断在了gdImageSetAAPixelColor这个函数里。

再看对应代码,访问了gdImagePtr结构体中的一个成员,导致访问违例。我们再从即时窗口检查一下:

没错,tpixels是个空指针!

那tpixels是干啥的呢?在gd.h里面有如下说明:

/* Truecolor flag and pixels. New 2.0 fields appear here at the
end to minimize breakage of existing object code. */
int trueColor;
int ** tpixels;

看来是和真彩色相关的东西,我们再沿着调用堆栈往前看。

这里是gdImageAALine函数,一个个点地画线,干的是苦力活。从gdImageLine里调用了它:

这里的条件判断是是否开启了防锯齿功能。如果我们调用imageantialias函数打开这个功能,那么就会走这里来。

上面图里就是我们从php调用的imageline函数的实现啦,非常简单。可以看出图片是真彩色的时候它会默认开启防锯齿功能。

这里问题就在于,我们创建(imagecreate)的图片不是真彩色的图,而后我们手动开启了防锯齿(imageantialias),调用进去想当然地把它当作一张真彩色图,从而导致了错误。

最后我们来看看两个函数的不同:

跟进去,可以看到imagecreate函数调用的gdImageCreate里直接把真彩色相关的成员设为了null。

与之对比,imagecreatetruecolor函数调用的gdImageCreateTrueColor函数里为每个像素点都分配了对应内存并初始化为0了:

总结一下,从上面分析可以看出,触发这个问题的条件有3个:

1.php版本为7.2.x且开启了gd库 2.创建了非真彩色图且开启抗锯齿 3.在创建的图句柄上进行像素点写入

导致这个问题的原因还是代码修改考虑不周全,引入了新的漏洞;没有对所有可能条件进行测试,所以从php 7.2.0一直到php 7.2.4都还存在问题。

已经向php官方报告,如果正在生产环境使用相关版本请退回旧版本,旧版本里不存在这个问题。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏不止是前端

TS+React+Router+Mobx+Koa打造全栈应用

50970
来自专栏逸鹏说道

Python3 与 C# 并发编程之~ 线程篇2

其实以前的 Linux中是没有线程这个概念的, Windows程序员经常使用线程,这一看~方便啊,然后可能是当时程序员偷懒了,就把进程模块改了改(这就是为什么之...

20940
来自专栏贺贺的前端工程师之路

React中的Redux

整个应用的state被存储在一棵object tree中,并且这个object tree只存在于唯一一个store中。

11820
来自专栏Modeng的专栏

Vue双向绑定原理,教你一步一步实现双向绑定

当今前端天下以 Angular、React、vue 三足鼎立的局面,你不选择一个阵营基本上无法立足于前端,甚至是两个或者三个阵营都要选择,大势所趋。

13210
来自专栏小樱的经验随笔

IPython使用学习笔记

学习《利用python进行数据分析》第三章 IPython:一种交互式计算和开发环境的笔记,共享给大家,同时为自己作为备忘用。 ? 安装ipython用pip即...

46950
来自专栏大前端_Web

深入理解JS异步编程五(脚本异步加载)

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

17430
来自专栏优启梦

WordPress 如何判断一篇文章是否存在

一直以来子凡都计划为泪雪网添加一个文章的收藏功能,直到现在也依旧也还只是在计划中,最近几天子凡在研究微信小程序,试图折腾用守望轩开源的WordPress微信小程...

421100
来自专栏Seebug漏洞平台

34c3 部分Web Writeup

34c3应该算是2017年年末的最后一个惊喜了,比赛题目虽然有非预期导致难度降了很多,但是从CTF中能学到什么才是最重要的,其中Web有3个XSS题目,思路非常...

466100
来自专栏Seebug漏洞平台

HCTF2017 部分 Web 出题思路详解

作者:LoRexxar'@知道创宇404实验室 11月12日结束的HCTF2017,我总共出了其中4道题目,这4道题目涵盖了我这半年来接触的很多有趣的东西。下面...

31840
来自专栏大前端_Web

javascript运行机制:并发模型 与Event Loop

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

26910

扫码关注云+社区

领取腾讯云代金券