作者Editor

Roundcube 1.2.2:通过邮件执行命令

发布于:2016-12-13 17:01:59 阅读:449 回帖:0



Roundcube 是一款广泛使用的开源的 webmail 软件,全世界有很多组织和公司都在使用。举个例子,过去 12 个月,它在 SourceForge 上的镜像文件的下载次数超过 260,000,但是这不过是实际用户量的一小部分。把 Roundcube 安装在服务器上之后,它就可以提供一个网页给用户,用户使用浏览器进行登录认证并收发邮件。

在这篇文章里,我们看看一个攻击者如何,仅仅只是在 Roundcube1.2.2(>=1.0) 写一封邮件,就能远程在底层操作系统上执行任意指令。这个漏洞是高危的,因为所有默认安装都受影响。我们强烈要求所有 Roundcube 的管理员尽快升级软件到 1.2.3 版本。

RIPS 分析


译者注:RIPS 是一款自动化静态分析 PHP 代码的工具。


RIPS 花了 25 秒的时间完整分析了整个应用,并且检测出了上图所示的安全漏洞。虽然看起来问题挺多的,但是大部分都不是很严重,因为它们属于安装模块或者已弃用的代码。不过,我们建议还是要移除掉这些弃用的代码来修复这些漏洞,以免后患。

删减后的分析结果可以在我们的 RIPS  demo 应用里看到。注意一点,为了确保漏洞可以修复,我们将结果限制在本文提及的问题上。

要求


利用这个漏洞有以下几个条件。


1、  Roundcube 必须是配置成使用 PHP 的mail() 函数的(默认配置,如果没有指定 SMTP)。


2、  PHP的mail() 函数配置使用 sendmail(默认配置,查看 sendmail_path)。


3、  PHP 配置里的 safe_mode 是关闭的(默认配置,查看 safe_mode)。


4、  攻击者必须知道或者猜出 webroot 的绝对路径。


这些条件都不是很特别的要求,意味着现在在自然环境里有大量的存在漏洞的系统。

描述


在 Roundcube1.2.2 或者更早的版本里,用户的输入未经过滤就被传到了 PHP 内建函数 mail() 的第五个参数,这已被证明是有很高安全风险的。问题出在 mail() 函数的调用会导致 PHP 执行 sendmail 程序。第五个参数可以传入一些额外的执行参数,更改 sendmail 的配置。因为sendmail 提供了-X选项将邮件通信记录到一个文件,攻击者可以利用此参数在服务器的 webroot下创建一个恶意 PHP 文件。虽然这个漏洞很罕见,极少人知,但是 RIPS 还是很快检测出来了。以下代码引发了漏洞。

program/steps/mail/sendmail.inc

代码:


这里,获取 POST 参数 _from 的值,然后传入到Roundcube 的 deliver_message() 中作为第二个参数使用。

program/lib/Roundcube/rcube.php

代码:


然后这个函数将 $from 参数传到调用的 mail() 函数中。意思是将定制的 from header 通过 -f 选项传递给 sendmail 程序。

过滤不够安全


一个有趣的地方在于,似乎 from 电子邮件地址已被一个正则表达式预先过滤过了。最基本,首先要确保 $from 参数中没有空格,来减少利用 -f后面的参数进行攻击的可能性。在这里使用空格常数如 $IFS 或者新的 shell 命令 ` 都不成功。然而,应用中有一个逻辑缺陷导致这个过滤失效了。

program/steps/mail/sendmail.inc

代码:


在 105 行,从用户控制的 $from 参数里提取出一封无空格的邮件。不过,提取只有当rcmail_email_input_format() 返回的值相当于TRUE 时才会进行。接下来,我们分析一下这个函数。

program/steps/mail/sendmail.inc

代码:


在 863 行,这个函数使用了另一个正则表达式,要求这一行在邮件匹配后面必须有个 ($)。攻击者使用的 payload 当然可以不需要满足这个条件,因此在 foreach 循环后,$result 数组会保持空白。在这种情况下,876 行的 implode() 函数返回一个空字符串(等价于 FALSE),然后 $from的值就不会被过滤和改变了。

概念的实证


当使用 Roundcube 发送邮件时,HTTP 请求是可以被截断和更改的。这个地方,我们修改_from 参数来在文件系统上创建一个恶意文件。

代码:


这将允许攻击者在 web 根目录创建一个可执行文件 rce.php,内容是 _subject 参数的值,可以包含 PHP 代码。执行完请求之后,包含以下内容的文件就会被创建。


代码:


因为邮件数据没有被编码,subject 参数会被直接保存成明文。这将允许在可执行文件中注入PHP 标签。

时间线


日期         事件


2016/11/21  首次联系供应商
2016/11/22  供应商在 Github 上修复漏洞
2016/11/28  供应商同意协调披露
2016/11/28  供应商发布 Roundcube1.2.3

总结


Roundcube 抵抗着来自很多方向的攻击,有一个大社区持续维护着它的安全。然而,此文描述的漏洞可以溜进来,由于稀有,这也是一种边缘情况。在自动检测工具的帮助下,我们不仅可以检测到此边缘情况,还节省了大量人力资源,从而可以在安全网络应用的开发过程中专注于不同方面。

我们十分感谢 Roundcube 团队仅用了一天时间就修复了漏洞,而且一周后就发行了新版本!他们对安全问题的回应非常令人印象深刻,也非常专业。 



返回