Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
servu-cve-2026-28318-poc — SolarWinds Serv-U CVE-2026-28318: сбой Content-Encoding: deflate без аутентификации. Анализ первопричины (недопустимое освобождение внутреннего указателя -> повреждение кучи) + PoC только для DoS. Исправлено в 15.5.4 Hotfix 1. | Kitploit
Инструменты/GitHubGitHub/eaea0001/servu-cve-2026-28318-poc
Криминалистика памятиАнализ уязвимостейЭксплуатацияТестирование на ПроникновениеАнализ Бинарных Файлов
GitHubeaea0001/servu-cve-2026-28318-poc

servu-cve-2026-28318-poc

SolarWinds Serv-U CVE-2026-28318: сбой Content-Encoding: deflate без аутентификации. Анализ первопричины (недопустимое освобождение внутреннего указателя -> повреждение кучи) + PoC только для DoS. Исправлено в 15.5.4 Hotfix 1.

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий
133 месяцев назадЕщё не проверено

CVE-2026-28318 — SolarWinds Serv-U «Content-Encoding: deflate» краш без аутентификации

Анализ первопричины + PoC для DoS. В публичном бюллетене эта уязвимость классифицируется как отказ в обслуживании / неконтролируемое потребление ресурсов без аутентификации. Бинарный анализ показывает, что основным дефектом является нарушение безопасности памяти: некорректный free() внутреннего указателя в пути декодирования HTTP deflate, который повреждает кучу процесса (STATUS_HEAP_CORRUPTION, 0xC0000374). Это не бомба декомпрессии, и краш не зависит от размера распакованных данных.


⚠️ Дисклеймер / область применения

  • Это оборонительное исследование безопасности уже исправленной, публично раскрытой уязвимости (исправление выпущено 2026-06-04 в Serv-U 15.5.4 Hotfix 1; указано в CISA KEV).
  • Приведённый здесь PoC только роняет экземпляр Serv-U, которым вы владеете или который вам явно разрешено тестировать. Это только DoS — удалённое выполнение кода не включено и не продемонстрировано (см. Серьёзность).
  • Используйте его для проверки статуса исправления и детектирования на своих собственных системах. Не направляйте его на системы, которыми вы не управляете. Вы несёте ответственность за соблюдение применимого законодательства.

Затронутые / Исправленные

Затрагивает только HTTP/HTTPS слушатель (веб/путь управления). FTP/FTPS/SFTP не находятся на этом пути кода.


Кратко

Любой HTTP-запрос с Content-Encoding: deflate и корректным телом deflate роняет сервис. Обработчик распаковывает тело, затем освобождает указатель на сжатое тело и подставляет распакованный буфер — но этот указатель является внутренним указателем в приёмный буфер HTTP (он указывает на тело, сразу после \r\n\r\n), а не базой выделения кучи. Вызов free() для небазового, невыровненного указателя повреждает кучу, и процесс завершается.

Поскольку ошибка в том, как освобождается указатель на тело, а не в том, сколько данных производится, даже тело размером ~25 байт (которое распаковывается в несколько КБ) стабильно вызывает краш. Потребление памяти не растёт; это не «zip/deflate-бомба».


Первопричина

Процедура декодирования deflate находится в RhinoNET.dll (сетевая библиотека Serv-U) и вызывается из пути приёма HTTP (ProcessReceive) после того, как парсер заголовков устанавливает флаг «deflate» при обнаружении Content-Encoding: deflate.

Упрощённо, процедура вызывается как decode(this, &bodyPtr, &bodyLen) и делает следующее:

root@kitploit:~
1. inflate bodyPtr[0..bodyLen]  -> наращивает аккумулирующий буфер `acc`   (штатный zlib, ограниченный, корректный)
2. free(*bodyPtr)                <-- *bodyPtr — это ВНУТРЕННИЙ указатель в приёмный буфер
3. *bodyPtr = acc                // заменяет сжатое тело распакованным буфером
4. *bodyLen = total

Шаг 2 — это ошибка. *bodyPtr не является независимо выделенным блоком: он указывает на тело запроса внутри единого приёмного буфера HTTP, т.е. receive_buffer + header_length. Освобождение внутреннего (и невыровненного по 16 байтам) указателя заставляет аллокатор интерпретировать область, подконтрольную атакующему, как заголовок блока кучи → повреждение метаданных кучи → 0xC0000374.

Что было исключено (чтобы вы не искали не там)

Обе «очевидные» гипотезы неверны, что проверено в рантайме:

  • Не переполнение при inflate/декомпрессии. Декомпрессор — это штатный zlib1.dll!inflate, который учитывает avail_out при каждом вызове (наблюдалось на 100+ чанках; ни одной записи за границы).
  • Не переполнение аккумулятора. Растущий выходной буфер выделяется как prev_total + produced + 1 на каждом шаге и записывается ровно столько же — плотно, без переполнения.

Повреждение вызвано исключительно некорректным free() на шаге 2.


Доказательства

