PHP本地堆溢出漏洞技术分析与防护方案

绿盟科技安全团队发现www.securityfocus.com 网站对PHP“bcmath.c”多个本地堆溢出漏洞做了更新,其中涉及到的CVE编号分别为:CVE-2016-4537和CVE-2016-4538。

2016年4月24日,NULL-LIFE团队的Fernando向PHP官方提交了PHP“bcmath.c”库中的本地堆溢出漏洞。具体地址如下:

https://bugs.php.net/bug.php?id=72093

2016年4月25日,官方进行了代码修复。具体地址如下:

https://github.com/php/php-src/commit/d650063a0457aec56364e4005a636dc6c401f9cd

2016年8月18日,官方发布了修复漏洞后的最新版本。

2016年9月9日,绿盟科技安全团队发现www.securityfocus.com 网站对PHP“bcmath.c”多个本地堆溢出漏洞做了更新,其中涉及到的CVE编号分别为:CVE-2016-4537和CVE-2016-4538。

CVE-2016-4537漏洞存在于ext/bcmath/bcmath.c库中的bcpowmod函数中,攻击者可以在远程调用该函数的时候故意传入一个负整数参数,从而导致拒绝服务或者其他尚未明确的影响。

CVE-2016-4538漏洞存在于ext/bcmath/bcmath.c库中的bcpowmod函数中,该函数在对特定数据结构做修改的时候未对相应变量进行校验,可以导致攻击者使用精心构造的代码实施拒绝服务攻击或者其他尚未明确的影响。

影响的版本

  • PHP版本 < 5.5.35
  • PHP版本 5.6.x < 5.6.21
  • PHP版本 7.x < 7.0.6

不受影响的版本

  • PHP版本 >= 5.5.35
  • PHP版本 5.6.x >= 5.6.21
  • PHP版本 7.x >= 7.0.6

漏洞分析

漏洞的成因是由于文件ext/bcmath/bcmath.c中的bcpowmod函数在接受参数时没有做准确的参数校验,当向参数scale传入一个负数时,有可能造成拒绝服务或者其他未明确的影响。

造成此漏洞的函数是bcpowmod,其声明如下:

p1

该函数的作用是求幂取模,例如下面代码,功能是对x求y次幂,然后求mod的模。

<?php
$a = bcpowmod($x, $y, $mod);
?>

第4个参数scale是一个可选参数,当前面参数有小数时,用于指定小数点之后要显示的位数。然而当scale传入的是负数时,可能造成堆溢出引发拒绝服务。

下面是该漏洞的验证程序:

<?php
bcpowmod(1, "A", 128, -200);   // 造成堆溢出
bcpowmod(1, 1.2, 1, 1);    // 后续再次调用此函数时,由于堆结构已被破坏,造成程序崩溃
?>

程序崩溃时的调用堆栈如下:

AddressSanitizer: heap-buffer-overflow on address 0xb3805f68 at pc 0x083fd271 bp 0xbf91e4d8 sp 0xbf91e4c8
READ of size 1 at 0xb3805f68 thread T0
#0 0x83fd270 in bc_divide /home/fmunozs/phpgit/php56/ext/bcmath/libbcmath/src/div.c:122
#1 0x83fff96 in bc_raisemod /home/fmunozs/phpgit/php56/ext/bcmath/libbcmath/src/raisemod.c:69
#2 0x83f9923 in zif_bcpowmod /home/fmunozs/phpgit/php56/ext/bcmath/bcmath.c:426
#3 0x9a7c718 in zend_do_fcall_common_helper_SPEC /home/fmunozs/phpgit/php56/Zend/zend_vm_execute.h:558
#4 0x9640316 in execute_ex /home/fmunozs/phpgit/php56/Zend/zend_vm_execute.h:363
#5 0x9a6c9c8 in zend_execute /home/fmunozs/phpgit/php56/Zend/zend_vm_execute.h:388
#6 0x9470b59 in zend_execute_scripts /home/fmunozs/phpgit/php56/Zend/zend.c:1341
#7 0x91acc6b in php_execute_script /home/fmunozs/phpgit/php56/main/main.c:2613
#8 0x9a8648a in do_cli /home/fmunozs/phpgit/php56/sapi/cli/php_cli.c:994
#9 0x808a502 in main /home/fmunozs/phpgit/php56/sapi/cli/php_cli.c:1378
#10 0xb6dbe645 in __libc_start_main (/lib/i386-linux-gnu/libc.so.6+0x18645)
#11 0x808aaba  (/home/fmunozs/phpgit/php56/sapi/cli/php+0x808aaba)

AddressSanitizer: heap-buffer-overflow /home/fmunozs/phpgit/php56/ext/bcmath/libbcmath/src/div.c:122 bc_divide
Shadow bytes around the buggy address:
  0x36700b90: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
  0x36700ba0: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
  0x36700bb0: fa fa fd fa fa fa 00 00 fa fa fd fa fa fa fd fa
  0x36700bc0: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
  0x36700bd0: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
=>0x36700be0: fa fa fd fa fa fa fd fa fa fa fd fa fa[fa]fd fa
  0x36700bf0: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
  0x36700c00: fa fa 01 fa fa fa 01 fa fa fa 01 fa fa fa 00 06
  0x36700c10: fa fa 00 03 fa fa 00 05 fa fa 00 06 fa fa 00 07
  0x36700c20: fa fa 00 00 fa fa 00 07 fa fa 00 00 fa fa 00 05
  0x36700c30: fa fa 00 07 fa fa 00 07 fa fa 00 00 fa fa 00 00

PHP官方对此漏洞的修复如下,在ext/bcmath/bcmath.c文件中引入了一个新的校验函数split_bc_num,并在bcpowmod函数中通过split_bc_num加强了对scale参数的校验。

p2

防护方案

  • PHP已经发布了新版本修复了此漏洞,建议用户升级PHP到最新版本。官方下载地址如下:https://php.net/downloads
  • 使用绿盟科技的远程评估系统(RSAS)对系统进行安全评估。
  • 短期服务:绿盟科技工程师现场处理。确保第一时间消除网络内相关风险点,控制事件影响范围,提供事件分析报告。
  • 中期服务:提供 3-6个月的风险监控与巡检服务。根除风险,确保事件不复发。
  • 长期服务:基于行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)。

 

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

关于绿盟科技

北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。

基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。

北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。

如果您需要了解更多内容,可以
加入QQ群:486207500、570982169
直接询问:010-68438880-8669

Spread the word. Share this post!

Meet The Author

Leave Comment