针对 7 个 io.netty:netty-codec-http2 CVE 的离线检测工具。
告诉你实际暴露于哪些漏洞——以及能一次性修复全部漏洞的单一版本:
4.1.136.Final / 4.2.16.Final,这个版本号在七份安全公告中均未出现。
CVE-2025-55163 · CVE-2026-33871 · CVE-2026-47244 · CVE-2026-48043 · CVE-2026-50560 · CVE-2026-56819 · CVE-2026-59900
单一 jar 包,零运行时依赖,完全离线,需要 Java 17+。
七份安全公告各自给出了不同的修复版本。在 4.1 系列中,它们分别是 124 / 132 / 135 / 135 / 135 / 136 / 136。只跟随任何一份公告,你仍然处于其他漏洞的影响范围内。能够清除全部七个漏洞的版本必须自行计算 ——而它没有写在任何一份公告上。
在 4.2 系列中也是如此,只是数字完全不同(4 / 11 / 15 / 15 / 15 / 16 / 16)。
停留在 4.2.15.Final 的用户已经修复了七个中的五个,并且常常自认为"已经在新版本线上了"。
pom.xml如果你使用 Spring WebFlux,netty-codec-http2 是通过以下依赖链引入的:
spring-boot-starter-webflux
-> spring-boot-starter-reactor-netty
-> reactor-netty-http
-> netty-codec-http2
这个 artifactId 永远不会出现在你的 pom.xml 中。 基于 pom 的检测会得出"我没有使用它"的结论,
而这是错误的。本工具读取的是实际打包发布的 jar 文件。
java -jar netty-http2-check.jar target/ # 扫描构建输出
java -jar netty-http2-check.jar myapp.jar # Spring Boot fat-jar / war,包含嵌套 jar
java -jar netty-http2-check.jar --version 4.1.100.Final # 直接判断某个版本
java -jar netty-http2-check.jar --table # 打印完整规则表
在 Windows 控制台输出乱码时,可使用 --utf8 / --gbk。
示例:
netty-codec-http2 4.1.135.Final
evidence: META-INF/io.netty.versions.properties
中了 2 条:
CVE-2026-56819 high CVSS 7.5 解压泄漏 -> OOM
CVE-2026-59900 medium 官方未给分 Host 头与 :authority 去重缺失 -> 路由绕过
-> 一次修完这几条,升到:4.1.136.Final
medium。 只有 CVE-2025-55163、CVE-2026-33871 和
CVE-2026-56819 被评为 high。本工具会分别打印每个漏洞的严重级别,你也应该这样做。grpc-netty-shaded 会被检测到,但只有 CVE-2025-55163 列出了该坐标。
"公告没有列出它"并不等于"它不受影响"。CVE-2026-33871 在 4.2 系列上:受影响范围是 < 4.2.10.Final,但声明的修复版本是
4.2.11.Final。4.2.10 恰好落在两者之间——在受影响范围之外,却低于修复版本。本工具
会明确报告这一点,而不是让它落入默认的"安全"分支。
tools/gen_rules.py 直接从 GitHub 安全公告构建 RuleTable.java,并且除非五个断言全部成立,
否则拒绝输出任何内容——包括计算出的交集确实为 4.1.136.Final / 4.2.16.Final,
以及这些版本确实存在于 Maven Central 上,同时一个哨兵版本返回 404。
tools/recheck_before_publish.py 通过刻意选择的不相关来源重新验证关键声明:NVD(而非 OSV——其 Maven 数据镜像自 GHSA)、Maven Central,以及真实 jar 的
字节码。字节码检查是双向的:修复标记必须存在于 4.1.136 且
不存在于 4.1.135。后半部分在首次运行时捕获了一个错误的检查。
mvn package # target/netty-http2-check-0.1.0.jar
mvn test # 23 个测试
MIT