CVE-2022-22954 VMware Workspace ONE Access SSTI RCE 漏洞分析

 

前言

4月6日和5月18日,VMware官方发布的两则安全公告中显示,关乎旗下产品的CVE漏洞多达10个,其中不乏有CVSSv3评分9.8的高危漏洞!如此高频的出洞速率,吸引了笔者注意。继上篇CVE-2022-22972 VMware Workspace ONE Access 身份认证绕过漏洞分析之后,笔者将对CVE-2022-22954 VMware Workspace ONE Access SSTI RCE 漏洞进行细致分析。

 

漏洞描述

根据4月6日VMware官方发布的安全公告,官方已更新解决了多个产品的安全问题。其中CVE-2022-22954,CVSS评分为9.8,危害等级为严重。该漏洞是由于VMware Workspace ONE Access and Identity Manager 包含一个服务器端模板注入漏洞,导致具有网络访问权限的恶意攻击者可进行远程代码执行。

 

利用范围

  1. VMware Workspace ONE Access 21.08.0.1, 21.08.0.0,20.10.0.1, 20.10.0.0
  2. VMware Identity Manager(vIDM) 3.3.6, 3.3.5, 3.3.4, 3.3.3
  3. VMware vRealize Automation(vIDM) 7.6
  4. VMware Cloud Foundation (vIDM) 4.x

 

漏洞分析

根据freemarker官网文档(https://freemarker.apache.org/docs/ref_builtins_expert.html#ref_builtin_eval)中给出了安全问题的提示。

使用内置函数将字符串计算为 FTL 表达式,FTL 表达式可以访问变量,并调用 Java 方法,例如 “1+2”?eval将返回数字 3,所以?eval前的字符串因来自不受信任的来源,可能就会成为攻击媒介。

在Vmware中的endusercatalog-ui-1.0-SNAPSHOT-classes.jar自带的模板customError.ftl就调用了freemarker引擎的eval函数来渲染errObj,这就导致了本次SSTI注入漏洞。

环境搭建

可参考CVE-2022-22972 VMware Workspace ONE Access 身份认证绕过漏洞分析

本次漏洞分析源码所在位置:/opt/vmware/horizon/workspace/webapps/catalog-portal/WEB-INF/lib。

动态调式

已经定位到安全问题所在,接下来寻找渲染customError.ftl模板的相关代码。

在com.vmware.endusercatalog.ui.web.UiErrorController#handleGenericError函数中。

errorObj由参数传入。

查找handleGenericError函数的被调用关系发现。

handleGenericError函数受如上图所示的两个requestMapping所在的控制器UiErrorController调用。

跟进其中出现的getErrorPage函数,位于com.vmware.endusercatalog.ui.web.UiErrorController#getErrorPage。

除了直接用handleGenericError函数拿到需要渲染的模板,还存在handleUnauthorizedError函数通过条件判断,只有一个分支进入handleGenericError

如何构造参数?

在两个requestMapping中,其中的/ui/view/error为API接口,直接访问无法从请求中提取javax.servlet.error.message,从而无法控制errorObj。

寻找/ui/view/error的其他调用,位于com.vmware.endusercatalog.ui.web.UiApplicationExceptionResolver#resolveException函数。

存在对javax.servlet.error.message赋值的过程。

查看resolveException函数的被调用关系,受上方handleAnyGenericException函数调用。

其中@ExceptionHandler表明,该处为异常处理器,当程序直接抛出Exception类型的异常时会进入handleAnyGenericException,再通过调用resolveException函数,进行赋值,最终都会返回/ui/view/error。

而在 handleAnyGenericException 中,进入 resolveException 时会根据异常的类型传入不同的参数,如果异常类不是 LocalizationParamValueException 子类的话则传入 uiRequest.getRequestId(),所以我们需要构造参数可控的地方还需要抛出 LocalizationParamValueException 异常类或其子类异常,这样errorObj所需Attribute errorJson来自LocalizationParamValueException异常的getArgs。

在LocalizationParamValueException函数,如果可以控制抛出异常的参数,就可以把payload传入errorObj。

在endusercatalog-auth-1.0-SNAPSHOT.jar中com.vmware.endusercatalog.auth.InvalidAuthContextException,存在一个InvalidAuthContextException异常,继承于LocalizationParamValueException。

在com.vmware.endusercatalog.auth.AuthContext构造函数中抛出异常。

生成 AuthContext对象的地方在AuthContextPopulationInterceptor 拦截器中,而且各项参数均是从请求中获取,这里可构造注入点。

但正常情况下,在 endusercatalog-auth-1.0-SNAPSHOT.jar 中的拦截器类无法访问到类。

但在com.vmware.endusercatalog.ui.UiApplication,使用 @ComponentScan 注解声明自动将com.vmware.endusercatalog.auth包的类装配进bean容器。

在包中com.endusercatalog.ui.config.WebConfig可查找到。

可进行构造的url。

通过如上分析,可构造payload,进行命令执行。

漏洞复现

 

修复建议

参考漏洞影响范围进行排查,目前官方已发布修复补丁:

https://kb.vmware.com/s/article/88099

 

参考材料

1.https://www.vmware.com/security/advisories/VMSA-2022-0011.html

2.https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=vmware

3.https://mp.weixin.qq.com/s/X_E0zWONLVUQcgP6nZ78Mw?scene=21#wechat_redirect

4.https://mp.weixin.qq.com/s/zVYQQgDjcwJKAnX8SZJ5Cw

 

关于Portal Lab

星阑科技 Portal Lab 致力于前沿安全技术研究及能力工具化。主要研究方向为API 安全、应用安全、攻防对抗等领域。实验室成员研究成果曾发表于BlackHat、HITB、BlueHat、KCon、XCon等国内外知名安全会议,并多次发布开源安全工具。未来,Portal Lab将继续以开放创新的态度积极投入各类安全技术研究,持续为安全社区及企业级客户提供高质量技术输出。

想了解更多消息,欢迎关注“星阑科技”微信公众号;

了解技术干货,欢迎关注“星阑PortalLab”微信公众号。

(完)