【误差通告】CVE-2021-3007 Zend Framework远程代码执行误差

宣布时间 2021-01-05

0x00 误差概述

CVE  ID

CVE-2021-3007

时  间

2021-01-05

类   型

RCE

等  级

高危

远程使用

是

影响规模

Zend Framework 3.0.0

 

0x01 误差详情

image.png

Zend Framework (ZF)是Zend公司推出的一套使用 PHP 5 来开发 web程序和服务的开源框架。

2021年01月03日 ,Zend Framework 3.0.0被披露一个远程代码执行误差(CVE-2021-3007)。

该误差是不可信的反序列化造成的。当应用程序从用户或系统吸收的序列化数据在被应用程序反序列化之前未获得准确验证时将导致反序列化误差 ,应用程序可能会反序列化和处置惩罚吸收到的名堂不准确的数据 ,这可能会导致应用程序瓦解。乐成使用此误差的攻击者可以在某些情形下对PHP应用程序远程执行代码。该误差与Stream.php中Zend\Http\Response\Stream类的__destruct要领有关。

 

误差细节

该误差来自Stream类的析构函数。在面向工具的编程中 ,结构函数和析构函数是在建设和销毁新的类工具时划分挪用的要领。

好比 ,新建设的 Stream工具将通过结构函数按其看法运行一系列下令 ,一旦工具在整个程序执行事情流程中完成使命 ,PHP诠释程序将最终挪用该工具的析构函数 ,并遵照另一组下令来释放内存、执行整理使命并删除所有暂时文件。

Stream的析构函数挪用unlink()要领来删除文件 ,该要领使用文件名作为string类型的参数。

image.png

而现实上 ,纵然streamName工具为非string类型 ,在应用程序执行竣事时仍会将其转达给析构函数。

因此 ,析构函数将实验挪用该工具的__toString要领 ,以获取其字符串值。

可是 ,__toString要领可以很容易地由工具的建设者自界说 ,或者更确切地说是由工具实例化的类的建设者自界说。

Zend Framework的Gravatar类中的 __toString要领由其程序员编写的 ,其可以返回攻击者可以直接控制的值 ,最终可以远程执行恣意代码。

 

在该误差的PoC中 ,研究职员演示了Web应用程序的phpinfo页面怎样乐成剖析通过序列化HTTP请求转达的系统下令“ whoami” ,并返回Windows帐户名称“ nt Authority \system”。

image.png

 

0x02 处置惩罚建议

现在 ,Zend Framework项目已经迁徙到Laminas项目 ,且Zend Framework不再受到支持 ,建议迁徙至Laminas项目或使用Zend Framework 3.0.0以外的其它版本。

下载链接:

https://framework.zend.com/

 

0x03 参考链接

https://www.bleepingcomputer.com/news/security/zend-framework-remote-code-execution-vulnerability-revealed/

https://github.com/Ling-Yizhou/zendframework3-/blob/main/zend%20framework3%20%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%20rce.md

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3007

 

0x04 时间线

2021-01-03  Ling Yizhou披露误差

2021-01-05  VSRC宣布清静通告

 

0x05 附录

 

CVSS评分标准官网:http://www.first.org/cvss/

image.png