事件描述
2015年5月14日,PHP被曝出存在远程DOS漏洞,该漏洞一旦被利用成功,可以迅速消耗被攻击主机的CPU资源,从而达到DoS攻击的目的。 PHP在全球的部署量相当大,为攻击者提供了相当多可以攻击的目标。因而影响范围极大。
受此漏洞影响的软件及系统包括PHP的如下版本:
PHP 5.0.0 – 5.0.5;
PHP 5.1.0 – 5.1.6;
PHP 5.2.0 – 5.2.17;
PHP 5.3.0 – 73 5.3.29;
PHP 5.4.0 – 5.4.40;
PHP 5.5.0 – 5.5.24;
PHP 5.6.0 – 5.6.8。
漏洞产生的原因是PHP解析 multipart/form-datahttp 请求的 body part 请求头时,重复拷贝字符串导致 DoS 。而远程攻击者可以通过发送恶意构造的 multipart/form-data 请求,导致服务器 CPU 资源被耗尽,从而远程 DoS 服务器。
漏洞详情请参见:PHP multipart/form-data 远程 DoS 漏洞
专家解读
PHP 是一种流行的 Web 服务器端编程语言,它功能强大,简单易用,利用它编写网络应用程序,可以应对大规模的 HTTP 请求,所以很多业务环境中都部署了 PHP 。考虑规范性,PHP 在设计之初就遵循 RFC 规范,进行各个协议模块的封装及过程处理。PHP与其他同样遵循 RFC 规范的语言及环境相比,不过是处理方式不同。
而从 RFC1867 开始,HTTP 协议开始支持 ”multipart/form-data” 请求,以便接受多种数据格式,包括多种变量甚至是文件上传。multipart/form-data 中可以包含多个报文,每一个报文 Boundary(分隔符)分隔开来,而每个报文中都包含了多行键值对,键值对用冒号分隔,这样的设计是为了让程序可以清晰的区分这些数据。如下图所示:
但如果由于某种原因,键值中间缺少了那个冒号,PHP 函数会将下一对键值合并到了上一行,形成这样的键值对,“键1:值1键2值2”。
PHP中的 multipart_buffer_headers 函数在解析 HTTP 请求中的 multipart 头部数据时,每次解析由 get_line 得到的一行键值对。当被解析的行是以空白字符开始,或者出现一个不包含 > “:” 的行,该行将被当作是上一行键值对的延续来处理,将当前的值拼接到上一个键值对里,这样数据越来越大,越来越长,并且在拼接的过程里,该函数针对这些数据不断执行内存的分配和释放,最终被攻击目标主机的CPU资源被耗尽。
深信服解决方案
1、PHP官方已经针对PHP 5.4 及PHP 5.5版本给出了补丁,请使用这些版本的用户,尽快到官方网站下载并安装补丁,补丁的下载地址如下:
http://php.net/ChangeLog-5.php#5.4.41
http://php.net/ChangeLog-5.php#5.5.25
2、如果购买了深信服下一代防火墙,请升级IPS特征库到20150514以后的版本。