FlawOpen

flawopen.com/Teardowns/cve-2026-104286-fortimail-ibe-path-traversal

● CVE-2026-104286 · CVSS 9.8[7] · अति गंभीर
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-104286: FortiMail में IBE पाथ ट्रैवर्सल

CVE-2026-104286 बिना प्रमाणीकरण वाले HTTP(S) अनुरोधों से path traversal द्वारा कमजोर FortiMail पर फ़ाइलें लिखने देता है। Fortinet सक्रिय दोहन की पुष्टि करता है; IBE बंद करें या web पहुँच सीमित करें, जाँच करें और अपडेट करें।[1], [5]

💡 आसान भाषा में (ELI5)

डाक-कक्ष की कल्पना करें जहाँ कर्मचारी संलग्न फ़ाइलें सही फ़ोल्डर में रखते हैं। यह दोष अनुरोध को भ्रामक फ़ोल्डर-पथ देकर फ़ाइल को तय जगह से बाहर लिखवा सकता है। अस्थायी उपाय IBE बंद करना या web interface तक पहुँच सीमित करना है, फिर अपडेट और पुराने प्रवेश की जाँच करें।[1], [5]

इस पेज के मुख्य शब्द

Path traversal (CWE-22)
अविश्वसनीय path घटक फ़ाइल संचालन के लिए तय निर्देशिका से बाहर निकल जाते हैं। Fortinet प्रभावित FortiMail पर मनमानी फ़ाइल लिखने की बात कहता है।[1], [6]
Identity-Based Encryption (IBE)
FortiMail का encrypted-message workflow फीचर। विक्रेता का अस्थायी उपाय IBE बंद करना है; परिचालन प्रभाव जाँचें।[1], [5]
CISA KEV
CISA ने 1 अक्तूबर 2026 को CVE-2026-104286 को KEV में जोड़ा। यह ज्ञात दोहन दिखाता है, किसी खास appliance के compromise का प्रमाण नहीं।[2], [5]
संस्करण-सीमा में अंतर
Fortinet सारांश और सरकारी सूचनाएँ 7.2, 7.4, 7.6 और 8.0 शाखाएँ बताती हैं; CNA का structured data 7.0 भी बताता है। 7.0 के लिए Fortinet से पुष्टि लें।[6], [5], [4]

फ्रेमवर्क मैपिंग

मूल कारण विश्लेषण (Root Cause)

Fortinet CVE-2026-104286 को path-traversal दोष बताता है, जिससे बिना प्रमाणीकरण HTTP या HTTPS अनुरोध मनमानी फ़ाइलें लिख सकते हैं। FortiMail firmware बंद स्रोत है और सार्वजनिक advisory में vulnerable source lines या patch diff नहीं हैं; यह लेख उन्हें गढ़ता नहीं। सार्वजनिक सरकारी advisories मनमानी फ़ाइल लिखने के प्रभाव, शोषण और संस्करण मार्गदर्शन की पुष्टि करती हैं, लेकिन FortiMail के आंतरिक handler का विवरण नहीं देतीं। IBE बंद करने या web पहुँच सीमित करने का अस्थायी उपाय और प्रकाशित IOC Fortinet advisory से लिए गए हैं। उपकरण को सीमित करें, जाँच करें, फिर उपयुक्त fixed release लगाएँ; IOC न मिलने से सुरक्षा सिद्ध नहीं होती। CVE record का गद्य 7.2.0–7.2.9, 7.4.0–7.4.8, 7.6.0–7.6.6 और 8.0.0–8.0.1 बताता है। उसी record की structured version table 7.4 और 7.6 की कम ऊपरी सीमाएँ बताती है और 7.0.0–7.0.9 भी जोड़ती है। उसका solutions भाग इससे भी पहले के “आगामी” संस्करण 7.4.8, 7.6.6, 8.0.1 और 7.2.10 बताता है, जो प्रभावित-संस्करण डेटा और 1 अक्टूबर की कनाडाई सलाह से टकराते हैं। उस दिनांकित सरकारी सलाह को प्रकाशित संचालन-मार्गदर्शन मानें और मौजूदा उपलब्धता तथा 7.0 की स्थिति Fortinet से जाँचें; परस्पर-विरोधी CNA फ़ील्ड से ठीक संस्करण का अनुमान न लगाएँ।[1], [3], [5], [4], [6], [7]

ऑपरेटर मैट्रिक्स: संस्करण सीमा और शुरुआती प्रतिक्रिया

