CVE-2026-33439 (jato.clientSession डिसीरियलाइज़ेशन के माध्यम से OpenAM प्री-ऑथ RCE) के लिए पहला सार्वजनिक रूप से साझा किया गया एक्सप्लॉइट इम्प्लीमेंटेशन।
मानव अंतर्दृष्टि + AI-सहायता प्राप्त विश्लेषण + रिवर्स इंजीनियरिंग + एडवाइज़री → एक्सप्लॉइट
CVE-2026-33439 के लिए पहला सार्वजनिक रूप से साझा किया गया एक्सप्लॉइट इम्प्लीमेंटेशन
ForgeRock OpenAM में बिना प्रमाणीकरण वाली Java डिसीरियलाइज़ेशन भेद्यता, जो क्राफ्टेड JATO सत्र ऑब्जेक्ट्स के माध्यम से पूर्ण रिमोट कोड निष्पादन की अनुमति देती है। वही नदी दो बार बहती है, उन्होंने jato.pageSession (CVE-2021-35464) को ठीक किया और jato.clientSession (CVE-2026-33439) को भूल गए। एक डिसीरियलाइज़ेशन गैजेट चेन क्रेडेंशियल नहीं माँगती।
CVE-2026-33439 OpenIdentityPlatform OpenAM (संस्करण 16.0.6 से पहले) में एक प्री-ऑथेंटिकेशन रिमोट कोड निष्पादन भेद्यता है। यह भेद्यता jato.clientSession HTTP पैरामीटर के असुरक्षित Java डिसीरियलाइज़ेशन के कारण उत्पन्न होती है, जो ClientSession.deserializeAttributes() के अंदर होता है, जो Encoder.deserialize() → ApplicationObjectInputStream.readObject() को बिना किसी क्लास व्हाइटलिस्ट के कॉल करता है।
एक बिना प्रमाणीकरण वाला हमलावर किसी भी JATO ViewBean एंडपॉइंट पर एक क्राफ्टेड HTTP GET या POST अनुरोध भेजता है, जिसमें एक सीरियलाइज़्ड Java ऑब्जेक्ट होता है, जिसका JSP <jato:form> टैग्स रेंडर करता है। अनुरोध प्राप्त होने पर, सर्वर बिना किसी सत्यापन के ऑब्जेक्ट को डिसीरियलाइज़ करता है, जिससे पूरी तरह से OpenAM WAR में बंडल की गई क्लासों से निर्मित एक गैजेट चेन सक्रिय हो जाती है — किसी बाहरी लाइब्रेरी की आवश्यकता नहीं होती — और एप्लिकेशन प्रोसेस यूज़र के रूप में मनमाने OS कमांड निष्पादित करती है।
CVSS 4.0 Vector: AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N → 9.3 Critical
CVSS 3.1 Vector: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H → 9.8 Critical
यह भेद्यता CVE-2021-35464 के बाद लागू किए गए अधूरे फिक्स का सीधा प्रतिगमन है।
CVE-2021-35464 (ForgeRock AM / OpenAM): jato.pageSession पैरामीटर के असुरक्षित डिसीरियलाइज़ेशन के माध्यम से प्री-ऑथ RCE। जंगल में व्यापक रूप से शोषित; CISA KEV-सूचीबद्ध। फिक्स ने ConsoleViewBeanBase.deserializePageAttributes() के अंदर WhitelistObjectInputStream पेश किया — एक कस्टम ObjectInputStream उपवर्ग जो किसी भी क्लास को इंस्टैंशिएट करने से पहले हर क्लास नाम को ~40 सुरक्षित क्लासों की हार्डकोडेड अनुमतिसूची के विरुद्ध जाँचता है।
CVE-2026-33439 (OpenAM ≤ 16.0.5): फिक्स केवल jato.pageSession पर लागू किया गया था। jato.clientSession पैरामीटर — जिसे ClientSession.deserializeAttributes() में पूरी तरह से अलग कोड पथ द्वारा संभाला जाता है — को कभी पैच नहीं किया गया और यह अब भी बिना फ़िल्टर किए गए Encoder.deserialize() → ApplicationObjectInputStream का उपयोग करता है, जो बिना किसी क्लास व्हाइटलिस्ट के ObjectInputStream.readObject() को कॉल करता है।
हमले का प्राइमिटिव वही है। डिसीरियलाइज़ेशन सिंक अलग है। केवल पैरामीटर का नाम बदला है।
JATO UI व्यू स्टेट को jato.pageSession और jato.clientSession नाम के HTTP पैरामीटरों में सीरियलाइज़ करता है। जब कोई अनुरोध आता है, तो OpenAM प्रतिक्रिया रेंडर करने से पहले UI स्टेट को पुनर्स्थापित करने के लिए इन पैरामीटरों को डिसीरियलाइज़ करता है। दोनों पैरामीटर पूरी तरह से अलग-अलग कोड पथों का अनुसरण करते हैं।
jato.pageSession के लिए पैच किया गया कोड पथ (CVE-2021-35464 के बाद):```java // PATCHED - ConsoleViewBeanBase.deserializePageAttributes() ObjectInputStream ois = new WhitelistObjectInputStream(new ByteArrayInputStream(decoded)); // class whitelist enforced - gadget chains blocked Object obj = ois.readObject();
jato.clientSession के लिए बिना पैच वाला कोड पथ (असुरक्षित):```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() एक सादा ApplicationObjectInputStream बनाता है - ObjectInputStream का एक उपवर्ग जिसमें कोई class फ़िल्टरिंग नहीं होती। JVM classpath पर मौजूद कोई भी class इंस्टैंशिएट की जा सकती है। Deserialization JSP रेंडरिंग के दौरान तब ट्रिगर होती है जब भी कोई < jato:form > tag रेंडर किया जाता है:``` getClientSession() → hasAttributes() → getEncodedString() → isValid() → ensureAttributes() → deserializeAttributes()
---
<div id="vulnerability_affected"/>
### ***प्रभावित संस्करण***
| उत्पाद | असुरक्षित | ठीक किया गया |
|-----------------------------|-------------------------------------------------|--------|
| OpenIdentityPlatform OpenAM | ≤ 16.0.5 | 16.0.6 |
| ForgeRock AM (डाउनस्ट्रीम) | पैच वंशावली के आधार पर संभावित रूप से प्रभावित | - |
---
<div id="vulnerability_attacksurface"/>
### ***हमले की सतह***
कोई भी JATO ViewBean एंडपॉइंट जिसकी JSP में `< jato:form >` टैग होता है, प्रमाणीकरण-पूर्व शोषण योग्य है:
| एंडपॉइंट | उद्देश्य |
|---------------------------|--------------------------------------|
| /ui/PWResetUserValidation | पासवर्ड रीसेट - उपयोगकर्ता पहचान इनपुट |
| /ui/PWResetQuestion | पासवर्ड रीसेट - सुरक्षा प्रश्न |
पासवर्ड रीसेट एंडपॉइंट प्राथमिक लक्ष्य हैं, वे डिज़ाइन द्वारा सार्वजनिक रूप से सुलभ हैं और *< jato:form >* टैग प्रस्तुत करने की गारंटी रखते हैं।
---
---
---
<div id="gadgetchain"/>
## ***⚙️ गैजेट श्रृंखला***
<div id="gadgetchain_deserialization101"/>
### ***Java डिसीरियलाइज़ेशन 101***