作者:xxhzz@星闌科技PortalLab
原文鏈接:https://mp.weixin.qq.com/s/PDxbQKm7CLRjjlA4d-55kA
前言
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 包含一個服務器端模板注入漏洞,導致具有網絡訪問權限的惡意攻擊者可進行遠程代碼執行。

利用范圍
-
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
漏洞分析
根據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
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/2026/
暫無評論