Horde Webmail远程代码执行漏洞。
Sonar研究人员在Horde Webmail中发现一个安全漏洞,CVE编号CVE-2022-30287,攻击者利用该漏洞可以在受害者打开攻击者发送的邮件后完全控制Horde实例。未认证的Horde实例用户在服务器上执行任意代码。截至目前,没有官方补丁发布。
漏洞分析
Horde地址簿配置
Horde Webmail 允许用户对联系人进行管理。通过web接口,用户可以添加、删除和检索联系人。管理员可以配置联系人保存的位置,创建多个地址簿,每个有一个不同的后端服务器和协议。
下面是默认地址簿配置文件部分代码,是使用LDAP后端的默认配置:
turba/config/backends.php
$cfgSources[‘personal_ldap’] = array(
// Disabled by default
‘disabled’ => true,
‘title’ => _(“My Address Book”),
‘type’ => ‘LDAP’,
‘params’ => array(
‘server’ => ‘localhost’,
‘tls’ => false,
// …
可以看出,LDAP配置加入到了保存在$cfgSources 数组中的可用地址簿后端。配置本身是含有记录的key-value数组,可以用来配置LDAP 驱动。
CVE-2022-30287:未对factory类进行类型检查
用户在与终端进行联系人相关的交互时,会发送一个字符串用来识别想要使用的地址簿。然后Horde从$cfgSources 数组中取回对应的配置,并管理到地址簿的连接。
该模式的典型使用如下所示:
turba/merge.php
14 require_once __DIR__ . ‘/lib/Application.php’;
15 Horde_Registry::appInit(‘turba’);
16
17 $source = Horde_Util::getFormData(‘source’);
18 // …
19 $mergeInto = Horde_Util::getFormData(‘merge_into’);
20 $driver = $injector->getInstance(‘Turba_Factory_Driver’)->create($source);
21 // …
30 $contact = $driver->getObject($mergeInto);
上述代码表明$source 参数如何接收到传递给Turba_Factory_Driver的create()方法。Turba是Horde地址簿组件的名字。create() 方法代码如下所示:
turba/lib/Factory/Driver.php
51 public function create($name, $name2 = ”, $cfgSources = array())
52 {
53 // …
57 if (is_array($name)) {
58 ksort($name);
59 $key = md5(serialize($name));
60 $srcName = $name2;
61 $srcConfig = $name;
62 } else {
63 $key = $name;
64 $srcName = $name;
65 if (empty($cfgSources[$name])) {
66 throw new Turba_Exception(sprintf(_(“The address book “%s” does not exist.”), $name));
67 }
68 $srcConfig = $cfgSources[$name];
69 }
在第57行,检查了$name 参数的类型。该参数对应之前的$source 参数。如果是一个数组,就直接用做配置来设置$srcConfig变量。如果是字符串,就访问全局 $cfgSources,并取回对应的配置。
因为这里没有类型检查,攻击者可以发送数组作为参数,并提供完全可以控制的配置。后面的代码中, create()方法可以使用攻击者控制的数组中的值动态实例化驱动类:
turba/lib/Factory/Driver.php
75 $class = ‘Turba_Driver_’ . ucfirst(basename($srcConfig[‘type’]));
76 // …
112 $driver = new $class($srcName, $srcConfig[‘params’]);
因此,攻击者可以选择实例化任意地址簿驱动,完全控制传递的参数,比如host、用户名、密码、文件路径。
实例化攻击者可以执行任意代码的驱动
然后,攻击者可以注入驱动配置使得其可以在要攻击的Horde实例上执行任意代码。
研究人员发现Horde支持连接到IMSP服务器。连接到IMSP服务器时,Horde会提取不同的记录。部分记录会被翻译为PHP序列化对象,然后反序列化。
以下代码是IMSP 驱动类的_read()方法,表明会检查__members 记录的存在性。如果存在,就反序列化:
turba/lib/Driver/Imsp.php
223 if (!empty($temp[‘__members’])) {
224 $tmembers = @unserialize($temp[‘__members’]);225 }
由于存在PHP对象注入,攻击者可以迫使Horde反序列化恶意对象,引发任意代码执行。
通过CSRF实现漏洞利用
默认情况下,Horde 会拦截HTML邮件中的图像。攻击者可以使用HTML标签
<picture>
<source media=”(min-width:100px)” >
<img src=”blocked.jpg” alt=”Exploit image” style=”width:auto;”>
</picture>
漏洞时间轴
研究人员在2022年2月2日将该漏洞报告给厂商,5月3日,90天的漏洞修复期已过,但官方仍未发布补丁。
参考及来源:https://blog.sonarsource.com/horde-webmail-rce-via-email/
原文始发于微信公众号(嘶吼专业版):Horde Webmail远程代码执行漏洞