Prima implementazione di exploit condivisa pubblicamente per CVE-2026-33439 (RCE pre-autenticazione OpenAM tramite deserializzazione di jato.clientSession).
Intuizione umana + analisi assistita da IA + reverse engineering + advisory → exploit
Prima implementazione di exploit condivisa pubblicamente per CVE-2026-33439
Vulnerabilità di deserializzazione Java non autenticata in ForgeRock OpenAM che consente l'esecuzione remota completa di codice tramite oggetti di sessione JATO appositamente costruiti. Lo stesso fiume scorre due volte: hanno corretto jato.pageSession (CVE-2021-35464) e si sono dimenticati di jato.clientSession (CVE-2026-33439). Una catena di gadget di deserializzazione non chiede credenziali.
CVE-2026-33439 è una vulnerabilità di Remote Code Execution pre-autenticazione in OpenIdentityPlatform OpenAM (versioni precedenti alla 16.0.6). La vulnerabilità deriva dalla deserializzazione Java non sicura del parametro HTTP jato.clientSession all'interno di ClientSession.deserializeAttributes(), che chiama Encoder.deserialize() → ApplicationObjectInputStream.readObject() senza alcuna whitelist di classi applicata.
Un attaccante non autenticato invia una richiesta HTTP GET o POST appositamente costruita contenente un oggetto Java serializzato a qualsiasi endpoint JATO ViewBean la cui JSP renderizza tag <jato:form>. Al ricevimento, il server deserializza l'oggetto senza validazione, attivando una catena di gadget costruita interamente con classi incluse nel WAR di OpenAM – senza richiedere librerie esterne – ed eseguendo comandi OS arbitrari come utente del processo applicativo.
Vettore 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 Critico
Vettore CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H → 9.8 Critico
Questa vulnerabilità è una regressione diretta della correzione incompleta applicata dopo CVE-2021-35464.
CVE-2021-35464 (ForgeRock AM / OpenAM): RCE pre-autenticazione tramite deserializzazione non sicura del parametro jato.pageSession. Ampiamente sfruttata in natura; elencata nel KEV di CISA. La correzione ha introdotto WhitelistObjectInputStream all'interno di ConsoleViewBeanBase.deserializePageAttributes() – una sottoclasse personalizzata di ObjectInputStream che controlla ogni nome di classe rispetto a una allowlist hardcoded di ~40 classi sicure prima di istanziarla.
CVE-2026-33439 (OpenAM ≤ 16.0.5): La correzione è stata applicata solo a jato.pageSession. Il parametro jato.clientSession – gestito da un percorso di codice completamente separato in ClientSession.deserializeAttributes() – non è mai stato corretto e utilizza ancora Encoder.deserialize() → ApplicationObjectInputStream senza filtri, che chiama ObjectInputStream.readObject() senza whitelist di classi.
Il primitivo d'attacco è lo stesso. Il sink di deserializzazione è diverso. È cambiato solo il nome del parametro.
JATO serializza lo stato della vista UI in parametri HTTP denominati jato.pageSession e jato.clientSession. Quando arriva una richiesta, OpenAM deserializza questi parametri per ripristinare lo stato della UI prima di renderizzare la risposta. I due parametri seguono percorsi di codice completamente diversi.
Il percorso di codice corretto (post-CVE-2021-35464) per jato.pageSession:```java // PATCHED - ConsoleViewBeanBase.deserializePageAttributes() ObjectInputStream ois = new WhitelistObjectInputStream(new ByteArrayInputStream(decoded)); // class whitelist enforced - gadget chains blocked Object obj = ois.readObject();
Il percorso di codice non patchato per jato.clientSession (vulnerabile):```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() costruisce un semplice ApplicationObjectInputStream - una sottoclasse di ObjectInputStream senza filtraggio delle classi. Qualsiasi classe sul classpath JVM può essere istanziata. La deserializzazione viene attivata durante il rendering JSP ogni volta che viene renderizzato un tag < jato:form >:``` getClientSession() → hasAttributes() → getEncodedString() → isValid() → ensureAttributes() → deserializeAttributes()
---
<div id="vulnerability_affected"/>
### ***Versioni interessate***
| Prodotto | Vulnerabile | Corretto |
|-----------------------------|-------------------------------------------------|----------|
| OpenIdentityPlatform OpenAM | ≤ 16.0.5 | 16.0.6 |
| ForgeRock AM (downstream) | Potenzialmente interessato a seconda della discendenza delle patch | - |
---
<div id="vulnerability_attacksurface"/>
### ***Superficie di attacco***
Qualsiasi endpoint JATO ViewBean il cui JSP contiene un tag *< jato:form >* è sfruttabile in pre-autenticazione:
| Endpoint | Scopo |
|---------------------------|------------------------------------|
| /ui/PWResetUserValidation | Reimpostazione password - input identità utente |
| /ui/PWResetQuestion | Reimpostazione password - domande di sicurezza |