
Offline-Java-Tool, das Anwendungs-JARs scannt, um die Gefährdung durch 14 Netty-Codec-http-CVEs zu ermitteln, und dabei die exakte gepatchte Version (4.1.137.Final/4.2.17.Final) trotz inkonsistenter Advisory-Grenzen identifiziert.
Offline-Prüfer für die 14 io.netty:netty-codec-http CVEs (2025–2026).
Sagt Ihnen, welchen davon Sie tatsächlich ausgesetzt sind — und die einzige Version, die alle abdeckt:
4.1.137.Final / 4.2.17.Final, eine Nummer, die in keinem der vierzehn Advisories steht.
CVE-2025-58056 · CVE-2025-67735 · CVE-2026-33870 · CVE-2026-41417 · CVE-2026-42580 · CVE-2026-42581 · CVE-2026-42585 · · · · · · ·
CVE-2026-42587CVE-2026-50020CVE-2026-56746CVE-2026-59898CVE-2026-59899CVE-2026-59903CVE-2026-59921Ein einziges Jar, keine Laufzeitabhängigkeiten, vollständig offline, Java 17+.
Jedes Netty-Modul wird unter derselben Versionsnummer veröffentlicht, sodass sich ein Upgrade wie eine einzige Entscheidung anfühlt. Ist es aber nicht. In der 4.1-Linie liegen die Fix-Versionen für diese vierzehn bei 125 / 129 / 132 / 133 / 135 / 136 / 137 — sieben verschiedene Werte. Folgen Sie einem einzigen Advisory, befinden Sie sich immer noch im betroffenen Bereich der anderen.
netty-codec-http2 deklariert netty-codec-http als compile-Abhängigkeit mit
<version>${project.version}</version> — die beiden Versionen sind aneinander gekoppelt.
Wenn Sie also auf 4.1.136.Final aktualisiert haben, weil das die Version ist, die die sieben
netty-codec-http2-CVEs abdeckt, läuft bei Ihnen jetzt auch netty-codec-http 4.1.136.Final — und
CVE-2026-59903 betrifft <= 4.1.136.Final. Sie benötigen 4.1.137.Final. Gleiche Geschichte in der
4.2-Linie: Die HTTP/2-Antwort ist 4.2.16.Final, diese Seite benötigt 4.2.17.Final.
Das ist keine Behauptung, dass die HTTP/2-Empfehlung falsch war — sie hat für ein anderes Modul geantwortet. Es ist die Behauptung, dass „eine Versionsnummer“ die Tatsache verschleiert, dass Sie nur für ein Modul geantwortet haben.
Über diese vierzehn Advisories hinweg ist die Obergrenze 16-mal als <= und 12-mal als < geschrieben.
Dieselbe 4.1.136.Final ist daher sicher für CVE-2026-56746 (< 4.1.136.Final) und
betroffen für CVE-2026-59903 (<= 4.1.136.Final).
Den Operator in beide Richtungen zu normalisieren erzeugt eine falsche Antwort — die eine Richtung meldet
zu viel, die andere zu wenig, und zu wenig zu melden ist der teure Fehler für ein solches Tool.
Die Regel-Tabelle behält jeden Operator exakt so bei, wie das Advisory ihn geschrieben hat, und eine Assertion
in tools/gen_rules.py lässt den Build fehlschlagen, falls dieser Grenzfall jemals aufhört, sich so zu verhalten.
pom.xml nicht — absichtlichWenn Sie Spring WebFlux verwenden, kommt netty-codec-http über
spring-boot-starter-webflux
-> spring-boot-starter-reactor-netty
-> reactor-netty-http
-> netty-codec-http
Der artifactId erscheint nie in Ihrer pom.xml. Eine pom-basierte Prüfung antwortet „Ich verwende es nicht“,
was falsch ist. Dieses Tool liest die Jars, die tatsächlich ausgeliefert werden.
java -jar netty-http-check.jar target/ # Build-Ausgabe scannen
java -jar netty-http-check.jar myapp.jar # Spring-Boot-Fat-Jar / War, verschachtelte Jars inklusive
java -jar netty-http-check.jar --version-of 4.1.136.Final # eine Version direkt bewerten
Exit-Codes: 0 = nicht betroffen · 1 = betroffen · 2 = konnte nicht bewertet werden.
🔴
2ist bewusst nicht0. „Nichts gefunden“ und „sauber“ dürfen für ein Skript nicht gleich aussehen. Eine Datei, die kein lesbares Zip ist, wird als Lesefehler gemeldet, niemals stillschweigend als „kein netty hier drin“ behandelt.
netty-codec-http. Andere Netty-Module haben ihre eigenen CVEs;
ein sauberes Ergebnis hier sagt nichts über sie aus. Wenn Sie auch netty-codec-http2 ausführen,
sagt das Tool das und weist auf das modulübergreifende Problem oben hin, bewertet dieses Modul aber nicht.low; sie werden so ausgegeben, wie sie sind, nicht zu einer beängstigenden Gesamtsumme aufgerollt.reviewed mit vollständigen Paket-Metadaten, sodass Dependabot und
Co. tatsächlich darauf aufmerksam machen. Dieses Tool ist nicht „der Scanner kann es nicht sehen“ — es ist
„die Warnung nennt Ihnen eine Versionsnummer pro Advisory, und Sie müssen trotzdem herausfinden, welche
einzelne Version es beendet.“src/main/java/dev/mikko/nettyhttpcheck/RuleTable.java ist generiert, niemals handbearbeitet:
python tools/gen_rules.py --dry # nur die Assertions ausführen
python tools/gen_rules.py # die Tabelle neu generieren
Sieben Assertions müssen bestehen, sonst wird nichts geschrieben — darunter: jedes Advisory ist weiterhin
reviewed; beide Versionslinien sind für jedes vorhanden; die berechnete Schnittmenge ist weiterhin
4.1.137.Final / 4.2.17.Final; diese Versionen sind tatsächlich von Maven Central abrufbar
(mit einer Sentinel-Version, die 404 liefern muss, damit eine defekte Prüfung nicht stillschweigend bestehen kann);
der Grenzfall aus §3 kippt weiterhin; und die HTTP/2-Antwort aus §2 hinterlässt auf dieser Seite weiterhin eine Lücke.
End-to-End-Prüfungen mit echten Jars befinden sich in tools/e2e_real_jars.py — sie laden echte Jars von
Maven Central herunter statt Fixtures, weil „funktioniert mit handgebautem Zip, scheitert am echten Jar“
ein realer Fehlermodus ist.
MIT