
CVE-2022-22954 विश्लेषक
Workspace ONE Access (एक सेवा के रूप में कार्यक्षेत्र प्रदान करने का मॉडल) SaaS, वेब और मोबाइल अनुप्रयोगों के लिए बहु-कारक प्रमाणीकरण, एकल साइन-ऑन और सशर्त पहुँच प्रदान करता है। CVE-2022-22954 एक सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) दोष है जो निम्नलिखित उत्पादों में मौजूद है:
VMware Workspace ONE Access Appliance संस्करण 21.08.0.1 की ova फ़ाइल डाउनलोड करें।
VMware Workstation से फ़ाइल खोलें, वर्चुअल मशीन NAT नेटवर्क पर होनी चाहिए।
नेटवर्किंग गुणों में, होस्ट नाम (FQDN) कॉन्फ़िगर करें।

इंस्टॉलेशन पूरा होने के बाद, एप्लिकेशन खाता पासवर्ड, SSH खाता पासवर्ड और डेटाबेस पासवर्ड कॉन्फ़िगर करने के लिए https://{{hostname}}:8443/ पर जाएँ। एप्लिकेशन https://{{hostname}}/ पर चलता है।

sshuser खाते से वर्चुअल मशीन में लॉग इन करें, फिर रूट खाते में स्विच करें। एप्लिकेशन पथ /opt/vmware/horizon/workspace/ पर पाया गया। स्रोत कोड निर्देशिका /opt/vmware/horizon/workspace/webapps में है।

फ़ाइल /opt/vmware/horizon/workspace/bin/setenv.sh की जाँच करें, देखा कि JAVA_OPTS वेरिएबल रिमोट डिबगिंग के लिए कॉन्फ़िगर किया जा सकता है।

JAVA_OPTS में -agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n जोड़ें और सेवा पुनरारंभ करें।
`systemctl restart horizon-workspace.service`
हॉटफ़िक्स फ़ाइल HW-154129-applyWorkaround.py डाउनलोड करें।
चरणों में, एक चरण में templates/customError.ftl फ़ाइल को एप्लिकेशन से हटाना शामिल है।

customError.ftl फ़ाइल में, eval फ़ंक्शन मौजूद है। यदि errorObj मान को नियंत्रित किया जा सके तो यहाँ से Freemarker SSTI दोष का शोषण किया जा सकता है।


क्लास com.vmware.enusercatalog.ui.web.UiErrorController में, फ़ंक्शन handleGenericError errorMessage वेरिएबल के माध्यम से errorObj में मान निर्दिष्ट करता है।

आगे फ़ंक्शन कॉल और errorMessage पैरामीटर का अनुसरण करें।
फ़ंक्शन handleUnauthorizedError

फ़ंक्शन getErrorPage

दो फ़ंक्शन sendError और sendUnhandledError पर, errorMessage का मान विशेषता javax.servlet.error.message से लिया जाता है।


क्लास com.vmware.endusercatalog.ui.web.UiApplicationExceptionResolver में, विशेषता javax.servlet.error.message का मान फ़ंक्शन resolverExeption में निर्दिष्ट किया जाता है।

फ़ंक्शन handleAnyGenericExeption को @ExeptionHandler एनोटेशन से चिह्नित किया गया है।

क्लास com.vmware.endusercatalog.ui.UiApplication में, @CommponentScan से चिह्नित पैकेजों में com.vmware.endusercatalog.auth शामिल है।

=> इस पैकेज के अपवादों को handleAnyGenericExeption फ़ंक्शन द्वारा पकड़ा जा सकता है।
com.vmware.endusercatalog.ui.config में, इंटरसेप्टर AuthContextPopilationInterceptor को निम्नलिखित पथों के साथ जोड़ा गया है: /ui, /hub-ui, /hub-ui/byob, /logout, /ui/oauth/verify


क्लास com.vmware.endusercatalog.auth.interceptor.AuthContextPopulationInterceptor पर रीडायरेक्ट करें, फ़ंक्शन preHandle में, एप्लिकेशन दो पैरामीटर deviceUdid और deviceType प्राप्त करता है और फ़ंक्शन authContextBuilder को कॉल करता है।

क्लास com.vmware.endusercatalog.auth.interceptor.AuthContext में, अपवाद InvalidAuthContextException तब उत्पन्न होगा जब शर्त this.isValidRequest संतुष्ट नहीं होती है।


isValidRequest को संतुष्ट करने के लिए, दो पैरामीटर this.deviceId और this.deviceType को एक साथ खाली या एक साथ मान वाला होना चाहिए।

=> केवल एक पैरामीटर के लिए मान पास करने पर यहाँ त्रुटि उत्पन्न होगी।

अनुरोध भेजें
GET /catalog-portal/ui/oauth/verify?deviceUdid=111
त्रुटि उत्पन्न होती है
An unexpected error occurred while processing request with requestId: {0}.
फ़ंक्शन com.vmware.endusercatalog.ui.web.WorkspaceOauth2CodeVerificationController पर वापस जाएँ, देखा कि उपरोक्त त्रुटि आवश्यक पैरामीटर error की कमी के कारण उत्पन्न हुई।
@GetMapping(
value = {"/ui/oauth/verify"},
params = {"error"}
)
@ApiOperation(
value = "authorizeError",
notes = ""
)
public void authorizeError(@ApiParam @RequestParam String error, @ApiParam @RequestParam(name = "error_description") String errorDescription, @ApiParam @RequestParam(defaultValue = "/admin/") String state) {
LOGGER.debug("Failed to obtain authorization code due to {}:{} received for {}", new Object[]{error, errorDescription, state});
throw new AuthorizationCodeFailedRetrievalException(new Object[]{error, state});
}
अनुरोध पुनः भेजें
GET /catalog-portal/ui/oauth/verify?error=&deviceUdid=111abc
deviceUdid का मान प्रतिक्रिया में दिखाई देता है।

Freemarker SSTI दोष उत्पन्न करने वाला पैरामीटर जोड़ें।

निम्न मान के साथ अनुरोध भेजें
deviceUdid=${"freemarker.template.utility.Execute"?new()("cat /etc/passwd")}

