
مُعيد إنتاج لـ CVE-2026-43867 — إلغاء تسلسل غير آمن لبيانات تعريف المفاتيح في Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager (RCE)
يعرض هذا المشروع ثغرة إلغاء تسلسل في Java في مكوّن camel-pqc من Apache Camel،
ويُتتبَّع باسم CVE-2026-43867. يقوم AwsSecretsManagerKeyLifecycleManager.deserializeMetadata() بقراءة
بيانات تعريف المفاتيح ما بعد-الكمومية (post-quantum) من سرٍّ مخزَّن في AWS Secrets Manager، وذلك بفكّ ترميز القيمة المخزنة من Base64 و
إلغاء تسلسلها (deserializing) عبر java.io.ObjectInputStream.readObject() خام دون أي ObjectInputFilter — والتحويل
إلى KeyMetadata يحدث فقط بعد عودة readObject()، لذا فإن أي آثار جانبية لـ readObject() تُنفَّذ أولاً. يمكن
لأي جهة تملك حق الكتابة إلى ذلك السرّ (secretsmanager:PutSecretValue) تخزين كائنٍ مُسلسَلٍ معدّ بعناية (crafted serialized object)
يتم إلغاء تسلسله أثناء عمليات دورة حياة المفاتيح العادية، ما قد يؤدي إلى تنفيذ برمجيات (code execution).
الإعلان الأمني: https://camel.apache.org/security/CVE-2026-43867.html
نفس العيب الموجود في CVE-2026-46590 (أُبلغ عنه بشكل مستقل؛ ويغطي هذا الإعلان أيضًا مُديري HashiCorp Vault والمدير المعتمد على الملفات)، وهو أيضًا تكملة لمعالجة غير مكتملة لـ CVE-2026-40048 (CAMEL-23200)، الذي غيّر
FileBasedKeyLifecycleManagerإلى صيغة JSON/PKCS#8/X.509 لكنه لم يُضفObjectInputFilterولم يغطِّ مديري AWS/Vault.
// AwsSecretsManagerKeyLifecycleManager - affected 4.18.2
private KeyMetadata deserializeMetadata(String base64) throws Exception {
byte[] data = Base64.getDecoder().decode(base64);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
try (ObjectInputStream ois = new ObjectInputStream(bais)) { // NO ObjectInputFilter
return (KeyMetadata) ois.readObject(); // gadget fires here, before the cast
}
}
يقرأ getKeyMetadata(keyId) السرَّ المسموّى <keyPrefix>/<keyId>/metadata، ويحلل غلافه بصيغة JSON
({"metadata":"<base64>","keyId":...,"algorithm":...})، ثم يمرّر حقل metadata إلى
deserializeMetadata. يُدخل الإصلاح (4.18.3 / 4.21.0) مُرمِّزًا مشتركًا باسم KeyMetadataCodec يخزّن بيانات التعريف
بصيغة JSON لجميع المُديرين، ويقيّد قراءات ObjectInputStream القديمة المتبقية باستخدام قائمة سماح
ObjectInputFilter.
الضحية هي التطبيق الذي يدير مفاتيح PQC عبر مدير AWS. المهاجِم هو أي جهة تملك
صلاحية كتابة سرّ بيانات التعريف (secretsmanager:PutSecretValue). يستخدم هذا الإثبات البرهاني (PoC) LocalStack لمحاكاة
AWS Secrets Manager؛ وتعرض نقطة النهاية /exploit/attack سرَّ بيانات تعريف معدًّا بعناية ثم تُشغّل مسار القراءة لدى المُدير.
CVE-2026-43867/
├── pom.xml # camel-pqc 4.18.2 + aws-sdk secretsmanager 2.41.28 + commons-collections 3.2.1
├── Dockerfile # runs the app (--add-opens for gadget build)
├── docker-compose.yml # LocalStack (Secrets Manager) + the reproducer app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── Gadget.java # CommonsCollections6 gadget, fires during readObject()
│ └── ExploitController.java # writes the crafted secret, then calls getKeyMetadata()
└── resources/
└── application.properties
في هجوم حقيقي، تُنتَج البايتات المُسلسَلة خارجيًا بواسطة المهاجِم (مثلًا باستخدام ysoserial). هذا الإثبات البرهاني يبني الـ gadget داخل العملية (in-process)، ولهذا تعمل JVM مع
--add-opens java.base/java.util=ALL-UNNAMED— وهو تفصيل خاص ببناء الـ gadget، لا علاقة له بالثغرة.
mvn clean package -DskipTests
docker compose up -d --build
يُشغّل هذا LocalStack (لمحاكاة AWS Secrets Manager) وتطبيق إعادة الإنتاج، الذي يوجّه
AwsSecretsManagerKeyLifecycleManager الخاص به إلى LocalStack عبر تجاوز نقطة النهاية.
curl -s http://localhost:8080/exploit/attack
# -> Wrote crafted serialized metadata to AWS Secrets Manager secret 'pqc/keys/victim-key/metadata'.
# getKeyMetadata() threw java.lang.ClassCastException (expected — the gadget runs during readObject ...)
#
# >>> RCE proof — /tmp/pwned exists: true
docker exec cve-2026-43867 ls -la /tmp/pwned
docker compose down
أي تطبيق يستخدم AwsSecretsManagerKeyLifecycleManager ويمكن لجهة غير هوية التطبيق الموثوقة نفسها الكتابةَ إلى سرّ بيانات تعريف مفاتيحه. يحدث إلغاء التسلسل أثناء عمليات دورة حياة المفاتيح العادية (getKeyMetadata, loadExistingKeys, listKeys, فحوصات التدوير، …).
AwsSecretsManagerKeyLifecycleManager من camel-pqc على إصدار متأثر.secretsmanager:PutSecretValue عليه).commons-collections:3.2.1).الترقية إلى 4.18.3 / 4.21.0 (CAMEL-23726). تُخزَّن بيانات التعريف بصيغة JSON، وأي قراءات
ObjectInputStream قديمة متبقية تُقيَّد باستخدام قائمة سماح ObjectInputFilter.
إلى حين الترقية:
secretsmanager:PutSecretValue على سرّ بيانات تعريف camel-pqc لتصبح لهوية التطبيق نفسه فقط
(IAM بأقل امتياز).يُقدَّم هذا الإثبات البرهاني لأغراض البحث الأمني والاختبار المصرَّح به فقط، لثغرة مكشوفة علنًا ومُصحَّحة. لا تستخدمه ضد أنظمة دون إذن صريح.
| الخاصية | القيمة |
|---|
| المكوّن | camel-pqc (AwsSecretsManagerKeyLifecycleManager) |
| الفئة المتأثرة | org.apache.camel.component.pqc.lifecycle.AwsSecretsManagerKeyLifecycleManager#deserializeMetadata |
| CWE | CWE-502: إلغاء تسلسل بيانات غير موثوقة |
| الأثر | تنفيذ برمجيات داخل التطبيق المُدير للمفاتيح (يتطلب صلاحية كتابة على سرّ بيانات التعريف) |
| الإصدارات المتأثرة | من 4.18.0 قبل 4.18.3، ومن 4.19.0 قبل 4.21.0 |
| الإصدارات المُصحَّحة | 4.18.3، 4.21.0 (camel-pqc غير مدرج في خط الدعم طويل الأمد 4.14.x LTS) |
| JIRA | CAMEL-23726 |
| المبلِّغ | Venkatraman Kumar (Securin) |