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/如若转载,请注明原文地址