0x00 漏洞概述
CNVD ID | CVE-2020-13942 | 时 间 | 2020-11-19 |
类 型 | RCE | 等 级 | 严重 |
远程利用 | 是 | 影响范围 | Apache Unomi < 1.5.2 |
0x01 漏洞详情
Apache Unomi是一个Java开源客户数据平台,旨在管理客户和访问者的数据,并个性化客户体验。
2020年11月17日,Apache Unomi被披露存在严重安全漏洞(CVE-2020-13942),其CVSS评分为10分。
由于Apache Unomi允许远程攻击者使用包含任意类的MVEL和OGNL表达式发送恶意请求,最终可导致攻击者使用Unomi应用程序权限远程执行代码。
漏洞细节:
Unomi依赖于诸如OGNL或MVEL之类的表达式语言(EL),以允许用户制定复杂而细致的查询。其基于EL的条件来访问存储数据。
在1.5.1之前的版本中,攻击者通过注入可以对Unomi进行RCE的攻击。攻击者能够通过发送单个请求在Unomi服务器上执行任意代码和OS命令。此漏洞CVE ID为CVE-2020-11975,目前虽然已经修复,但修复并不充分,可被轻易绕过。
CVE-2020-11975的补丁中引入了SecureFilteringClassLoader函数,该函数依赖allowlist和blocklist检查表达式中使用的类。SecureFilteringClassLoader依赖这样一个不正确的假设:MVEL和OGNL表达式中的每个类都是使用ClassLoader类的loadClass()方法加载的。SecureFilteringClassLoader覆盖了ClassLoader loadClass方法,并引入了allowlist和blocklist检查。事实上,除了调用loadClass()方法外,还有多种加载类的方法,这会导致安全绕过,并使Unomi遭受RCE攻击。
Unomi 1.5.1中,允许评估条件使用MVEL表达式,该条件包含任意类。在某些情况下,MVEL表达式使用已实例化的类(例如Runtime或System),而无需调用loadClass()。
以下HTTP请求的条件是带有MVEL表达式的参数(script::Runtime r =Runtime.getRuntime(); r.exec(”touch /tmp/POC”);)。Unomi会解析该值,并以MVEL表达式的形式执行script ::之后的代码。以下示例中的表达式会创建一个Runtime对象并运行“ touch”OS命令,该命令会在/tmp目录中创建一个空文件。
除此之外,还有一种方法可以在OGNL表达式中加载类,而无需触发loadClass()调用。以下HTTP请求能够获取运行时并使用Java Reflections API执行OS命令。
以上两种方法能够绕过1.5.1中引入的安全控制。此外,Unomi包含大量数据并与其它系统紧密集成,因此通常是攻击者的理想目标。
0x02 处置建议
目前Apache Unomi已经发布了1.5.2更新版本。建议及时升级。
缓解措施:
尽量避免将数据放入表达式解释器中。
下载链接:
http://unomi.apache.org/download.html
0x03 参考链接
https://securityboulevard.com/2020/11/apache-unomi-cve-2020-13942-rce-vulnerabilities-discovered/?
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-13942
0x04 时间线
2020-11-02 Unomi发布安全更新
2020-11-19 VSRC发布安全通告
0x05 附录
CVSS评分标准官网:http://www.first.org/cvss/