FlawOpen

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

● CVE-2026-104286 · CVSS 9.8[7] · Критический
Исследования · FlawOpen

CVE-2026-104286: обход пути в IBE FortiMail

CVE-2026-104286 позволяет неаутентифицированным HTTP(S)-запросам записывать файлы на уязвимые системы FortiMail через обход пути. Fortinet сообщает об активной эксплуатации; отключите IBE или ограничьте веб-доступ, расследуйте и обновите систему.[1], [5]

💡 Простыми словами (ELI5)

Представьте почтовую комнату, где сотрудник раскладывает вложения по папкам. Ошибка позволяет запросу указать обманный путь и записать файл за пределами нужной папки. Временная мера закрывает IBE или ограничивает доступ к веб-интерфейсу, пока администраторы обновляют устройство и ищут следы прежнего доступа.[1], [5]

Ключевые понятия и термины

Обход пути (CWE-22)
Недоверенные компоненты пути выходят за границы целевого каталога. Fortinet описывает произвольную запись файлов на затронутых системах FortiMail.[1], [6]
Identity-Based Encryption (IBE)
Функция FortiMail для сценариев шифрования сообщений. Временная мера производителя — отключить IBE; оцените влияние на процессы почты.[1], [5]
CISA KEV
1 октября 2026 года CISA добавила CVE-2026-104286 в каталог KEV. Это подтверждает известную эксплуатацию, но не взлом конкретного устройства.[2], [5]
Расхождение версий
Сводка Fortinet и государственные уведомления указывают ветки 7.2, 7.4, 7.6 и 8.0; структурированные данные CNA также включают 7.0. Уточните 7.0 у Fortinet.[6], [5], [4]

Связи со стандартами

Анализ первопричины

Fortinet описывает CVE-2026-104286 как обход пути, позволяющий неаутентифицированным HTTP- или HTTPS-запросам записывать произвольные файлы. Прошивка закрытая; публичное уведомление не содержит уязвимых строк или diff исправления, поэтому статья не выдумывает их. Публичные государственные уведомления подтверждают запись произвольных файлов, эксплуатацию и рекомендации по версиям, но не описывают внутренний обработчик FortiMail. Уведомление Fortinet — источник временной меры отключить IBE или ограничить веб-доступ, а также опубликованных IOC. Ограничьте доступ к устройству, расследуйте возможную компрометацию, затем установите подходящий исправленный выпуск; отсутствие совпадений IOC не доказывает безопасность. В текстовом описании записи CVE указаны 7.2.0–7.2.9, 7.4.0–7.4.8, 7.6.0–7.6.6 и 8.0.0–8.0.1. В структурированной таблице указаны более низкие верхние границы для 7.4 и 7.6, а также добавлены 7.0.0–7.0.9. Раздел решений той же записи называет более ранние будущие выпуски — 7.4.8, 7.6.6, 8.0.1 и 7.2.10, — что противоречит данным о затронутых версиях и канадскому уведомлению от 1 октября. Используйте это датированное уведомление госоргана как опубликованное руководство к действию и уточните у Fortinet текущую доступность выпусков и статус 7.0; не выводите исправленную версию из противоречивых полей CNA.[1], [3], [5], [4], [6], [7]

Матрица для операторов: версии и первичные меры

ОбластьЧто указано в официальных источникахДействие защитника
FortiMail 7.0Данные NVD/CNA указывают версии 7.0.0–7.0.9; в официальных сводках Канады и Франции ветка 7.0 не указана. Описание и таблица той же записи также расходятся по верхним границам для 7.4 и 7.6. В разделе решений также указаны более ранние будущие выпуски (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. Не полагайтесь на более низкие пороги CNA без подтверждения.
Сдерживание и расследованиеFortinet сообщает об эксплуатации и публикует индикаторы компрометации; временная мера — отключить IBE или ограничить веб-доступ.Сохраните доказательства, примените временную меру, проверьте индикаторы Fortinet, установите обновление и оцените возможную компрометацию.

Пошаговый сценарий атаки

Шаг 1

Запрос без аутентификации достигает веб-функции

Fortinet сообщает, что специально сформированный HTTP- или HTTPS-запрос может вызвать проблему без учётных данных. Внутренний обработчик публично не раскрыт.[1], [5], [4]

Шаг 2

Путь выходит за предполагаемую границу

Поставщик классифицирует проблему как обход пути (CWE-22), позволяющий записывать файлы на FortiMail. Не выводите конкретную технику закрепления только из описания CVE.[1], [6], [5]

Шаг 3

Записанные файлы могут усилить последствия

Fortinet оценивает уязвимость как CVSS 3.1 9,8 Critical и сообщает об активной эксплуатации. Используйте текущие IOC производителя для расследования.[1], [5], [4]

Шаг 4

Ограничьте доступ, сохраните доказательства и обновите

Отключите IBE или ограничьте веб-доступ доверенными сетями. Сохраните журналы и конфигурацию, проверьте IOC и установите исправленную версию ветки.[1], [5]

Исходный код: Уязвимый vs Защищённый вариант

Исходный код прошивки FortiMail и diff исправления недоступны, поэтому это общий шаблон защиты на Python, а не код Fortinet и не воспроизведение уязвимости. Он один раз открывает доверенный каталог, использует непрозрачное имя, созданное сервером, и создаёт новый файл относительно дескриптора каталога с эксклюзивным созданием и флагами запрета перехода по ссылкам. Пример предназначен для POSIX и безопасно прекращает работу, если нужные флаги недоступны. Для вложенных путей проходите по одному проверенному компоненту через дескрипторы каталогов; не проверяйте строковый путь, чтобы затем снова открыть его по имени. Для CVE-2026-104286 установите поддерживаемое обновление Fortinet или примените официальную временную меру. Все компоненты настроенного корневого пути, включая родительские каталоги, должны оставаться под контролем администратора; при открытии O_NOFOLLOW защищает только последний компонент.

УЯЗВИМАЯ РЕАЛИЗАЦИЯ
from pathlib import Path

def destination(root: Path, request_path: str) -> Path:
    # Небезопасная схема: ввод запроса объединяется с путем
    # без проверки границ разрешенного каталога.
    return root / request_path
БЕЗОПАСНЫЙ ИСПРАВЛЕННЫЙ ВАРИАНТ
import os
import uuid

# Один раз откройте доверенный каталог службы; родительские каталоги пути должны контролироваться администратором.

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)

# Не преобразуйте путь запроса в путь файла; создавайте непрозрачное имя.
# O_EXCL завершится ошибкой, если имя занято; O_NOFOLLOW отклонит конечную ссылку.
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

Чек-лист по защите системы для инженеров

Источники