
Безопасно определять, уязвим ли хост SolarWinds Serv-U к CVE-2026-28318
Безопасный, недеструктивный детектор для CVE-2026-28318, неаутентифицированного отказа в обслуживании в SolarWinds Serv-U <= 15.5.4.108. Один POST, содержащий Content-Encoding: deflate и тело, передаёт это тело декомпрессору deflate в памяти (CZLibCompression), при управлении буфером которого происходит недопустимый вызов free(), что аварийно завершает процесс службы Serv-U. (CVSS 7.5, AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, CWE-763.)
Этот скрипт не приводит к сбою цели. Он отвечает на один вопрос для каждого хоста: отсутствует ли исправление 15.5.4 HF1? Это точный индикатор того, уязвим ли сервер к CVE-2026-28318.
Да. В этом и заключается смысл инструмента, и его безопасно запускать в производственной среде:
deflate. deflate — это единственное значение Content-Encoding, которое запускает уязвимый декомпрессор. Скрипт отправляет один POST с безвредным Content-Encoding: identity и коротким телом, которое никогда не достигает аварийного пути выполнения кода.15.5.4.125) отвергает любой запрос, содержащий тело и непустой Content-Encoding, с кодом 415 Unsupported Media Type. У уязвимых сборок такого шлюза нет, и они обрабатывают проверочный identity обычным образом. Таким образом, вердикт основывается исключительно на коде состояния, и служба никогда не дестабилизируется.Скрипт отправляет один безопасный POST в корневой каталог сайта и считывает код состояния:
Цель идентифицируется как Serv-U по собственному заголовку Server в ответе на проверочный запрос, поэтому отдельный запрос на идентификацию не требуется.
Он доказывает, что исправление отсутствует; он не приводит к сбою службы для подтверждения. Вердикт
VULNERABLEозначает, что шлюз проверки входных данных HF1 отсутствует, что является точным индикатором для данной CVE. Скрипт намеренно останавливается на этом, не отправляя аварийное значениеdeflate.
# один хост (схема по умолчанию https://)
./cve_2026_28318_check.py 10.0.0.5
# явный URL / порт
./cve_2026_28318_check.py https://10.0.0.5:443
# несколько хостов одновременно
./cve_2026_28318_check.py host-a:443 host-b https://host-c
# сканирование списка, одна цель на строку (допускаются комментарии '#'), компактный вывод
./cve_2026_28318_check.py -f targets.txt --brief
# машинно-читаемый вывод для конвейеров
./cve_2026_28318_check.py -f targets.txt --json > results.json
Уязвимый сервер Serv-U (маркер [!] и VULNERABLE отображаются красным на TTY):
$ ./cve_2026_28318_check.py https://10.0.0.5
[!] https://10.0.0.5: VULNERABLE [missing-415-gate]
Serv-U вернул 401 (не 415) на проверочный identity, поэтому шлюз 415 из HF1 ОТСУТСТВУЕТ (сборка <= 15.5.4.108) и CVE-2026-28318 не исправлена. Это доказывает, что исправление отсутствует; НЕ вызывает сбой службы. Примените 15.5.4 HF1 (сборка 15.5.4.125+).
Исправленный сервер возвращает PATCHED (шлюз 415 из HF1 ответил на проверочный identity):
$ ./cve_2026_28318_check.py https://10.0.0.6
[+] https://10.0.0.6: PATCHED [hf1-415-gate]
Serv-U вернул 415 на проверочный identity, поэтому шлюз проверки входных данных 15.5.4 HF1 присутствует (сборка >= 15.5.4.125). Уязвимости к CVE-2026-28318 нет.
Сканирование списка, одна выровненная строка на хост (--brief). Код завершения 1, если хотя бы один хост VULNERABLE, иначе 0, что удобно в скриптах:
$ ./cve_2026_28318_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE https://10.0.0.5 missing-415-gate
PATCHED https://10.0.0.6 hf1-415-gate
NOT-SERV-U https://10.0.0.7 not-servu
ERROR https://10.0.0.8 no-response
exit: 1
Машинно-читаемый вывод для конвейеров (--json):
$ ./cve_2026_28318_check.py https://10.0.0.5 --json
[
{
"target": "https://10.0.0.5",
"verdict": "VULNERABLE",
"reason": "missing-415-gate",
"detail": "Serv-U returned 401 (not 415) to the identity probe, so the HF1 415 gate is ABSENT (build <= 15.5.4.108) and CVE-2026-28318 is unpatched. This proves the fix is missing; it does NOT crash the service. Apply 15.5.4 HF1 (build 15.5.4.125+)."
}
]
| Код | Значение |
|---|---|
0 | Ни одна цель не была VULNERABLE |
1 | Хотя бы одна цель VULNERABLE |
2 | Ошибка использования (неверные аргументы / нечитаемый файл целей) |
Server (сообщается как NOT-SERV-U) или ответить собственным кодом 415 (возможное ложное PATCHED). По возможности направляйте инструмент непосредственно на интерфейс управления Serv-U.VULNERABLE доказывает, что исправление проверки входных данных HF1 отсутствует; он не демонстрирует сбой (преднамеренно). Этот шлюз является точным индикатором для данной CVE.Обновитесь до SolarWinds Serv-U 15.5.4 Hotfix 1 (сборка 15.5.4.125) или новее, в котором добавлен шлюз проверки входных данных, отклоняющий запросы, содержащие как тело, так и непустой Content-Encoding. Пока вы не можете установить патч, ограничьте сетевой доступ к сервису Serv-U только доверенными источниками.
Этот код распространяется под лицензией MIT.
Использование этого инструмента для атак на цели без предварительного взаимного согласия незаконно. Конечный пользователь несёт ответственность за соблюдение всех применимых местных, государственных и федеральных законов. Разработчики не несут никакой ответственности и не отвечают за любое неправомерное использование или ущерб, причинённый этой программой.
Ответ на проверочный identity | Вердикт | Значение |
|---|
Заголовок сервера Serv-U, статус ≠ 415 (например, 401 / 404 / 200 / 302) | VULNERABLE [missing-415-gate] | Шлюз 415 из HF1 отсутствует, значит сборка <= 15.5.4.108, CVE-2026-28318 не исправлена. |
Заголовок сервера Serv-U, статус = 415 | PATCHED [hf1-415-gate] | Шлюз проверки входных данных HF1 присутствует, значит сборка >= 15.5.4.125. Уязвимости нет. |
Ответ получен, но заголовок сервера Serv-U отсутствует | NOT-SERV-U [not-servu] | Не сервер Serv-U, или прокси удалил заголовок. |
| Нет ответа / ошибка соединения | ERROR [no-response] | HTTP-сервис недоступен, фильтрация, ошибка TLS или таймаут. |
| Флаг | Описание |
|---|
targets | Один или несколько HOST[:PORT] или URL (схема по умолчанию https://) |
-t, --target TARGET | Добавить цель (можно повторять) |
-f, --file FILE | Читать цели из файла (по одной на строку; комментарии #) |
-b, --brief | Одна выровненная строка на цель, идеально для сканирования многих хостов |
--json | Вывод структурированных результатов в JSON |
--no-color | Отключить цветной вывод (также учитывает NO_COLOR и не-TTY) |
--timeout SECS | Таймаут на один запрос (по умолчанию: 10) |
-v, --verbose | Показать отправленный запрос и сырые заголовки ответа |
| Вердикт | Тег причины | Значение |
|---|
VULNERABLE | missing-415-gate | Сервер Serv-U без шлюза 415 из HF1, значит сборка <= 15.5.4.108, CVE-2026-28318 не исправлена. Немедленно установите патч. |
PATCHED | hf1-415-gate | Сервер Serv-U, отвечающий на проверочный identity кодом 415, значит исправление HF1 присутствует (сборка >= 15.5.4.125). |
NOT-SERV-U | not-servu | Ответ получен, но заголовок сервера Serv-U отсутствует; это не Serv-U, или прокси удалил заголовок. |
ERROR | no-response | Нет полезного HTTP-ответа (нет службы на этом порту, фильтрация, ошибка TLS или таймаут). |
ERROR | bad-target | Не удалось разобрать аргумент цели. |