4月6日和5月18日,VMware官方发布的两则安全公告中显示,关乎旗下产品的CVE漏洞多达10个,其中不乏有CVSSv3评分9.8的高危漏洞!如此高频的出洞速率,吸引了笔者注意。笔者将对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 包含一个服务器端模板注入漏洞,导致具有网络访问权限的恶意攻击者可进行远程代码执行。
VMware Workspace ONE Access 21.08.0.1, 21.08.0.0,20.10.0.1, 20.10.0.0
VMware Identity Manager(vIDM) 3.3.6, 3.3.5, 3.3.4, 3.3.3
VMware vRealize Automation(vIDM) 7.6
VMware Cloud Foundation (vIDM) 4.x
使用内置函数将字符串计算为 FTL 表达式,FTL 表达式可以访问变量,并调用 Java 方法,例如 “1+2”?eval将返回数字 3,所以?eval
前的字符串因来自不受信任的来源,可能就会成为攻击媒介。
在Vmware中的endusercatalog-ui-1.0-SNAPSHOT-classes.jar自带的模板customError.ftl就调用了freemarker引擎的eval函数来渲染errObj,这就导致了本次SSTI注入漏洞。
【一一帮助安全学习,所有资源获取处一一】
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥信息收集80条搜索语法
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析
本次漏洞分析源码所在位置:/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可查找到。