Horde Webmail远程代码执行漏洞 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

Horde Webmail远程代码执行漏洞

ang010ela 漏洞 2022-06-06 11:50:00
收藏

导语:​Horde Webmail远程代码执行漏洞。

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 >绕过此限制。< source >标记允许开发人员指定多个图像源,这些图像源根据访问网站的用户的尺寸加载。以下示例绕过了对外部图像的阻止:

< picture >
  < source media="(min-width:100px)" srcset="../../?EXPLOIT" >
  < 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/如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论