
Détecter en toute sécurité si un hôte SolarWinds Serv-U est vulnérable à CVE-2026-28318
Un détecteur sûr, non destructif pour CVE-2026-28318, un déni de service non authentifié dans SolarWinds Serv-U <= 15.5.4.108. Une seule POST qui transporte Content-Encoding: deflate et un corps alimente ce corps à un décompresseur deflate en mémoire (CZLibCompression) dont la gestion de tampon effectue un free() invalide, interrompant le processus du service Serv-U. (CVSS 7.5, AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, CWE-763.)
Ce script ne fait pas planter la cible. Il répond à une question par hôte : le correctif 15.5.4 HF1 est-il manquant ? C'est un proxy exact pour savoir si le serveur est vulnérable à CVE-2026-28318.
Oui. C'est tout l'intérêt de l'outil, et il est sûr à exécuter contre la production :
deflate. deflate est la seule valeur de Content-Encoding qui démarre le décompresseur vulnérable. Le script envoie une seule POST avec un Content-Encoding: identity bénin et un corps court, qui n'atteint jamais le chemin de code plantant.15.5.4.125) rejette toute requête qui a un corps et un Content-Encoding non vide avec 415 Unsupported Media Type. Les builds vulnérables n'ont pas de telle porte et traitent normalement la sonde identity. Ainsi le verdict repose uniquement sur le code de statut, et le service n'est jamais déstabilisé.Le script envoie une POST sécurisée à la racine du site et lit le code de statut :
La cible est identifiée comme Serv-U grâce à l'en-tête Server de la réponse de la sonde, donc aucune requête d'identification séparée n'est nécessaire.
Cela prouve que le correctif est manquant ; cela ne fait pas planter le service pour confirmer. Un verdict
VULNERABLEsignifie que la porte de validation d'entrée du HF1 est absente, ce qui est un proxy exact pour cette CVE. Le script s'arrête délibérément là plutôt que d'envoyer la valeurdeflatequi fait planter.
# 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 serveur Serv-U vulnérable (le marqueur [!] et VULNERABLE s'affichent en rouge sur un 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 serveur corrigé renvoie PATCHED (la porte 415 du HF1 a répondu à la sonde 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.
Scanner une liste, une ligne alignée par hôte (--brief). Le code de sortie est 1 si un hôte est VULNERABLE, sinon 0, ce qui est pratique dans les 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
Sortie lisible par machine pour les 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+)."
}
]
| Code | Signification |
|---|---|
0 | Aucune cible n'était VULNERABLE |
1 | Au moins une cible est VULNERABLE |
2 | Erreur d'utilisation (mauvais arguments / fichier de cibles illisible) |
Server (signalé comme NOT-SERV-U) ou répondre avec son propre 415 (un possible faux PATCHED). Pointez l'outil directement sur l'interface de gestion Serv-U lorsque vous le pouvez.VULNERABLE prouve que le correctif de validation d'entrée du HF1 est absent ; il ne démontre pas le plantage (par conception). Cette porte est un proxy exact pour cette CVE.Mettre à niveau vers SolarWinds Serv-U 15.5.4 Hotfix 1 (build 15.5.4.125) ou ultérieur, qui ajoute la porte de validation d'entrée qui rejette une requête transportant à la fois un corps et un Content-Encoding non vide. En attendant de pouvoir corriger, restreignez l'accès réseau au service Serv-U aux sources de confiance.
Ce code est distribué sous une licence MIT.
L'utilisation de cet outil pour attaquer des cibles sans consentement mutuel préalable est illégale. Il est de la responsabilité de l'utilisateur final de respecter toutes les lois locales, étatiques et fédérales applicables. Les développeurs n'assument aucune responsabilité et ne sont pas responsables de tout usage abusif ou dommage causé par ce programme.
Réponse de la sonde identity | Verdict | Signification |
|---|
En-tête Serveur Serv-U, statut ≠ 415 (ex. 401 / 404 / 200 / 302) | VULNERABLE [missing-415-gate] | La porte 415 du HF1 est absente, donc build <= 15.5.4.108, CVE-2026-28318 non corrigé. |
En-tête Serveur Serv-U, statut = 415 | PATCHED [hf1-415-gate] | La porte de validation d'entrée du HF1 est présente, donc build >= 15.5.4.125. Non vulnérable. |
Réponse, mais pas d'en-tête Serveur Serv-U | NOT-SERV-U [not-servu] | Pas un serveur Serv-U, ou un proxy a supprimé l'en-tête. |
| Aucune réponse utilisable / échec de connexion | ERROR [no-response] | Aucun service HTTP accessible, filtré, erreur TLS ou délai d'attente. |
| Flag | Description |
|---|
targets | Un ou plusieurs HOST[:PORT] ou URL (le schéma par défaut est https://) |
-t, --target TARGET | Ajouter une cible (répétable) |
-f, --file FILE | Lire les cibles depuis un fichier (une par ligne ; commentaires #) |
-b, --brief | Une ligne alignée par cible, idéal pour scanner de nombreux hôtes |
--json | Émettre des résultats JSON structurés |
--no-color | Désactiver la sortie colorée (respecte aussi NO_COLOR et non-TTY) |
--timeout SECS | Délai d'attente par sonde (par défaut : 10) |
-v, --verbose | Afficher la sonde envoyée et les en-têtes de réponse bruts |
| Verdict | Étiquette de raison | Signification |
|---|
VULNERABLE | missing-415-gate | Serveur Serv-U sans porte 415 du HF1, donc build <= 15.5.4.108, CVE-2026-28318 non corrigé. Corriger immédiatement. |
PATCHED | hf1-415-gate | Serveur Serv-U qui répond à la sonde identity avec 415, donc le correctif HF1 est présent (build >= 15.5.4.125). |
NOT-SERV-U | not-servu | A répondu, mais pas d'en-tête Serveur Serv-U ; pas un Serv-U, ou un proxy l'a supprimé. |
ERROR | no-response | Aucune réponse HTTP utilisable (aucun service sur ce port, filtré, erreur TLS ou délai d'attente). |
ERROR | bad-target | L'argument cible n'a pas pu être analysé. |