
CVE-2022-22954 analista
Workspace ONE Access (modelo de provisión de espacio de trabajo como servicio) ofrece autenticación multifactor, inicio de sesión único y acceso condicional para SaaS, aplicaciones web y móviles. CVE-2022-22954 es una vulnerabilidad de Server-side Template Injection existente en los productos:
Descargue el archivo ova de VMware Workspace ONE Access Appliance versión 21.08.0.1
Abra el archivo con VMware Workstation; la máquina virtual debe estar en la red NAT
En Networking Properties, configure el Host Name (FQDN)

Una vez finalizada la instalación, acceda a la ruta https://{{hostname}}:8443/ para configurar la contraseña de la cuenta de la aplicación, la contraseña de la cuenta SSH y la base de datos de la aplicación La aplicación se ejecuta en https://{{hostname}}/

Inicie sesión en la máquina virtual con la cuenta sshuser y cambie a la cuenta root La ruta de la aplicación está en /opt/vmware/horizon/workspace/ El código fuente de la aplicación está en el directorio /opt/vmware/horizon/workspacce/webapps

Revise el archivo /opt/vmware/horizon/workspace/bin/setenv.sh y observe que la variable JAVA_OPTS puede configurarse para depuración remota

Añada -agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n a JAVA_OPTS y reinicie el servicio
`systemctl restart horizon-workspace.service`
Descargue el archivo hotfix HW-154129-applyWorkaround.py
En los pasos, hay un paso que elimina el archivo templates/customError.ftl de la aplicación

En el archivo customError.ftl, existe la función eval. La vulnerabilidad Freemarker SSTI puede explotarse desde aquí si se puede controlar el valor de errorObj.


En la clase com.vmware.enusercatalog.ui.web.UiErrorController, vemos que la función handleGenericError asigna el valor a errorObj a través de la variable errorMessage

Continuamos siguiendo las llamadas a las funciones y el parámetro errorMessage
Función handleUnauthorizedError

Función getErrorPage

En las dos funciones sendError y sendUnhandledError, el valor de errorMessage se obtiene de la propiedad javax.servlet.error.message


En la clase com.vmware.endusercatalog.ui.web.UiApplicationExceptionResolver, la propiedad javax.servlet.error.message”* se asigna en la función resolverExeption

La función handleAnyGenericExeption está anotada con @ExeptionHandler

En la clase com.vmware.endusercatalog.ui.UiApplication, entre los paquetes marcados con @CommponentScan se encuentra com.vmware.endusercatalog.auth

=> Las excepciones de este paquete pueden ser capturadas por la función handleAnyGenericExeption
En com.vmware.endusercatalog.ui.config, se añade el interceptor AuthContextPopilationInterceptor con las rutas /ui, /hub-ui, /hub-ui/byob, /logout, /ui/oauth/verify


Pasando a la clase com.vmware.endusercatalog.auth.interceptor.AuthContextPopulationInterceptor, en el método preHandle, la aplicación recibe dos parámetros deviceUdid y deviceType y llama a la función authContextBuilder

En la clase com.vmware.endusercatalog.auth.interceptor.AuthContext, aparecerá la excepción InvalidAuthContextException si no se cumple la condición this.isValidRequest


Para que isValidRequest se cumpla, los dos parámetros this.deviceId y this.deviceType deben estar ambos vacíos o ambos con valor

=> si se pasa un valor solo a uno de los dos parámetros, aparecerá un error aquí

Enviar la solicitud
GET /catalog-portal/ui/oauth/verify?deviceUdid=111
aparece el error
An unexpected error occurred while processing request with requestId: {0}.
Volviendo a la función com.vmware.endusercatalog.ui.web.WorkspaceOauth2CodeVerificationController, vemos que el error anterior aparece porque falta el parámetro requerido 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});
}
Enviar de nuevo la solicitud
GET /catalog-portal/ui/oauth/verify?error=&deviceUdid=111abc
el valor de deviceUdid aparece en la respuesta

Insertar el parámetro que provoca la vulnerabilidad SSTI de Freemarker

Enviar la solicitud con el valor
deviceUdid=${"freemarker.template.utility.Execute"?new()("cat /etc/passwd")}

