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 a 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: 1 fevereiro 2019