ZendFramework(ZF)是Zend公司推出的一套PHP开发框架。它是一个开源框架,用于使用PHP5开发Web应用程序和服务。ZF采用100%面向对象的编码实现。ZF的组件结构独特,每个组件对其他组件几乎没有依赖性。这种松散耦合的结构允许开发人员独立使用组件。我们通常将此称为“随意使用”设计。Zend类是整个ZendFramework的基类。之所以要这个类,是为了让ZendFramework遵循DRY原则(Don'tRepeatYourself)。此类仅包含静态方法,这些类方法具有ZendFramework中许多组件所需的功能。这不是ZendFramework第一次出现漏洞。早在2012年,WooYun就暴露了ZendFramework(ZF)框架中XMLRPC模块中的xxe(XML外部实体)注入漏洞。攻击者可以利用它来读取任意文件,包括密码文件和PHP源代码。当时已有200多个网站存在该漏洞,知名开源建站平台Magento等采用ZF框架的建站系统也受此漏洞影响。本周bleepingcomputer披露了一个不受信任的反序列化漏洞,允许攻击者利用ZendFramework在PHP站点上实现远程代码执行。该漏洞目前命名为CVE-2021-3007,该漏洞还可能影响Zend的替代项目Laminas。一年前,Linux基金会联合ZendTechnologies和RogueWaveSoftware宣布Zend框架正在过渡到LinuxFoundation,并在新的治理框架下更名为LaminasProject。ZendFramework由超过5.7亿个PHP软件包安装组成,开发人员使用ZendFramework构建面向对象的Web应用程序。从不受信任的反序列化到RCE本周,安全研究员LingYizhou揭示了ZendFramework3.0.0中的特定小工具链如何在不受信任的反序列化攻击中被滥用。如果此漏洞被利用,远程攻击者可以在某些情况下对易受攻击的PHP应用程序执行远程代码执行(RCE)攻击。ZendFramework3.0.0存在反序列化漏洞,在内容可控的情况下可能导致远程代码执行,与Stream中Zend\Http\Response\Stream类的__destruct方法有关。虽然实际不受信任的反序列化必须来自易受攻击的应用程序,并且ZendFramework本身并不存在,但Zend提供的类链可能会帮助攻击者实现RCE。当应用程序从用户或系统接收到的编码数据在应用程序对其进行解码之前未正确验证时,应用程序中就会出现不受信任的反序列化漏洞。易受攻击的应用程序可以反序列化和处理收到的格式错误的数据,这可能导致从应用程序崩溃(拒绝服务)到攻击者能够在应用程序上下文中运行任意命令的一切。在Zend的示例中,漏洞源于Stream类的析构函数,这是一个PHP魔术方法。在面向对象编程中,构造函数和析构函数是分别在创建和销毁新类对象时调用的方法。例如,在这种情况下,新创建的Stream对象将通过构造函数在其概念中运行一系列命令。一旦一个对象在整个程序执行流程中完成了它的目的,PHP解释器最终将调用该对象的析构函数并遵循另一组命令来释放内存、执行清理任务并删除任何临时文件,这是一个很好的方法。一舟指出,Stream的析构函数调用的unlink()方法删除文件需要文件名作为参数,文件名是字符串数据类型。ZendFramework和Laminas项目中的漏洞破坏者事实上,如果streamName对象是非字符串类型,它仍然会在应用程序执行结束时传递给析构函数。因此,只需要一个字符串值的析构函数将尝试调用对象的__toString方法来获取等效的字符串。但是,对象的创建者或实例化对象的类的创建者可以轻松地自定义__toString方法。例如,Yizhou强调,ZendFramework的Gravatar类中的__toString方法是由其程序员编写的,最终返回一个攻击者可以直接控制执行任意代码的值。这意味着如果将Stream类传递给需要streamName的Gravator对象,在某些情况下,攻击者可以在使用Zend构建的易受攻击的PHP应用程序中运行任意命令。研究人员演示了至少2个可以将序列化对象传递给Zend的场景,当PHP应用程序对其进行解析时,它将在呈现的网页上呈现攻击者命令的输出。在概念验证(PoC)漏洞利用中,研究人员演示了Web应用程序的phpinfo页面如何通过序列化HTTP请求成功解析他的系统命令“whoami”并返回Windows帐户名称“ntauthority\system”。研究人员在演示对讲机上成功运行“whoami”命令,获得输出“ntauthoritysystem”使用Laminas构建的应用程序也可能受到影响2020年1月,Zend框架迁移到Laminas项目,大量代码是迁移到新的代码库。比如Zend的Stream.php类,上面的析构函数在某些版本的Laminas中仍然存在。代码可能与Laminas项目Laminas-http有关。维护者不再支持ZendFramework。然而,并非所有ZendFramework3.0.0漏洞都存在于Laminas项目版本中。虽然这并不一定表明使用Laminas项目构建的所有应用程序都容易受到攻击,但建议开发人员采取必要的预防措施。考虑到PHP能够在某种程度上控制大约80%的Internet站点,并考虑到ZendFramework的流行,建议开发人员彻底检查他们的Web应用程序是否存在不受信任的对象反序列化。本周在Yii框架中发现了一个类似的小工具链,攻击者可以使用它来攻击易受攻击的应用程序。对应用程序执行彻底的安全审计是不时发现零日漏洞和环境特定漏洞的一种方法。本文翻译自:https://www.bleepingcomputer.com/news/security/zend-framework-remote-code-execution-vulnerability-revealed/
