शेल-आधारित भेद्यता स्कैनर जो Exim MTA में CVE-2026-45185 (Dead.Letter) के लिए है। GnuTLS बिल्ड में उपयोग-के-बाद-मुक्त (use-after-free) का पता लगाता है, संस्करण, TLS लाइब्रेरी और CHUNKING कॉन्फ़िगरेशन की जाँच करता है। CI/CD एकीकरण के लिए JSON आउटपुट उत्पन्न करता है।
एक शेल स्क्रिप्ट जो यह पता लगाने के लिए है कि कोई Linux सिस्टम CVE-2026-45185 के प्रति संवेदनशील है या नहीं, जो Exim मेल ट्रांसफर एजेंट में एक use-after-free बग है जो रिमोट कोड निष्पादन का कारण बन सकता है।
CI/CD पाइपलाइनों, कॉन्फ़िगरेशन प्रबंधन टूलिंग और एड-हॉक सिस्टम ऑडिट में उपयोग के लिए डिज़ाइन किया गया। यह मानव-पठनीय और मशीन-पठनीय (JSON) दोनों आउटपुट उत्पन्न करता है।
CVE-2026-45185 (उपनाम: Dead.Letter) Exim के BDAT (बाइनरी डेटा) संदेश बॉडी पार्सिंग में एक use-after-free बग है, जो तब ट्रिगर होता है जब TLS को GnuTLS द्वारा संभाला जाता है।
TLS शटडाउन के दौरान, Exim अपने TLS ट्रांसफर बफर को मुक्त करता है — लेकिन एक नेस्टेड BDAT रिसीव रैपर अभी भी आने वाले बाइट्स को संसाधित कर सकता है और ungetc() को कॉल कर सकता है, जिससे एक एकल \n बाइट मुक्त किए गए क्षेत्र में लिखा जाता है। वह एक-बाइट लेखन हीप आवंटक मेटाडेटा को दूषित करता है, जिससे एक हमलावर आगे मेमोरी प्रिमिटिव प्राप्त कर सकता है और रिमोट कोड निष्पादन प्राप्त कर सकता है।
| गुण | विवरण |
|---|
| CVE | CVE-2026-45185 |
| उपनाम | Dead.Letter |
| प्रकार | Use-After-Free (CWE-416) |
| घटक | Exim BDAT/CHUNKING हैंडलर (केवल GnuTLS बिल्ड) |
| हमला वेक्टर | नेटवर्क — बिना प्रमाणीकरण के, केवल TLS कनेक्शन और CHUNKING एक्सटेंशन की आवश्यकता है |
| प्रभावित संस्करण | Exim 4.97 – 4.99.2, केवल GnuTLS बिल्ड |
| फिक्स्ड इन | Exim 4.99.3 |
| खोजकर्ता | Federico Kirschbaum, XBOW Security Lab (1 मई 2026 को रिपोर्ट किया गया) |
OpenSSL बिल्ड प्रभावित नहीं हैं। यह कमजोरी केवल Exim पर लागू होती है जो
USE_GNUTLS=yesके साथ संकलित है। यदि आपका Exim OpenSSL से लिंक है, तो आप संस्करण की परवाह किए बिना संवेदनशील नहीं हैं।
स्क्रिप्ट एक निर्णय वृक्ष के माध्यम से काम करती है, जैसे ही कोई निश्चित सुरक्षित स्थिति की पुष्टि होती है, रुक जाती है और सिस्टम को संवेदनशील नहीं चिह्नित करती है:
जाँच 1 — Exim की उपस्थिति
$PATH और सामान्य स्थापना स्थानों (/usr/sbin/exim, /usr/sbin/exim4, /usr/local/sbin/exim) की खोज करता है। यदि Exim नहीं मिलता है, तो सिस्टम संवेदनशील नहीं है और स्क्रिप्ट तुरंत बाहर निकल जाती है।
जाँच 2 — Exim संस्करण
exim -bV आउटपुट को पार्स करता है और प्रभावित सीमा (4.97 – 4.99.2) से तुलना करता है। संस्करण ≥ 4.99.3 को पैच किया गया माना जाता है। ज्ञात सीमा से बाहर के संस्करणों को संवेदनशील नहीं चिह्नित किया जाता है (यदि वे अपरिचित हैं तो एक नोट के साथ)।
जाँच 3 — TLS लाइब्रेरी (महत्वपूर्ण द्वार) तीन पहचान विधियों का क्रमिक रूप से उपयोग करता है:
exim -bV बिल्ड जानकारी (सबसे विश्वसनीय — Exim अपनी संकलन-समय सुविधाओं की रिपोर्ट करता है, जैसे Support for: GnuTLS)ldd साझा लाइब्रेरी लिंकेजstrings बाइनरी स्कैन (फ़ॉलबैक)यदि OpenSSL का पता चलता है → निर्णय संवेदनशील नहीं में बदल जाता है, भले ही संस्करण कुछ भी हो। यदि GnuTLS का पता चलता है → आक्रमण सतह मौजूद पुष्टि हो जाती है। यदि कोई निर्धारित नहीं किया जा सकता है → परिणाम अनिर्णायक है।
जाँच 4 — CHUNKING/BDAT कॉन्फ़िग (वर्कअराउंड जाँच)
केवल तभी चलता है जब सिस्टम अभी भी इस बिंदु पर संवेदनशील चिह्नित है। यह जाँचता है कि chunking_advertise_hosts को Exim कॉन्फ़िग में स्पष्ट रूप से खाली मान पर सेट किया गया है या नहीं, जो BDAT विज्ञापन को अक्षम करता है और आक्रमण वेक्टर को अवरुद्ध करता है। यह एकल-फ़ाइल कॉन्फ़िग और डेबियन के स्प्लिट-कॉन्फ़िग लेआउट (/etc/exim4/conf.d/ टुकड़े) दोनों को संभालता है।
नोट: यदि
chunking_advertise_hostsकॉन्फ़िग से अनुपस्थित है (डिफ़ॉल्ट), तो Exim सभी होस्ट (*) को CHUNKING का विज्ञापन करता है। इसे अक्षम करने के लिए विकल्प को स्पष्ट रूप से खाली मान पर सेट किया जाना चाहिए।
जाँच 5 — सूचनात्मक सिस्टम शमन निर्णय नहीं बदलता, लेकिन उन कारकों की रिपोर्ट करता है जो शोषण क्षमता को प्रभावित करते हैं:
/proc/sys/kernel/randomize_va_space) — 2 होना चाहिएchecksec आउटपुट (PIE, RELRO, स्टैक कैनेरी) यदि checksec स्थापित हैMemoryDenyWriteExecute, NoNewPrivileges, SystemCallFilter/proc फाइलसिस्टम हो (ASLR जाँच के लिए)grep, awk, ldd, headchecksec (वैकल्पिक — बाइनरी हार्डनिंग विश्लेषण के लिए)systemctl (वैकल्पिक — systemd यूनिट निरीक्षण के लिए)Debian-exim समूह में एक उपयोगकर्ता)मुख्य कमजोरी जाँचों के लिए कोई बाहरी निर्भरता आवश्यक नहीं है।
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh
| फ़्लैग | विवरण |
|---|---|
--json | परिणामों को JSON ऑब्जेक्ट के रूप में आउटपुट करें (नीचे देखें) |
--quiet | सभी आउटपुट को दबाएँ; केवल एग्जिट कोड सेट किया जाता है |
--no-color | ANSI रंग कोड अक्षम करें (लॉग फ़ाइलों के लिए उपयोगी) |
--help / -h | उपयोग जानकारी प्रिंट करें |
| कोड | अर्थ |
|---|---|
0 | संवेदनशील नहीं (या एक निश्चित सुरक्षित स्थिति मिली) |
1 | संवेदनशील |
2 | अनिर्णायक — एक या अधिक आवश्यक तथ्य निर्धारित नहीं कर सका; संभावित रूप से संवेदनशील मानें |
3 | स्क्रिप्ट त्रुटि या असमर्थित वातावरण |
CVE-2026-45185 (Dead.Letter) — Exim Vulnerability Assessment
============================================================
[CHECK] Exim स्थापना की जाँच कर रहा है...
[WARN] Exim बाइनरी मिला: /usr/sbin/exim4
[CHECK] Exim संस्करण की जाँच कर रहा है...
पाया गया संस्करण: 4.99.1
[FAIL] Exim 4.99.1 संवेदनशील सीमा (4.97 – 4.99.2) में है।
[CHECK] TLS लाइब्रेरी लिंकेज (GnuTLS बनाम OpenSSL) की जाँच कर रहा है...
[FAIL] Exim GnuTLS से लिंक है — यह बिल्ड प्रभावित है।
[CHECK] CHUNKING (BDAT) विज्ञापन कॉन्फ़िगरेशन की जाँच कर रहा है...
कॉन्फ़िग फ़ाइल: /etc/exim4/exim4.conf
[WARN] chunking_advertise_hosts अक्षम नहीं है — BDAT सक्रिय है (डिफ़ॉल्ट रूप से सभी होस्ट को विज्ञापन)।
सुझाव: BDAT को वर्कअराउंड के रूप में अक्षम करने के लिए अपने मुख्य कॉन्फ़िग में 'chunking_advertise_hosts =' (खाली मान) जोड़ें।
[CHECK] सिस्टम-स्तरीय शोषण शमन की जाँच (सूचनात्मक)...
[PASS] ASLR: पूर्ण यादृच्छिकीकरण (randomize_va_space=2)
glibc संस्करण: 2.35 (2.32+ में मजबूत हीप मेटाडेटा जाँच है)
[WARN] systemd: MemoryDenyWriteExecute सेट नहीं — यूनिट में जोड़ने की अनुशंसा
[WARN] systemd: NoNewPrivileges सेट नहीं
------------------------------------------------------------
निर्णय
------------------------------------------------------------
संवेदनशील — CVE-2026-45185
कारण: Exim संस्करण 4.99.1 संवेदनशील सीमा 4.97–4.99.2 में है
अनुशंसित कार्रवाइयाँ:
1. Exim को 4.99.3 या बाद के संस्करण में अपग्रेड करें (प्राथमिक फिक्स)
2. वर्कअराउंड के रूप में, exim कॉन्फ़िग में 'chunking_advertise_hosts =' (खाली) सेट करें
3. systemd यूनिट में MemoryDenyWriteExecute=yes और NoNewPrivileges=yes जोड़ें
4. सुनिश्चित करें कि ASLR 2 पर सेट है: echo 2 > /proc/sys/kernel/randomize_va_space
------------------------------------------------------------
--json){
"cve": "CVE-2026-45185",
"alias": "Dead.Letter",
"host": "mailserver-01",
"timestamp": "2026-05-12T17:00:00Z",
"verdict": "vulnerable",
"reason": "Exim version 4.99.1 is in vulnerable range 4.97–4.99.2",
"exit_code": 1,
"findings": {
"exim_binary": "/usr/sbin/exim4",
"exim_version": "4.99.1",
"exim_version_vulnerable": "true",
"tls_library": "gnutls",
"tls_library_detected": "gnutls",
"exim_config": "/etc/exim4/exim4.conf",
"chunking_advertised": "true",
"aslr_level": "2",
"glibc_version": "2.35"
},
"mitigations": [
"aslr=full"
]
}
- name: CVE-2026-45185 के लिए जाँच करें
run: |
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh --json | tee vuln-report.json
exit $(jq '.exit_code' vuln-report.json)
- name: कमजोरी रिपोर्ट अपलोड करें
if: always()
uses: actions/upload-artifact@v4
with:
name: cve-2026-45185-report
path: vuln-report.json
check-exim-vuln:
stage: security
script:
- chmod +x check_cve_2026_45185.sh
- ./check_cve_2026_45185.sh --json > vuln-report.json
artifacts:
when: always
paths:
- vuln-report.json
allow_failure: false
- name: CVE-2026-45185 जाँच चलाएँ
script: check_cve_2026_45185.sh --json
register: vuln_check
failed_when: vuln_check.rc == 1
changed_when: false
- name: कमजोरी रिपोर्ट दिखाएँ
debug:
msg: "{{ vuln_check.stdout | from_json }}"
# केवल निर्णय प्राप्त करें
./check_cve_2026_45185.sh --json | jq -r '.verdict'
# जाँचें कि कोई विशिष्ट शमन मिला है
./check_cve_2026_45185.sh --json | jq '.mitigations | contains(["aslr=full"])'
# कई होस्ट पर चलाएँ और परिणाम एकत्र करें
for host in mail1 mail2 mail3; do
ssh "$host" 'bash -s' < check_cve_2026_45185.sh --json
done | jq -s '.'
# डेबियन / उबंटू
apt-get update && apt-get install --only-upgrade exim4
# RHEL / CentOS / Fedora
dnf upgrade exim
# स्रोत से
# 4.99.3 https://ftp.exim.org/pub/exim/exim4/ से डाउनलोड करें
# और अपने मौजूदा Local/Makefile सेटिंग्स के साथ पुनर्निर्माण करें
अपग्रेड के बाद सत्यापित करें:
exim -bV | head -1
# अपेक्षित: Exim version 4.99.3 ...
यदि आप तुरंत अपग्रेड नहीं कर सकते हैं, तो अपने Exim कॉन्फ़िग के मुख्य कॉन्फ़िगरेशन अनुभाग में निम्नलिखित पंक्ति जोड़ने से BDAT विज्ञापन पूरी तरह से अक्षम हो जाता है, जिससे आक्रमण वेक्टर अवरुद्ध हो जाता है:
chunking_advertise_hosts =
खाली मान का अर्थ है "कोई होस्ट नहीं" — Exim अब EHLO प्रतिक्रियाओं में CHUNKING एक्सटेंशन का विज्ञापन नहीं करेगा। यह परिवर्तन करने के बाद Exim को पुनरारंभ करें:
# डेबियन / उबंटू
systemctl restart exim4
# अन्य systemd सिस्टम
systemctl restart exim
सत्यापित करें कि CHUNKING अब विज्ञापित नहीं है:
# कनेक्ट करें और EHLO प्रतिक्रिया जाँचें — CHUNKING दिखाई नहीं देना चाहिए
echo QUIT | openssl s_client -connect localhost:25 -starttls smtp 2>/dev/null \
| grep -i chunking
# कोई आउटपुट नहीं = CHUNKING अक्षम है
यह एक वर्कअराउंड है, फिक्स नहीं। कुछ भेजने वाले मेल सर्वर बड़े संदेश वितरण के लिए BDAT का उपयोग करते हैं। इसे अक्षम करने से उन प्रेषकों के साथ संगतता समस्याएँ हो सकती हैं। जितनी जल्दी हो सके 4.99.3 में अपग्रेड करें।
पैच किए गए सिस्टम पर भी, Exim systemd यूनिट में ये निर्देश जोड़ने से भविष्य में किसी भी मेमोरी भ्रष्टाचार कमजोरी के प्रभाव को कम किया जा सकता है:
# /etc/systemd/system/exim4.service.d/hardening.conf
[Service]
NoNewPrivileges=yes
MemoryDenyWriteExecute=yes
ProtectSystem=strict
PrivateTmp=yes
RestrictAddressFamilies=AF_INET AF_INET6
SystemCallFilter=@system-service
systemctl daemon-reload && systemctl restart exim4
ldd और strings पर निर्भर करती है, जो कम विश्वसनीय हो सकती है।