
Detectar de forma segura si un host de SolarWinds Serv-U es vulnerable a CVE-2026-28318
Un detector seguro, no destructivo para CVE-2026-28318, una denegación de servicio no autenticada en SolarWinds Serv-U <= 15.5.4.108. Una única POST que lleva Content-Encoding: deflate y un cuerpo alimenta ese cuerpo a un descompresor deflate en memoria (CZLibCompression) cuya gestión de búfer realiza un free() inválido, abortando el proceso del servicio Serv-U. (CVSS 7.5, AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, CWE-763.)
Este script no bloquea el objetivo. Responde una pregunta por host: ¿falta la corrección 15.5.4 HF1? Eso es un proxy exacto de si el servidor es vulnerable a CVE-2026-28318.
Sí. Este es el objetivo principal de la herramienta, y es seguro ejecutarla contra producción:
deflate. deflate es el único valor de Content-Encoding que inicia el descompresor vulnerable. El script envía una única POST con un benigno Content-Encoding: identity y un cuerpo corto, que nunca llega a la ruta de código que causa el bloqueo.15.5.4.125) rechaza cualquier solicitud que tenga un cuerpo y un Content-Encoding no vacío con 415 Unsupported Media Type. Las builds vulnerables no tienen esa compuerta y manejan la sonda identity normalmente. Por lo tanto, el veredicto se basa puramente en el código de estado, y el servicio nunca se desestabiliza.El script envía una POST segura a la raíz del sitio y lee el código de estado:
El objetivo se identifica como Serv-U a partir de la cabecera Server de la respuesta de la sonda, por lo que no se necesita una solicitud de identificación separada.
Prueba que la corrección falta; no bloquea el servicio para confirmarlo. Un veredicto
VULNERABLEsignifica que la compuerta de validación de entrada HF1 está ausente, lo cual es un proxy exacto para este CVE. El script se detiene deliberadamente ahí en lugar de enviar el valordeflateque causa el bloqueo.
# single host (scheme defaults to https://)
./cve_2026_28318_check.py 10.0.0.5
# explicit URL / port
./cve_2026_28318_check.py https://10.0.0.5:443
# several hosts at once
./cve_2026_28318_check.py host-a:443 host-b https://host-c
# scan a list, one target per line ('#' comments allowed), compact output
./cve_2026_28318_check.py -f targets.txt --brief
# machine-readable output for pipelines
./cve_2026_28318_check.py -f targets.txt --json > results.json
Un servidor Serv-U vulnerable (el marcador [!] y VULNERABLE se muestran en rojo en una TTY):
$ ./cve_2026_28318_check.py https://10.0.0.5
[!] https://10.0.0.5: VULNERABLE [missing-415-gate]
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+).
Un servidor parcheado devuelve PATCHED (la compuerta 415 de HF1 respondió a la sonda identity):
$ ./cve_2026_28318_check.py https://10.0.0.6
[+] https://10.0.0.6: PATCHED [hf1-415-gate]
Serv-U returned 415 to the identity probe, so the 15.5.4 HF1 input-validation gate is present (build >= 15.5.4.125). Not vulnerable to CVE-2026-28318.
Escanear una lista, una línea alineada por host (--brief). El código de salida es 1 si algún host es VULNERABLE, de lo contrario 0, lo cual es útil en scripts:
$ ./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
Salida legible por máquina para pipelines (--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+)."
}
]
| Código | Significado |
|---|---|
0 | Ningún objetivo fue VULNERABLE |
1 | Al menos un objetivo es VULNERABLE |
2 | Error de uso (argumentos incorrectos / archivo de objetivos ilegible) |
Server (reportado como NOT-SERV-U) o responder con su propio 415 (un posible falso PATCHED). Apunte la herramienta directamente a la interfaz de administración de Serv-U siempre que sea posible.VULNERABLE prueba que la corrección de validación de entrada HF1 está ausente; no demuestra el bloqueo (por diseño). Esa compuerta es un proxy exacto para este CVE.Actualizar a SolarWinds Serv-U 15.5.4 Hotfix 1 (build 15.5.4.125) o posterior, que añade la compuerta de validación de entrada que rechaza una solicitud que lleva tanto un cuerpo como un Content-Encoding no vacío. Hasta que pueda parchear, restrinja el acceso de red al servicio Serv-U a fuentes confiables.
Este código se distribuye bajo una licencia MIT.
El uso de esta herramienta para atacar objetivos sin consentimiento mutuo previo es ilegal. Es responsabilidad del usuario final cumplir con todas las leyes locales, estatales y federales aplicables. Los desarrolladores no asumen ninguna responsabilidad y no son responsables de ningún uso indebido o daño causado por este programa.
Respuesta de sonda identity | Veredicto | Significado |
|---|
Cabecera Serv-U Server, estado ≠ 415 (ej. 401 / 404 / 200 / 302) | VULNERABLE [missing-415-gate] | La compuerta 415 de HF1 está ausente, por lo tanto build <= 15.5.4.108, CVE-2026-28318 sin parche. |
Cabecera Serv-U Server, estado = 415 | PATCHED [hf1-415-gate] | Compuerta de validación de entrada HF1 presente, por lo tanto build >= 15.5.4.125. No vulnerable. |
Respondió, pero sin cabecera Serv-U Server | NOT-SERV-U [not-servu] | No es un servidor Serv-U, o un proxy eliminó la cabecera. |
| Sin respuesta utilizable / fallo de conexión | ERROR [no-response] | No hay servicio HTTP alcanzable, filtrado, error TLS, o tiempo de espera. |
| Indicador | Descripción |
|---|
targets | Uno o más HOST[:PORT] o URL (el esquema por defecto es https://) |
-t, --target TARGET | Añadir un objetivo (repetible) |
-f, --file FILE | Leer objetivos de un archivo (uno por línea; comentarios con #) |
-b, --brief | Una línea alineada por objetivo, ideal para escanear muchos hosts |
--json | Emitir resultados JSON estructurados |
--no-color | Deshabilitar salida coloreada (también respeta NO_COLOR y no TTY) |
--timeout SECS | Tiempo de espera por sonda (por defecto: 10) |
-v, --verbose | Mostrar la sonda enviada y las cabeceras de respuesta en bruto |
| Veredicto | Etiqueta de razón | Significado |
|---|
VULNERABLE | missing-415-gate | Servidor Serv-U sin compuerta 415 de HF1, por lo tanto build <= 15.5.4.108, CVE-2026-28318 sin parche. Parchear inmediatamente. |
PATCHED | hf1-415-gate | Servidor Serv-U que responde a la sonda identity con 415, por lo tanto la corrección HF1 está presente (build >= 15.5.4.125). |
NOT-SERV-U | not-servu | Respondió, pero sin cabecera Serv-U Server; no es Serv-U, o un proxy la eliminó. |
ERROR | no-response | Sin respuesta HTTP utilizable (sin servicio en ese puerto, filtrado, error TLS o tiempo de espera). |
ERROR | bad-target | El argumento del objetivo no pudo ser analizado. |