Захвачено в рантайме (Frida) на Serv-U 15.5.4.108 при отправке запроса с Content-Encoding: deflate, тело которого распаковывается в "A" * 8192:

  • Освобождаемый указатель — …ce — mod 16 == 14. Базы выделения кучи выровнены по 16 байтам, поэтому это не база выделения; это внутренний указатель.
  • 48 байт до освобождаемого указателя — это хвост HTTP-заголовка, заканчивающийся на \r\n\r\n:
    root@kitploit:~
    …tream\r\nContent-Length: 26\r\nConnection: close\r\n\r\n
    
  • Байты по адресу освобождаемого указателя — это сырой deflate-поток (ed c1 01 0d 00 …).
  • Сигнатура краша: аварийный модуль ntdll.dll, исключение 0xC0000374 (STATUS_HEAP_CORRUPTION), при этом вызов исходит из free в deflate-обработчике RhinoNET.dll. Последняя операция с кучей перед крашем — это именно free(bodyPtr).
  • Независимость от размера: тело, распаковывающееся всего в ~4 КБ (сжатое ≈ несколько десятков байт), вызывает идентичный краш; рабочий набор памяти не растёт.

Серьёзность

  • Подтверждено: надёжный удалённый краш сервиса Serv-U без аутентификации (DoS). Сервис может перезапускаться автоматически, но повторные запросы удерживают его в нерабочем состоянии и могут исчерпать параметры восстановления службы Windows.
  • За пределами DoS — не доказано. Освобождаемый «заголовок блока» перекрывается с байтами HTTP-заголовка, контролируемыми атакующим, что в принципе является более сильным примитивом, чем простой DoS. Однако на современных Windows (Segment Heap) некорректный free быстро завершается ошибкой (0xC0000374) в нашем тестировании, и мы не добились выполнения кода. Рассматривайте это как pre-auth heap-corruption DoS с первопричиной в безопасности памяти; не предполагайте RCE.

Воспроизведение

Требуется Python 3 (только стандартная библиотека). Направьте его на HTTP-слушатель Serv-U, который вам разрешено тестировать. На Windows он использует один вызов Get-NetTCPConnection, чтобы узнать PID слушателя, и журнал приложений Windows, чтобы подтвердить краш из-за повреждения кучи.

root@kitploit:~
python poc_verify.py                       # по умолчанию 127.0.0.1:80, маленький пакет, 1 выстрел
python poc_verify.py --host <ip> --port 80
python poc_verify.py --big                 # тело распаковывается в 8192 байт
python poc_verify.py --shots 3
python poc_verify.py --no-events           # пропустить проверку журнала событий (не требует прав)

PoC формирует минимальный запрос:

root@kitploit:~
POST / HTTP/1.1
Host: <target>
Content-Encoding: deflate
Content-Type: application/octet-stream
Content-Length: <n>
Connection: close

<raw-deflate тело — даже несколько десятков байт достаточно>

Он сообщает PASS, если сервис упал (PID слушателя изменился / появилось событие 0xC0000374), и FAIL, если он выжил (уже исправлен, не затронут или тело не было обработано как deflate).


Смягчение

  1. Установите Serv-U 15.5.4 Hotfix 1 (или новее).
  2. Временно: перед Serv-U удаляйте или отклоняйте входящий Content-Encoding на HTTP/HTTPS слушателе, например на обратном прокси:
    root@kitploit:~
    if ($http_content_encoding) { return 400; }
    
  3. Ограничьте сетевую доступность веб/порта управления Serv-U.

Методология (как это анализировалось)

  • Статически: параметризованная дизассемблерная PE-разметка RhinoNET.dll / Serv-U.exe (база образа 0x180000000) для построения пути приём → разбор заголовков → deflate-декодирование и поиска ошибочного free.
  • Динамически: инструментирование живого сервиса через Frida — перехват декомпрессора для доказательства, что zlib учитывает avail_out, трассировка каждого alloc/free/memcpy декодирующего вызова на диск, а также обработчик исключений процесса для захвата аварийной инструкции и стека 0xC0000374 в момент повреждения. Освобождение внутреннего указателя затем было подтверждено дампом байтов вокруг освобождаемого указателя (хвост HTTP-заголовка + raw-deflate тело, невыровненное по 16 байтам).

Адреса, на которые даются ссылки в анализе, специфичны для сборки 15.5.4.108 и будут различаться между сборками.


Ссылки

  • SolarWinds — примечания к выпуску Serv-U 15.5.4 Hotfix 1
  • NVD — CVE-2026-28318
  • Каталог CISA KEV — CVE-2026-28318

Опубликовано как оборонительное исследование после доступности исправления от вендора. PoC предназначен только для DoS и для авторизованного тестирования.

Скачать инструмент
ПродуктSolarWinds Serv-U (FTP / MFT / File Server)
Уязвимые15.5.4 и более ранние в этой ветке без Hotfix 1 (анализ выполнен на сборке 15.5.4.108)
ИсправленныеServ-U 15.5.4 Hotfix 1 (выпущен 2026-06-04)
ВекторБез аутентификации, по сети (HTTP/HTTPS порт управления/веб)
Публичный классCWE-400 Неконтролируемое потребление ресурсов · DoS · CVSS 7.5 · CISA KEV
Фактический классCWE-763 Освобождение некорректного указателя / CWE-590 Освобождение памяти не из кучи → повреждение кучи