简介

Apache Unomi是什么?
Apache Unomi是一个Java开源客户数据平台,这是一个Java服务器。

Apache Unomi的用途?
Unomi可用于在各种不同的系统(如CMSs, CRMs, Issue Trackers, native mobile applications等)中"整合个性化"(integrate personalization)和"配置文件管理"(profile management)。

Apache Unomi的优点?
Unomi在2019年被宣布为Top-Level Apache product,具有高度的可扩展性,考虑了易用性。

鉴于Unomi包含大量数据并具有与其他系统的紧密集成的特点,使它成为攻击者的理想目标。

发现了1个什么漏洞?
远程攻击者发送带有了OGNL表达式的请求,可导致远程代码执行(RCE),权限就是Unomi应用程序的运行权限。
漏洞编号CVE-2020-11975
Credit: This issue was reported by Yiming Xiang of NSFOCUS.

触发前提:
Apache Unomi < 1.5.1 的版本,无需身份验证,能访问到就能RCE。

漏洞分析

Unomi提供了一个受限的API(应该是指需要授权才能访问),可以"取回"(retrieve)数据、操作数据。
此外还有一个公开的endpoint,应用程序可以在这里上传数据、"取回"(retrieve)用户数据。
Unomi允许发往这些endpoint的HTTP requests中包含复杂的conditions(条件)。

Unomi conditions(条件)依赖于"表达式语言"(expression languages,EL),如OGNL或MVEL,以允许用户构造复杂的、细粒度的查询. 在访问存储中的数据之前,基于EL的conditions被计算/执行。

CVE-2020-11975漏洞原理:
在1.5.1之前的版本中,这些"表达式语言"(expression languages)完全不受限制,所以通过EL注入即可实现RCE。
攻击者通过发送1个请求就可以在Unomi服务器上执行任意代码和OS命令。

修复CVE-2020-11975之前的代码:
https://github.com/apache/unomi/blob/206b646eb5cfa1e341ca7170705721de9b5b9716/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java#L327-L330

public class PropertyConditionEvaluator implements ConditionEvaluator {
 ...
  protected Object getOGNLPropertyValue(Item item, String expression) throws Exception {
        ExpressionAccessor accessor = getPropertyAccessor(item, expression);
        return accessor != null ? accessor.get(getOgnlContext(), item) : null;
    }
 ...

解释一下上面的代码:
PropertyConditionEvaluator类负责conditions(条件)内的OGNL表达式的计算/执行。

当Unomi收到了类似于例1的JSON数据时,Unomi如何处理?
例1 JSON数据

{
  "condition":{
    "parameterValues":{
      "propertyName":"Wubba Lubba",
      "comparisonOperator":"equals",
      "propertyValue":"Dub Dub"
      }
  }
}
  • Unomi处理流程
    • 首先,Unomi尝试根据用户输入的"属性名称"(property name),查找"硬编码的属性"(hardcoded properties)。
    • 如果找不到,则调用getOGNLPropertyValue方法,该方法将用户输入的"属性名称"(property name)作为一条OGNL表达式,计算/执行这个"属性名称"。

在计算/执行OGNL表达式时, ExpressionAccessor使用"默认参数"(default parameters),从而导致了任意OGNL表达式的计算/执行。
例如,"属性名称"(property name)设置为这个OGNL表达式:

(#r=@java.lang.Runtime@getRuntime()).(#r.exec(\"/System/Applications/Calculator.app/Contents/MacOS/Calculator\"))

PoC:
```

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