Primeira implementação de exploit divulgada publicamente para CVE-2026-33439 (RCE pré-autenticação no OpenAM via desserialização de jato.clientSession).
Percepção humana + análise assistida por IA + engenharia reversa + advisory → exploit
Primeira implementação de exploit compartilhada publicamente para CVE-2026-33439
Vulnerabilidade de desserialização Java não autenticada no ForgeRock OpenAM permitindo execução remota completa de código via objetos de sessão JATO manipulados. O mesmo rio flui duas vezes: corrigiram o jato.pageSession (CVE-2021-35464) e esqueceram o jato.clientSession (CVE-2026-33439). Uma cadeia de gadgets de desserialização não pede credenciais.
CVE-2026-33439 é uma vulnerabilidade de Execução Remota de Código pré-autenticação no OpenIdentityPlatform OpenAM (versões anteriores a 16.0.6). A vulnerabilidade decorre da desserialização Java insegura do parâmetro HTTP jato.clientSession dentro de ClientSession.deserializeAttributes(), que chama Encoder.deserialize() → ApplicationObjectInputStream.readObject() sem nenhuma whitelist de classes aplicada.
Um atacante não autenticado envia uma solicitação HTTP GET ou POST manipulada contendo um objeto Java serializado para qualquer endpoint JATO ViewBean cujo JSP renderize tags <jato:form>. Ao recebê-la, o servidor desserializa o objeto sem validação, acionando uma cadeia de gadgets construída inteiramente com classes empacotadas no WAR do OpenAM - sem necessidade de bibliotecas externas - e executando comandos arbitrários do SO como o usuário do processo da aplicação.
Vetor CVSS 4.0: AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N → 9.3 Crítico
Vetor CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H → 9.8 Crítico
Esta vulnerabilidade é uma regressão direta da correção incompleta aplicada após o CVE-2021-35464.
CVE-2021-35464 (ForgeRock AM / OpenAM): RCE pré-autenticação via desserialização insegura do parâmetro jato.pageSession. Amplamente explorado em ambientes reais; listado na CISA KEV. A correção introduziu WhitelistObjectInputStream dentro de ConsoleViewBeanBase.deserializePageAttributes() - uma subclasse personalizada de ObjectInputStream que verifica cada nome de classe contra uma allowlist fixa de ~40 classes seguras antes de instanciá-la.
CVE-2026-33439 (OpenAM ≤ 16.0.5): A correção foi aplicada apenas ao jato.pageSession. O parâmetro jato.clientSession - tratado por um caminho de código completamente separado em ClientSession.deserializeAttributes() - nunca foi corrigido e ainda usa Encoder.deserialize() → ApplicationObjectInputStream sem filtro, que chama ObjectInputStream.readObject() sem whitelist de classes.
A primitiva de ataque é a mesma. O sink de desserialização é diferente. Apenas o nome do parâmetro mudou.
O JATO serializa o estado da visão da interface para parâmetros HTTP chamados jato.pageSession e jato.clientSession. Quando uma solicitação chega, o OpenAM desserializa esses parâmetros para restaurar o estado da interface antes de renderizar a resposta. Os dois parâmetros seguem caminhos de código completamente diferentes.
O caminho de código corrigido (pós-CVE-2021-35464) para jato.pageSession:```java // PATCHED - ConsoleViewBeanBase.deserializePageAttributes() ObjectInputStream ois = new WhitelistObjectInputStream(new ByteArrayInputStream(decoded)); // class whitelist enforced - gadget chains blocked Object obj = ois.readObject();
O caminho de código não corrigido para jato.clientSession (vulnerável):```java
// ClientSession.java
protected ClientSession(RequestContext context) {
this.encodedSessionString =
context.getRequest().getParameter("jato.clientSession");
}
protected void deserializeAttributes() {
if (this.encodedSessionString != null
&& this.encodedSessionString.trim().length() > 0) {
this.setAttributes(
(Map) Encoder.deserialize(
// VULNERABLE - URL-safe base64 decode then plain ObjectInputStream
Encoder.decodeHttp64(this.encodedSessionString), false)
);
}
}
Encoder.deserialize() constrói um ApplicationObjectInputStream simples - uma subclasse de ObjectInputStream sem filtragem de classes. Qualquer classe no classpath da JVM pode ser instanciada. A desserialização é acionada durante a renderização de JSP sempre que uma tag < jato:form > é renderizada:``` getClientSession() → hasAttributes() → getEncodedString() → isValid() → ensureAttributes() → deserializeAttributes()
---
<div id="vulnerability_affected"/>
### ***Versões Afetadas***
| Produto | Vulnerável | Corrigido |
|-----------------------------|-------------------------------------------------|--------|
| OpenIdentityPlatform OpenAM | ≤ 16.0.5 | 16.0.6 |
| ForgeRock AM (downstream) | Potencialmente afetado dependendo da linhagem do patch | - |
---
<div id="vulnerability_attacksurface"/>
### ***Superfície de Ataque***
Qualquer endpoint JATO ViewBean cujo JSP contenha uma tag *< jato:form >* é explorável antes da autenticação:
| Endpoint | Propósito |
|---------------------------|--------------------------------------|
| /ui/PWResetUserValidation | Redefinição de senha - entrada de identidade do usuário |
| /ui/PWResetQuestion | Redefinição de senha - perguntas de segurança |
Os endpoints de redefinição de senha são o alvo principal; são publicamente acessíveis por design e têm garantia de renderizar tags *< jato:form >*.
---
---
---
<div id="gadgetchain"/>
## ***⚙️ A Cadeia de Gadgets***