PHPUnit RCE漏洞的复活

一旦发布了软件补丁,我们倾向于认为这意味着“问题已解决”。但是,在大多数情况下,实际上并非如此。要完全解决问题,所有开发人员都必须获取最新的修补程序版本并将其部署在他们的环境中。由于升级并不是一项特别琐碎的操作,因此开发人员需要提前计划并通过开发流程插入更改,并安排适当的时间进行部署。在下面将要描述的情况下,您会发现有时甚至还不够。

作为在Imperva进行的研究的一部分,我们观察到大约900万次攻击尝试利用CVE-2017-9841漏洞。作为2019年最可利用的CVE之一,我们想知道为什么这个旧漏洞已被复活,以及为什么它在攻击者中如此流行。

每年的攻击尝试:

  • 2019 –过去六个月中约700万
  • 2020年-直到一月为止大约200万
Figure 1: Attack Attempts By Month# of attacks2019-072019-082019-092019-102019-112019-122020-010200k400k600k800k1 000k1 200k1 400k1 600k1 800k2 000k2 200k2 400k2 600k2 800k3 000k3 200k3 400k3 600k

我们看到大约70%的攻击发生在2019年的最后两个月至一月之间。

CVE-2017-9841的范围

要了解有关此特定CVE的炒作,我们需要了解该漏洞,并查看其实质,如何利用该漏洞以及如何对其进行修复。在本文中,我们将介绍所有这些方面。

2017年6月27日,PHPUnit(一种广泛用于PHP的测试框架)中披露了一个远程执行代码漏洞(CVE-2017-9841),该漏洞用于在应用程序开发周期中执行单元测试。不幸的是,许多开发过程不是最佳的,并且该框架在生产中一直处于启用状态,这使攻击者的生活变得轻松而轻松。

由于各种流行的CMS(内容管理系统)(例如WordPress,Drupal和Prestashop)以及第三方开发的许多模块都使用了此方法,因此此安全漏洞的范围可能非常广泛。

例如,以下是部署到生产环境的几个已知模块–包括PHPUnit框架:

  • Prestashop :(自动升级,pscartabandonmentpro,ps_facetedsearch,游戏化,ps_checkout)
  • WordPress:(Jekyll Exporter插件,Dzs-videogallery,cloudflare,MediaWiki,Moodle)
  • Drupal:(Mailchimp / Mailchimp商业– Drupal发布了一项公共服务公告(PSA-2019-09-04))

为了清楚起见,即使您本身对“ PHPUnit”进行了修补,使用依赖于旧版本的框架时,您仍然容易受到攻击。

研究

我们研究的第一步是在媒体中搜索该CVE。
我们在2019年12月中旬在技术社区论坛上看到了发布的帖子,这些帖子来自用户抱怨可能注入PHPUnit文件夹下的可疑文件。

此外,2020年1月7日,PrestaShop(用PHP编写的电子商务解决方案)发布了一个安全公告,内容涉及名为XsamXadoo Bot的恶意软件正在利用的PHPUnit漏洞,该漏洞可用于获取对PHP服务器的访问权并获取控制权–自1月2日以来,他们就看到了恶意软件活动。

然后,我们回到数据中来分析针对我们用户的PHPUnit攻击,发现Prestashop的发布仅涵盖了冰山一角-有多个活动试图利用此漏洞。在图2中,我们可以看到在过去三个月中至少有十个广告系列。尽管XsamXadoo是其中之一,但它绝对不是最大的。

在查看广告系列之前,重要的是要明确定义它们。
战役是一种攻击尝试,它使用相同的有效负载,并且被多个IP用于定位多个站点。

图2:PHPUnit活动统计

广告活动名称 请求数 攻击IP数 网站数量 每天最大攻击
sssp.php 27,245,829 222 1,063 8,192,880
特拉伯 12,523,261 217 1,270 4,475,629
h0d3_g4nt3ng 5,896,870 105 26,872 433,069
Raiz0WorM 1,367,678 191 18,318 87,455
RCE_VULN 1,762 13 3,058 105,131
kill.php 164,281 47 13,018 54,332
探测 137,138 159 9,594 7,831
0x666 60,865 52 2,630 7,991
XsamXadoo_Bot 8,836 6 450 2,997
其他运动 246,230 974 9,195 10,743

从上面的详细信息中,我们可以看到排名最高的两个活动是sssp.php和traber,每天最多分别发生800万和400万次攻击。

在图3中,我们可以看到广告系列的攻击如何按百分比划分:

Figure 3: PHPUnit Campaigns’ Attacks0x666h0d3_g4nt3ngkill.phpOther CapaginsprobingRaiz0WorMRCE_VULNsssp.phptrablerXsamXadoo_Bot

现在,让我们来看一下过去三个月中的广告系列:

traberh0d3_g4nt3ngssspRaiz0WorM0x666RCE_VULNFigure 4: PHPUnit Campaign Timelinetraberh0d3_g4nt3ngssspRaiz0WorMkill.phpprobingsikecil.php0x666RCE_VULNXsamXadoo_BotOther Campaigns2019-1…2019-11-102019-11-132019-11-162019-11-192019-11-222019-11-252019-11-282019-12-012019-12-042019-12-072019-12-102019-12-132019-12-162019-12-192019-12-222019-12-252019-12-282019-12-312020-01-032020-01-062020-01-092020-01-122020-01-152020-01-182020-01-212020-01-242020-01-272020-01-302020-02-0201M2M3M4M5M6M7M8M9M

从时间轴上,我们可以了解到许多广告系列长期处于活动状态。此外,我们可以在两个特定的日期(2019年11月21日和2020年1月4日)看到两个领先活动sssp.php和traber的两个高峰。

因此,即使该漏洞已经存在了两年多,黑客仍在通过利用它来尝试运气。Prestashop确定了一个活动,但肯定还有更多活动在等待您易受攻击的服务器掉入他们的网络。

深入了解CVE-2017-9841详细信息

为了了解导致漏洞的根本原因,让我们首先看一下自2016年11月11日起对PHP-Unit eval-stdin.php文件的修复:

CVE 2017 9841深入探讨

要解释什么是PHP://输入PHP://标准输入手段,我们首先需要知道什么是SAPI是。
SAPI代表一种控制“外部世界”与PHP引擎之间交互的机制,代表“ Server API”。
php:// input旨在与基于Web的(远程)SAPI一起使用。
php:// stdin旨在与CLI(本地)SAPI一起使用。

函数的file_get_contents()读取整个文件转换成字符串,然后的eval()执行的字符串。
php:// input是一个只读流,允许您从请求正文中读取原始数据。

因此,原始的PHP代码通过输入流获取文件,然后将其转换为字符串并执行。
这使攻击者可以通过对eval-stdin.php的HTTP请求运行任意代码。
由于文件期望来自STDIN(本地)的输入,因此该更改使传递基于Web的上下文中发送的文件输入的能力消失。

在2019年12月10日,对eval-stdin.php添加了一个附加修复程序,而没有任何CVE指向此安全补丁程序。

评估stdin php

为了解释此更改,我们需要了解PHP_SAPI的含义。
PHP可以作为Web服务器模块,CGI(通用网关接口)应用程序运行,也可以作为CLI脚本从命令行运行。因此,通过将此条件添加到eval-stdin.php文件中,开发人员旨在消除在“ cli”或“ phpdbg”以外的上下文中执行PHP文件的选项。

回想一下,在之前的更改中,开发人员将用法从php:// input更改为php:// stdin。通过仅对“ cli”和“ phpdbg”添加限制,它们缩小了在服务器上运行任意PHP的访问范围。
但是为什么他们要这样做呢?

一种假设是,可以通过stdin传递任意代码来以某种方式利用此代码。攻击者可能会使用CGI绕过stdin限制,因为CGI在服务器上本地运行,因此可以通过STDIN传递参数,即使在应用了上述2016年修复程序之后,该应用程序也仍然容易受到攻击。

这是我们假设新攻击可能看起来像的流程图:

图5:新的PHPUnit攻击流程图

PHPUnit攻击流程图

1月8日,我们看到了几条与PHPUnit漏洞相关的推文,说在PHPUnit版本7.5.19和8.5.1中已经发现了另一个漏洞,尚待发布。PHPUnit维护者确认了此漏洞,并提交了CVE请求。

然而,可疑的是,同一天,eval-stdin.php从PHPUnit存储库中删除,并带有以下注释:“ 不再使用 ”。

但是实际上是这样吗?

实际上,我们怀疑它是由于其潜在的风险而被删除的,如上所述,它是通过本地访问eval-stdin.php提到的。

让我们在一个时间轴中将我们提到的所有事件包装在一起:

CVE 2017 9841网络服务器

事件链的简短时间表:

结论:

发布补丁程序后,旧漏洞就不会消失。它要求开发人员使用易受攻击的框架来执行更新,尽管他可以错误或故意忽略建议,并且永远不要应用补丁。
修补程序被认为是开发周期中令人讨厌,无止境的一步,因为不断发布新的修补程序,因此许多框架和第三方模块没有使用最新的可用代码。
黑客知道这一点,这就是为什么他们仍然会尝试使用旧漏洞(通常会获得巨大成功)来运气。

除了使用旧的PHPUnit漏洞外,还有很多迹象表明PHPUnit中的一个新漏洞尚未发布。如果是这样,则所有包含eval-stdin.php的PHPUnit版本都可能受到影响。

请注意,您可能在不知不觉中使用了第三方使用PHPUnit框架开发的易受攻击的模块,而没有在发布到生产之前将其删除。

你脆弱吗?

  • 检查生产网络服务器上是否存在PHPUnit
  • 如果是这样,并且您的PHPUnit版本在7.5.19和8.5.1之前,则可能在特定服务器配置下容易受到攻击
  • 建议您删除它(尽管在某些观察到的情况下,删除PHPUnit会导致Web服务器的意外行为),但是也可以阻止对/ vendor目录的远程访问,该目录是PHPUtil框架的根路径。

你被感染了吗?

  • 检查PHPUnit路径下的新文件
  • 检查最近更改的核心文件

 

*来自:imperva

*编译:Domino