क्षेत्रआधिकारिक स्रोत क्या बताते हैंरक्षक की कार्रवाई
FortiMail 7.0NVD/CNA डेटा में 7.0.0–7.0.9 शामिल हैं; कनाडा और फ्रांस के आधिकारिक सारांश 7.0 शाखा का उल्लेख नहीं करते। उसी record के विवरण और तालिका में 7.4 तथा 7.6 की ऊपरी सीमाएँ भी अलग हैं। solutions भाग में कम “आगामी” बिल्ड (7.4.8, 7.6.6, 8.0.1 और 7.2.10) भी हैं, जो प्रभावित सीमा और कनाडाई सलाह से टकराते हैं।Fortinet से शाखा की स्थिति की पुष्टि करें; छूटे हुए उल्लेख को सुरक्षित होने का प्रमाण न मानें।
FortiMail 7.2कनाडा की सलाह 7.4 शाखा या उससे नए संस्करण पर जाने को कहती है।समर्थित और ठीक की गई शाखा पर माइग्रेशन की योजना बनाएं; 7.2 पैच उपलब्ध होने का अनुमान न लगाएं।
FortiMail 7.4 / 7.6 / 8.0कनाडा की सलाह में क्रमशः 7.4.9, 7.6.7 और 8.0.2 को ठीक किए गए संस्करण बताया गया है।प्रकाशित बिल्ड मार्गदर्शन के लिए कनाडा की AV26-989 सलाह का उपयोग करें; अपडेट से पहले Fortinet की मौजूदा advisory में उपलब्धता और समर्थन जाँचें। पुष्टि के बिना कम CNA सीमा न अपनाएँ।
रोकथाम और जांचFortinet ने सक्रिय शोषण की सूचना दी और IOC प्रकाशित किए; अस्थायी उपाय IBE बंद करना या वेब पहुंच सीमित करना है।सबूत सुरक्षित रखें, अस्थायी उपाय लागू करें, विक्रेता के IOC जांचें, फिर पैच करें और संभावित समझौते का आकलन करें।

हमले का चरण-दर-चरण प्रवाह

चरण 1

बिना प्रमाणीकरण का अनुरोध web workflow तक पहुँचता है

Fortinet के अनुसार विशेष HTTP या HTTPS अनुरोध बिना credentials के दोष सक्रिय कर सकते हैं। सार्वजनिक advisory आंतरिक handler नहीं बताती।[1], [5], [4]

चरण 2

पथ तय सीमा से बाहर जाता है

विक्रेता इसे path traversal (CWE-22) कहता है, जिससे प्रभावित FortiMail पर फ़ाइल लिखी जा सकती है। CVE विवरण से किसी खास persistence तरीके का अनुमान न लगाएँ।[1], [6], [5]

चरण 3

लिखी गई फ़ाइलें आगे असर कर सकती हैं

Fortinet का आकलन CVSS 3.1 9.8 Critical है और वह सक्रिय दोहन बताता है। जाँच में मौजूदा vendor IOC देखें।[1], [5], [4]

चरण 4

शमन करें, साक्ष्य बचाएँ और अपडेट करें

IBE बंद करें या web पहुँच विश्वसनीय नेटवर्क तक सीमित करें। Logs और configuration सुरक्षित रखें, IOC जाँचें और शाखा का सही fixed release लगाएँ।[1], [5]

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

FortiMail firmware और vendor patch diff सार्वजनिक नहीं हैं, इसलिए यह Python का एक सामान्य defense pattern है—Fortinet का code या vulnerability reproduction नहीं। यह भरोसेमंद directory को एक बार खोलता है, server-generated opaque filename उपयोग करता है, और exclusive-create तथा no-follow flags के साथ उसी directory descriptor के सापेक्ष नई file बनाता है। यह POSIX-specific है और आवश्यक flags अनुपलब्ध हों तो सुरक्षित रूप से रुकता है। Nested paths के लिए directory descriptors से एक बार में एक validated component पर चलें; string path जाँचकर बाद में उसी नाम से दोबारा न खोलें। CVE-2026-104286 के remediation के लिए Fortinet का supported update या आधिकारिक workaround लागू करें। Configured root path के सभी components और parent directories administrator के नियंत्रण में रहने चाहिए; root खोलते समय O_NOFOLLOW केवल अंतिम component की सुरक्षा करता है।

कमज़ोर कार्यान्वयन
from pathlib import Path

def destination(root: Path, request_path: str) -> Path:
    # असुरक्षित डिज़ाइन का उदाहरण: अनुरोध इनपुट जोड़ें
    # लेकिन अनुमत रूट के भीतर होने की जाँच न करें।
    return root / request_path
सुरक्षित और सुदृढ़ फ़िक्स
import os
import uuid

# भरोसेमंद service directory एक बार खोलें; इसके parent path directories administrator के नियंत्रण में हों।

def open_upload_root(root):
    required = ("O_DIRECTORY", "O_NOFOLLOW")
    if not all(hasattr(os, flag) for flag in required) or os.open not in os.supports_dir_fd:
        raise RuntimeError("POSIX directory protections unavailable")
    flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW
    return os.open(root, flags)

# Request path को file path में न बदलें; opaque नाम server से बनाएँ।
# नाम पहले से हो तो O_EXCL विफल होता है; O_NOFOLLOW अंतिम symlink को रोकता है।
ROOT_FD = open_upload_root("/srv/app-private/uploads")


def create_upload_file():
    name = uuid.uuid4().hex
    flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_NOFOLLOW
    fd = os.open(name, flags, 0o600, dir_fd=ROOT_FD)
    return name, fd

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत