ASA-2018-00051 – RichFaces: Execução remota de código não autenticada via expression language (EL) em UserResource


For the English version of this alert, click here.

Allele Security Alert

ASA-2018-00051

Identificador(es)

ASA-2018-00051, CVE-2018-14667

Título

Execução remota de código não autenticada via expression language (EL) em UserResource

Fabricante(s)

JBoss

Produto(s)

RichFaces Framework

Versão(ões) afetada(s)

RichFaces Framework 3.X through 3.3.4

Versão(ões) corrigida(s)

Desconhecido

Prova de conceito

Desconhecido

Descrição

RichFaces Framework 3.x a 3.3.4 (todas as versões) é vulnerável a injeção de expression language (EL) via recurso UserResource, permitindo um atacante remoto não autenticado executar código Java arbitrário e potencialmente comandos do sistema operacional usando uma cadeia de objetos Java dentro de uma org.ajax4jsf.resource.UserResource$UriData.

Detalhes técnicos

RichFaces espera receber um recurso serializado do tipo “org.ajax4jsf.resource.UserResource” via URL com o padrão:

“/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/s/{HashCode do recurso MimeType}/DATA/{Objeto serializado codificado}”.

Quando isto ocorre, uma validação de tipos permitidos é feita usando uma whitelist restrita (Look-Ahead) a fim de evitar vulnerabilidades de desserialização.

A seguir encontra-se a whitelist estrita Look-Ahead com os tipos permitidos:

1) org.ajax4jsf.resource.InternetResource
2) org.ajax4jsf.resource.SerializableResource
3) javax.el.Expression
4) javax.faces.el.MethodBinding
5) javax.faces.component.StateHolderSaver
6) java.awt.Color

Contudo, embora não encontre-se vulnerável a desserialização, é possível construir uma cadeia especial de objetos usando somente tipos permitidos e com a tainted expression language (EL) de uma forma específica que resulta em ele ser automaticamente avaliado pela classe UserResource depois da correta desserialização da cadeia (Após o cast, não antes).

A fim de estar vulnerável, uma aplicação somente precisa:

1) Usar o recurso mediaOutput em qualquer ponto e qualquer momento (o atacante não precisa saber quando este recurso é usado. Ele apenas precisa que esta funcionalidade tenha sido usada em qualquer momento pela aplicação).

Se o ponto (1) é satisfeito, a aplicação conterá um recurso dentro de um HashMap interno com a chave como a seguir:

                                                /----- Nome do recurso
                                               \/
Key: org.ajax4jsf.resource.UserResource/n/s/-1487394660 <--- HasCode do
recurso MimeType (eg "image/jpeg")
                                                                                                                              /\ /\
                                                                                                                               |   \____
Se o recurso é da sessão escopo (/s) ou não (/n)
                                                                                                                                \_______
Se o recurso pode ser armazenado em cache (/c) ou não (/n)

A intenção original do UserResource é criar e restaurar um recurso (como imagens, flash, audio, etc) e enviar ele de volta/desenhar para o usuário. Portanto, este é um dos mais comum recursos usados por aplicações web usando RichFaces.

Um atacante pode abusar este recurso forçando a aplicação a avaliar seu tainted EL usando uma cadeia como a seguir:

1] [Obj] org.ajax4jsf.resource.UserResource$UriData
               createContent:
2]                [Obj] javax.faces.component.StateHolderSaver
                              savedState:
3]                              [Obj] com.sun.facelets.el.TagMethodExpression
                                            orig:
4]                                             [obj] org.jboss.el.MethodExpressionImpl
                                                           exp:
                                                                "${NOSSO PAYLOAD}" <----- A EL maliciosa pode ser colocada aqui.

Na cadeia anterior, note que todos os tipos são permitidos pela proteção look-ahead:

1] “org.ajax4jsf.resource.UserResource$UriData” é um “InternetResourceBase” que é um “InternetResource” (whitelisted);
2] “javax.faces.component.StateHolderSaver” (whitelisted)
3] “com.sun.facelets.el.TagMethodExpression” é um “MethodExpression” que é um “Expression” (whitelisted)
4] “org.jboss.el.MethodExpressionImpl” e “MethodExpression” (whitelisted)

Note que pontos [2] e [3] da cadeia podem também ser alteradas a fim de realizar a exploração em diferentes plataformas.

Após criar a cadeia para a exploração, é necessário codificar ela corretamente e realizar um HTTP GET para a correta URL do UserResource com o payload.

eg. /a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/{hashCode do mime}/payload

O {hashCode do MimeType} não é sempre necessário (depende de como a aplicação usa estes recursos).

Quando o payload é recebido pela aplicação, a cadeia é desserializada e o método UserResource.send() é invocado por ResourceLifecycle.sendResource(). Dentro deste método, o conteúdo de UserResource$UriData é restaurado e nosso MethodExpressions é invocado. Então, nosso tainted EL alcançou MethodExpression.invoke(), conduzindo para uma avaliação EL.

Exemplo do stacktrace.

org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) <- Isto contém dados controlados pelo usuário!
org.ajax4jsf.resource.UserResource.send(UserResource.java:109)
org.ajax4jsf.resource.ResourceLifecycle.sendResource(ResourceLifecycle.java:221)
org.ajax4jsf.resource.ResourceLifecycle.send(ResourceLifecycle.java:148)
org.ajax4jsf.resource.InternetResourceService.serviceResource(InternetResourceService.java:226)
org.ajax4jsf.resource.ResourceBuilderImpl.decrypt(ResourceBuilderImpl.java:626)
org.ajax4jsf.resource.ResourceBuilderImpl.getResourceDataForKey(ResourceBuilderImpl.java:371)
org.ajax4jsf.resource.InternetResourceService.serviceResource(InternetResourceService.java:156)
org.ajax4jsf.resource.InternetResourceService.serviceResource(InternetResourceService.java:141)

Créditos

Joao F M Figueiredo

Referência(s)

Unauthenticated Remote Code execution in WebApps using Richfaces 3.X all versions (CVE-2018-14667)
https://seclists.org/fulldisclosure/2018/Nov/47

CVE-2018-14667
https://access.redhat.com/security/cve/cve-2018-14667

CVE-2018-14667
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14667

CVE-2018-14667
https://nvd.nist.gov/vuln/detail/CVE-2018-14667

Se encontrou algum erro neste alerta ou deseja uma análise compreensiva, entre em contato.

Última modificação: 25 de novembro de 2018