重大漏洞!PHP multipart/form-data头部解析远程拒绝服务漏洞

"有些人看不懂,简单比喻来说吧:目前刚出的任何安全防护都不会拦,网站类专属漏洞

畸形数据包,2KB随机数据包,2M网速打死各种网站,cdn通挂!"

PHP multipart/form-data头部解析远程拒绝服务漏洞

发布日期:2015-05-18

受影响的软件及系统:

====================

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 - 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 5.4.41

PHP 5.5.25

PHP 5.6.9

综述:

======

PHP 存在一个远程拒绝服务漏洞,攻击者通过发送恶意的HTTP请求,可以导致CPU资源大量占用,造成远程拒绝服务。

此漏洞影响所有PHP 5版本,更低版本可能也受影响,建议尽快升级。

分析:

======

PHP 在处理HTTP请求中的multipart/form-data头部数据时存在一个安全漏洞,导致PHP大量重复分配和拷贝内存的操作,可能造成CPU资源占用100%并持续较长时间,这可能造成远程拒绝服务攻击。

PHP 调用multipart_buffer_headers()函数来解析HTTP请求中的multipart头部数据,每次解析由get_line得到的一行。当被解析的行是以空白字符开始或者不包含":"字符时,该行将被当作是前一头字段的延续来处理。此时,将会分配一个新的缓冲区,将前一头字段的值与当前行拼接起来作为该字段新的值。这个过程包含1次emalloc调用、2次memcpy调用。

若一个头字段是由多行组成,将导致多次调用emalloc与memcpy,并且分配的空间与拷贝的长度将越来越大。

因此,当行的数目足够多时,拷贝的操作将显著的消耗服务器的CPU。实际测试中,包含近一百万行的头字段可以使服务器的CPU保持100%几秒或者数十秒。如果并发多个攻击请求,可能造成更长时间的资源占用。

攻击者可通过发送一个2M左右的包含多行multipart头部数据的HTTP请求来发起攻击,无需认证,也不依赖PHP程序本身的内容。

解决方法:

==========

没有好的临时解决方法,建议进行升级。

厂商状态:

==========

PHP 已经在下列版本中修复此漏洞:

PHP 5.4.41:

http://php.net/downloads.php#v5.4.41

PHP 5.5.25:

http://php.net/downloads.php#v5.5.25

PHP 5.6.9:

http://php.net/downloads.php#v5.6.9

附加信息:

==========

1. http://php.net/ChangeLog-5.php#5.6.9

3.