于我

【漏洞分析】VMware Workspace ONE Access CVE-2022-22954模板注入命令执行漏洞

2022/5/23
漏洞介绍

Vmware Workspace One Access是美国Vmware公司的将用户身份与设备和网络信息等因素结合起来,为 Workspace One 交付的应用程序制定智能驱动的条件访问决策。

VMware 多款产品存在代码注入漏洞,该漏洞源于不正确的输入验证。远程攻击者利用该漏洞发送特制的HTTP请求并执行服务器端模板注入。

影响版本

1. VMware Workspace ONE Access Appliance (版本号:20.10.0.0 ,20.10.0.1 ,21.08.0.0 ,21.08.0.1 )

2. VMware Identity Manager Appliance (版本号:3.3.3 , 3.3.4 , 3.3.5 ,3.3.6)

3. VMware Realize Automation (版本号:7.6)

模板介绍

模板引擎是为了解决用户界面(显示)与业务数据(内容)分离而产生的。他可以生成特定格式的文档,常用的如格式如HTML、xml以及其他格式的文本格式。其工作模式如下:

java中常见的模板引擎有:

jsp:是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。

Thymeleaf : 主要渲染xml,HTML,HTML5而且与springboot整合。

Velocity:不仅可以用于界面展示(HTML.xml等)还可以生成输入java代码,SQL语句等文本格式。

FreeMarker:功能与Velocity差不多,但是语法更加强大,使用方便。

漏洞环境搭建

去官网下载VMware Workspace ONE Access ova文件并在vmware workstation中安装,注意安装过程中需要给虚拟机添加域名(HOST Name),不然后续创建数据库时会报错。

安装过程可以参考

https://mp.weixin.qq.com/s/g5YipzZf7hk6BTmtQAnfIw

漏洞分析

这个漏洞的触发点是在catalog-portal\WEB-INF\lib\endusercatalog-ui-1.0-SNAPSHOT-classes.jar!\templates\customError.ftl:61中,模板中使用eval表达式处理errorObj参数,将参数当成ftl代码执行。

freemarker官网对eval表达式的解释:

https://freemarker.apache.org/docs/ref_builtins_expert.html#ref_builtin_eval

接着查看什么地方会渲染这个模板,在jar包中搜索customError,发现只有com.vmware.endusercatalog.ui.web.UiErrorController#handleGenericError会渲染这个模板。

errorObj对应的errorMessage是外传参数,接着查看函数调用(idea快捷键Ctrl+Alt+H):

只有两个函数调用了handleGenericError,sendError函数对应的映射为/ui/view/error,sendUnhandledError对应的映射是/error:

两个函数中的errorMessage参数都需要通过request.getAttribute("javax.servlet.error.message")获取,全局搜索javax.servlet.error.message,找到什么地方会设置该参数,发现只有com.vmware.endusercatalog.ui.web.UiApplicationExceptionResolver#resolveException返回了/ui/view/error映射并且对javax.servlet.error.message进行了赋值。

查看该函数调用:

handleAnyGenericException和handleHttpMediaTypeNotAcceptableException,

handleHttpMediaTypeNotAcceptableException函数中的uiRequest.getRequestId()参数对应的是errorMessage参数,uiRequest.getRequestId()不可控,所以这里重点看handleAnyGenericException函数,函数中共有三次调用,第一次和第三次errorMessage对应的都是不可控的,所以重点看第二次调用

通过函数上面的@ExceptionHandler({Exception.class})注解得知,这是一个异常处理类,当程序直接抛出Exception类型的异常时会进入handleAnyGenericException。此时简单的漏洞的执行逻辑如下:

此时,我们只需要使程序抛出Exception异常,并且((LocalizationParamValueException)ex).getArgs()参数可以被我们控制,就可以触发模板注入,执行任意命令。

接下来查找LocalizationParamValueException类及其子类中,有哪些类是可以外部传参并且可以抛出自身参数的异常的。

经过排查,找到了com.vmware.endusercatalog.auth.interceptor.AuthContextPopulationInterceptor类,该类中的preHandle函数会在处理请求前尝试获取请求中的deviceUdid、deviceType等参数

之后会使用build()函数生成AuthContext对象,

AuthContext类的构造函数如下:

当this.isValidRequest()为true时会抛出InvalidAuthContextException异常,InvalidAuthContextException类是LocalizationParamValueException的子类,所以com.vmware.endusercatalog.auth.interceptor.AuthContextPopulationInterceptor可以满足外部传参并且可以抛出自身参数的异常这个要求,尝试针对以上条件构造请求:

成功执行了命令,返回了cat /etc/passwd命令值。

官方在补丁中删除了存在漏洞的模板文件,从而阻止漏洞触发。

漏洞缓解

官方已经发布了补丁,详情请参考官方网站:

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

上一篇:【漏洞预警】Spring Framework CVE-2022-22965命令执行漏洞
下一篇:【漏洞分析】VMware CVE-2022-22972 身份认证绕过漏洞

开始免费试用灰度产品

申请试用