★且听安全★-点关注,不迷路!
★漏洞空间站★-优质漏洞资源和小伙伴聚集地!
接上文:
CVE-2022-31626 PHP远程命令执行漏洞成因分析与复现
XCyber,公众号:且听安全CVE-2022-31626 PHP远程命令执行漏洞成因分析与复现
PHP 同时还通报了另一个高危漏洞信息,编号为 CVE-2022-31625:
在 `PHP_FUNCTION` 中分配在堆上的 `char*` 数组没有被清除,如果发生转换错误,将会调用 `_php_pgsql_free_params` 函数,由于数组没有初始化,导致可以释放之前请求的值,导致远程代码执行。漏洞影响版本:
-
5.3.0 <= PHP 5.x <= 5.6.40
-
7.0.1 <= PHP 7.x < 7.4.30
-
8.0.0 <= PHP 8.0.x < 8.0.20
-
8.1.0 <= PHP 8.1.x < 8.1.7
在 `PHP_FUNCTION` 中,利用 `safe_emalloc` 申请指针数组 `params` ,但是没有进行初始化,导致 `params` 数组中包含有内存中残留的数据或指针。如果发生异常,代码会执行 `_php_pgsql_free_params` 函数对整个指针数组进行释放:
在 `_php_pgsql_free_params` 函数中,根据数组中元素的总数量 `num_params` 逐个释放非 0 的指针,但是这个指针可能尚未被未初始化,因此导致非预期的内存释放:
这是典型的内存未初始化漏洞,如果攻击者能够控制未初始化的内存内容,可以实现任意内存释放,进而实现释放后再引用 UAF ,最终实现远程代码执行。在最新的 PHP 版本中,已经对该漏洞进行修复,将原来的总数 `num_params` 改为了当前计数值 `i` ,以此来保证所有释放的指针都是初始化过的:
修改 `php.ini`,启用 `pgsql` 扩展:
extension=pgsql
postgres 数据库安装:
sudo apt install postgresql postgresql-contrib
sudo /etc/init.d/postgresql start
postgres 配置密码并允许网络访问。重启服务:
sudo /etc/init.d/postgresql restart
sudo /etc/init.d/postgresql status
利用 POC ( `test.php` )触发漏洞,可以看到 `efree` 释放了一个错误地址导致进程崩溃:
php.exe -f test.php
该内存未初始化漏洞,容易转化成 UAF 漏洞,利用难度比 CVE-2022-31626 要简单。通过远程堆风水极有可能实现任意内存释放,进而通过 UAF 实现远程代码执行。受影响客户需要尽快做好补丁升级和防护。
目前官方已发布修复版本,用户可升级至以下安全版本:
-
PHP 8.1.7
-
PHP 8.0.20
-
PHP 7.4.30
有兴趣学习交流漏洞知识的小伙伴,请加入我们的漏洞空间站-致力于打造优质漏洞资源和小伙伴聚集地!
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
★且听安全★-点关注,不迷路!
★漏洞空间站★-优质漏洞资源和小伙伴聚集地!
原文始发于微信公众号(且听安全):CVE-2022-31625 PHP内存未初始化导致RCE漏洞成因分析和复现