Уязвимость в продуктах Fortinet
Уязвимость в продуктах Fortinet
Категория: Программы Теги: Уязвимости Опубликовано: 6 июня 2025

Уязвимость BDU:2025-05439 (CVE-2025-32756) в продуктах Fortinet

Уязвимость BDU:2025-05439 (CVE-2025-32756) представляет собой критическое переполнение стекового буфера в обработчике HTTP-запросов компонента hostcheck_validate продуктов Fortinet (FortiVoice, FortiMail, FortiNDR, FortiRecorder, FortiCamera). Она возникает из-за отсутствия проверки границ при декодировании параметра AuthHash (или enc). Злоумышленник может отправлять специально сформированные запросы с переполнением буфера, что приводит к выполнению произвольного кода без аутентификации.

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

Уровень опасности: 9.8 CRITICAL (CVSS v3.1)
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

  • Attack Vector (AV):N — Сетевая атака (удалённо через интернет).

  • Attack Complexity (AC):L — Низкая сложность эксплуатации (не требует специальных условий).

  • Privileges Required (PR):N — Не нужны привилегии.

  • User Interaction (UI):N — Взаимодействие пользователя не требуется.

  • Scope (S):U — Уязвимость не затрагивает другие компоненты.

  • Confidentiality (C):H — Полное нарушение конфиденциальности.

  • Integrity (I):H — Полное нарушение целостности.

  • Availability (A):H — Полное нарушение доступности.

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

  • Доступ к веб-интерфейсу устройства на порту 443/TCP (публично доступен в большинстве сценариев).

  • Использование уязвимых версий ПО.

Уязвимые версии ПО

  • FortiNDR (Network Detection and Response) 1.5    
  • FortiNDR (Network Detection and Response) 1.4    
  • FortiNDR (Network Detection and Response) 1.3    
  • FortiNDR (Network Detection and Response) 1.2    
  • FortiNDR (Network Detection and Response) 1.1    
  • FortiNDR (Network Detection and Response) 7.1    
  • FortiCamera от 2.1.0 до 2.1.4    
  • FortiCamera 2.0    
  • FortiCamera 1.1    
  • FortiMail от 7.6.0 до 7.6.3    
  • FortiMail от 7.0.0 до 7.0.9    
  • FortiMail от 7.4.0 до 7.4.5    
  • FortiMail от 7.2.0 до 7.2.8    
  • FortiNDR (Network Detection and Response) до 7.6.1    
  • FortiNDR (Network Detection and Response) от 7.4.0 до 7.4.8    
  • FortiNDR (Network Detection and Response) от 7.2.0 до 7.2.5    
  • FortiNDR (Network Detection and Response) от 7.0.0 до 7.0.7    
  • FortiRecorder от 7.2.0 до 7.2.4    
  • FortiRecorder от 7.0.0 до 7.0.6    
  • FortiRecorder от 6.4.0 до 6.4.6    
  • FortiVoice до 7.2.1    
  • FortiVoice от 7.0.0 до 7.0.7    
  • FortiVoice от 6.4.0 до 6.4.11

Технический анализ эксплоита

Анализируемый PoC-код к CVE-2025-32756 демонстрирует двухэтапную атаку:

1. Подготовка буфера и вычисление соли

Эксплоит извлекает соль (seed) через запрос к /remote/info, необходимую для генерации keystream:

def get_salt(self):  
    response = self.session.get(f"{self.base_url}/remote/info", timeout=10)  
    self.salt = "e0b638ac"  # Пример статической соли (в реальности парсится из ответа)  

Зачем? Соль участвует в создании MD5-хеша для шифрования payload.

2. Генерация вредоносного payload

Payload конструируется из:

  • seed (фиксированное значение 00690000).

  • enc_length — длина данных, провоцирующая переполнение (5000 байт).

  • encrypted_data — шеллкод, зашифрованный через XOR с keystream:

def compute_keystream(self, initial_state, length):  
    keystream = ""  
    current = initial_state  
    while len(keystream) < length:  
        current = hashlib.md5(bytes.fromhex(current)).hexdigest()  
        keystream += current  
    return keystream[:length]  

3. Отправка эксплуатации

Эксплоит отправляет два запроса:

  1. Первый (payload1) подготавливает память (устанавливает NULL-байт).

  2. Второй (payload2) перезаписывает адрес возврата в стеке:

def send_exploit(self, payload):  
    url = f"{self.base_url}/remote/hostcheck_validate"  
    data = f"enc={urllib.parse.quote(payload)}"  
    self.session.post(url, data=data, headers=headers)  

Как достигается RCE? Переполнение перезаписывает адрес возврата функции, перенаправляя выполнение на шеллкод в encrypted_data. В архитектуре x86 стек растёт вниз, поэтому данные записываются поверх управляющих структур.


Защитные меры

1. Патчинг (приоритетно)

Обновить уязвимые продукты до версий:

  • FortiVoice: 7.2.1+, 7.0.7+, 6.4.11+

  • FortiCamera: 2.1.4+

  • FortiMail: 7.6.3+

2. Сегментация сети

  • Изолировать устройства Fortinet в отдельном VLAN.

  • Запретить прямой доступ к веб-интерфейсам из интернета (только через VPN).

3. Правила для Suricata/IPS

Добавить сигнатуры, блокирующие:

  • Попытки переполнения буфера через параметр enc:

alert http any any -> $HOME_NET 443 (  
    msg:"Fortinet CVE-2025-32756 Exploit Attempt";  
    flow:to_server;  
    http.uri; content:"/remote/hostcheck_validate";  
    http.method; content:"POST";  
    http.request_body; content:"enc="; pcre:"/enc=[0-9a-f]{500,}/";  
    sid:202532756;  
    rev:1;  
)  
  • Доступ к /remote/info без аутентификации:

alert http any any -> $HOME_NET 443 (  
    msg:"Fortinet Salt Extraction Attempt";  
    flow:to_server;  
    http.uri; content:"/remote/info";  
    http.method; content:"GET";  
    sid:202532757;  
)  

4. Харденинг веб-сервисов

  • Отключить неиспользуемые сервисы (например, remote/hostcheck_validate, если не нужен).

  • Принудительная валидация входных данных через WAF:

location ~* "/remote/hostcheck_validate" {  
    if ($arg_enc ~ "^.{500}") {  
        return 403;  
    }  
}  

5. Мониторинг аномалий

  • SIEM-правила для выявления частых запросов к hostcheck_validate.

  • Алармы на подозрительную активность в логах Forti-устройств (например, многократные сбои декодирования enc).


Заключение

Уязвимости класса buffer overflow остаются критически опасными из-за ошибок управления памятью в низкоуровневом коде. BDU:2025-05439 (CVE-2025-32756) демонстрирует необходимость:

  • Автоматизированного тестирования на переполнение буферов (инструменты: AFL, Valgrind).

  • Глубокой защиты (ASLR, DEP) даже в firmware-устройствах.

  • Патч-менеджмента как обязательной практики для embedded-систем.

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