أول تنفيذ استغلال مُشارَك علنًا لثغرة CVE-2026-33439 (RCE قبل المصادقة في OpenAM عبر إلغاء تسلسل jato.clientSession).
رؤية بشرية + تحليل بمساعدة الذكاء الاصطناعي + هندسة عكسية + استشارة ← استغلال
أول تنفيذ استغلال مُشارك علنًا لـ CVE-2026-33439
ثغرة إلغاء تسلسل Java غير مصادق عليها في ForgeRock OpenAM تسمح بتنفيذ كامل للتعليمات البرمجية عن بُعد عبر كائنات جلسة JATO مُصمّمة. النهر نفسه يجري مرتين، أصلحوا jato.pageSession (CVE-2021-35464) ونسوا jato.clientSession (CVE-2026-33439). سلسلة أدوات إلغاء التسلسل لا تطلب بيانات اعتماد.
CVE-2026-33439 هي ثغرة تنفيذ تعليمات برمجية عن بُعد قبل المصادقة في OpenIdentityPlatform OpenAM (الإصدارات الأقدم من 16.0.6). تنبع الثغرة من إلغاء تسلسل Java غير الآمن لمعامل HTTP jato.clientSession داخل ClientSession.deserializeAttributes()، والذي يستدعي Encoder.deserialize() ← ApplicationObjectInputStream.readObject() دون تطبيق قائمة بيضاء للفئات.
يرسل مهاجم غير مصادق عليه طلب HTTP GET أو POST مُصمم يحتوي على كائن Java متسلسل إلى أي نقطة نهاية JATO ViewBean يعرض ملف JSP الخاص بها وسوم <jato:form>. عند الاستلام، يقوم الخادم بإلغاء تسلسل الكائن دون تحقق، مما يؤدي إلى تشغيل سلسلة أدوات مبنية بالكامل من فئات مضمّنة في حزمة OpenAM WAR - دون الحاجة إلى مكتبات خارجية - وتنفيذ أوامر نظام تشغيل عشوائية بصلاحية مستخدم عملية التطبيق.
متجه 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 حرجة
متجه CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H → 9.8 حرجة
هذه الثغرة هي انحدار مباشر للإصلاح غير المكتمل الذي طُبّق بعد CVE-2021-35464.
CVE-2021-35464 (ForgeRock AM / OpenAM): تنفيذ تعليمات برمجية عن بُعد قبل المصادقة عبر إلغاء تسلسل غير آمن لمعامل jato.pageSession. استُغلّ على نطاق واسع في البرية؛ وهو مدرج في قائمة CISA KEV. أدخل الإصلاح WhitelistObjectInputStream داخل ConsoleViewBeanBase.deserializePageAttributes() - وهي فئة فرعية مخصصة من ObjectInputStream تتحقق من كل اسم فئة مقابل قائمة بيضاء مكتوبة في الكود تضم ~40 فئة آمنة قبل إنشاء مثيل منها.
CVE-2026-33439 (OpenAM ≤ 16.0.5): طُبّق الإصلاح على jato.pageSession فقط. أما معامل jato.clientSession - الذي يتعامل معه مسار كود منفصل تمامًا في ClientSession.deserializeAttributes() - فلم تتم معالجته أبدًا ولا يزال يستخدم Encoder.deserialize() ← ApplicationObjectInputStream غير المفلتر، والذي يستدعي ObjectInputStream.readObject() دون قائمة بيضاء للفئات.
آلية الهجوم هي نفسها. نقطة غرق إلغاء التسلسل مختلفة. فقط اسم المعامل تغيّر.
يقوم JATO بتسلسل حالة عرض الواجهة إلى معاملات HTTP باسمي jato.pageSession و jato.clientSession. عندما يصل طلب، يقوم OpenAM بإلغاء تسلسل هذه المعاملات لاستعادة حالة الواجهة قبل عرض الاستجابة. يتبع المعاملان مساري كود مختلفين تمامًا.
مسار الكود المُصحح (بعد CVE-2021-35464) لـ jato.pageSession:```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 بدون أي تصفية للفئات. يمكن إنشاء مثيل لأي فئة على classpath الخاص بـ JVM. يتم تحفيز إلغاء التسلسل أثناء تصيير JSP كلما تم تصيير وسم < jato:form >:``` 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"/>
## ***⚙️ سلسلة Gadget***
<div id="gadgetchain_deserialization101"/>
### ***أساسيات إلغاء تسلسل Java***
عندما تقوم Java بإلغاء تسلسل كائن من دفق بايت، فإنها تستدعي `readObject()` على كل فئة تعيد بنائها، بما في ذلك الكائنات المتداخلة. إذا كان المهاجم يتحكم في دفق البايت ويحقن كائنًا يتسبب استدعاء `readObject()` الخاص به في سلسلة من استدعاءات الدوال تنتهي بتنفيذ كود، فإنه يحصل على RCE عبر سلسلة Gadget.
الرؤية الرئيسية لـ CVE-2026-33439: لا تتطلب سلسلة Gadget أي مكتبات خارجية. كل فئة في السلسلة مضمّنة داخل حزمة OpenAM WAR نفسها `openam-core-16.0.5.jar, xalan-2.7.3.jar, and click-nodeps-2.3.0.jar`. <u>وهذا يجعل الثغرة قابلة للاستغلال على أي نشر افتراضي لـ OpenAM.</u>
---
<div id="gadgetchain_encoding"/>
### ***Encoder.decodeHttp64***