【漏洞通告】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