
مُعيد إنتاج قابل للتشغيل بـ Spring Boot وQuarkus لـ CVE-2026-85300، يوضّح قيام camel-pqc بكتابة المفاتيح الخاصة بأذونات ملفات مستمدة من umask متساهلة، ويتحقق من الإصلاح.
مُعيد إنتاج عملي قابل للتشغيل لثغرة Apache Camel حيث كان FileBasedKeyLifecycleManager في camel-pqc يكتب
المواد المفتاحية المُولَّدة إلى القرص بالأذونات التي ينتجها umask الافتراضي للعملية، بدلاً من تقييد الملف
لمالكه فقط. على مضيف يسمح فيه umask بالقراءة للمجموعة أو للجميع (القيمة الشائعة 022)، كان المفتاح الخاص
غير المشفَّر قابلاً للقراءة من قِبل حسابات محلية أخرى. ينكشف هذا الخطر لطرف محلي وليس للمُرسِل البعيد، لكن
حيثما ينطبق فإن العاقبة كاملة: امتلاك المفتاح الخاص يُبطل كل توقيع وتبادل مفاتيح يُجريه النشر باستخدامه.
| بيئة التشغيل | الدليل | الحزمة |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-pqc 4.22.0 (متأثرة؛ مُصلحة في 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-pqc (Camel 4.22.0، متأثرة؛ ضابط التحكم المُصلح CQ 3.40.0 / Camel 4.22.1) |
يُظهر كلا الوحدتين السلوك المتأثر والمُصلح. يعمل كلاهما تحت umask 022 (القيمة الافتراضية الشائعة)،
وهي فرضية الثغرة.
يستخدم برنامج التشغيل FileBasedKeyLifecycleManager الحقيقي: فهو يخزّن زوج مفاتيح RSA في دليل جديد
(manager.storeKey("k1", keyPair, new KeyMetadata("k","RSA"))) ثم يقرأ أذونات POSIX للملف المكتوب
k1.private.json.
rw-r--r-- (0644) تحت umask 022 — لذا يمكن للمجموعة
وللآخرين قراءة المفتاح الخاص غير المشفَّر.rw------- (0600، للمالك فقط) بغض النظر عن umask.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: rw-r--r-- private key; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
umask 022 && java -jar target/cve-2026-85300-pqc-key-permissions-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rw------- ; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): rw-r--r-- private key
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
umask 022 && java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rw-------
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-pqc (FileBasedKeyLifecycleManager.storeKey) |
| CWE | CWE-276 (أذونات افتراضية غير صحيحة) |
| الخطورة | متوسطة |
| ناقل الهجوم | حساب محلي قادر على قراءة دليل المفاتيح على مضيف ذي umask متساهل (مثل 022) |
| التأثير | كشف المفتاح الخاص غير المشفّر لحسابات محلية أخرى |
| الإصدارات المتأثرة | من 4.12.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24447 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-85300.html
وحدة Quarkus المتأثرة مبنية على CQ 3.39.0 (Camel 4.22.0): إذ تُربط
camel-quarkus-pqcأولاً بإصدار Camel متأثر عند هذه النقطة (CQ 3.29.0 / Camel 4.15.0 يسبق مدير دورة حياة المفاتيح المعتمد على الملفات المستخدم هنا).
أصبح FileBasedKeyLifecycleManager الآن يقيّد دليل المفاتيح وكل
ملف مفتاح خاص على مالكهما (rwx------ / rw------- عبر setPosixFilePermissions، مع بديل java.io.File
لأنظمة الملفات غير المتوافقة مع POSIX) قبل الكتابة، ويشدّد أذونات ملف مفتاح موجود مسبقًا كان مقروءًا للجميع عند
إعادة الكتابة (يُقتطع الملف ولا يُعاد إنشاؤه، لذا كان سيحتفظ بالأذونات القديمة لولا ذلك). ينبغي اعتبار أي مادة
مفاتيح كُتبت مسبقًا بأذونات متساهلة مكشوفة ويجب تدويرها.
ضع دليل المفاتيح على مسار لا يستطيع سوى حساب الخدمة عبوره وشدّد umask الخاص بالعملية؛ واعتبر أي مفتاح كُتب مسبقًا بأذونات متساهلة مكشوفًا وقم بتدويره.
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. يُولَّد زوج مفاتيح RSA داخل العملية في دليل مؤقت ويُحذف بعد الفحص. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.