
Безопасно определять, уязвим ли хост 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 в корневой каталог сайта и считывает код состояния:
Ответ на проверочный 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 или таймаут. |
Цель идентифицируется как 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
| Флаг | Описание |
|---|---|
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 | Показать отправленный запрос и сырые заголовки ответа |
Уязвимый сервер 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+)."
}
]
| Вердикт | Тег причины | Значение |
|---|---|---|
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 | Не удалось разобрать аргумент цели. |
| Код | Значение |
|---|---|
0 | Ни одна цель не была VULNERABLE |
1 | Хотя бы одна цель VULNERABLE |
2 | Ошибка использования (неверные аргументы / нечитаемый файл целей) |
Server (сообщается как NOT-SERV-U) или ответить собственным кодом 415 (возможное ложное PATCHED). По возможности направляйте инструмент непосредственно на интерфейс управления Serv-U.VULNERABLE доказывает, что исправление проверки входных данных HF1 отсутствует; он не демонстрирует сбой (преднамеренно). Этот шлюз является точным индикатором для данной CVE.