GoAhead 三枚 TLS 漏洞:吊销的证书仍能登录

FoxIO 研究员 Sébastien Féry 公开了 GoAhead 嵌入式 Web 服务器处理 TLS 时的三处缺陷。GoAhead 由 EmbedThis 开发,承担路由器、交换机、打印机、网关与工业控制器的管理界面,FoxIO 称其部署在数亿台设备上。三处缺陷各自只命中一部分部署,但合起来覆盖了身份验证、加密强度与证书链校验三条防线,最严重的一处 CVSS 评分 9.1。

事件概述:三处缺陷,三种 TLS 后端

CVE-2026-115881(GOAHEAD-SA-2026-0006,CVSS 9.1)出在 OpenSSL 兼容后端,影响 3.4.5 至 6.1.0;第二处没有 CVE 编号(GOAHEAD-SA-2026-0005,CVSS 5.9)出在 Mbed TLS 后端,影响 4.0.2 至 6.1.0;CVE-2026-115884(GOAHEAD-SA-2026-0004,CVSS 7.4)只影响链接 LibreSSL 3.2.x 或 3.3.2 至 3.3.6 的构建。上游 8 月 2 日交付 6.1.1,公告在 10 月 12 日发布。Althouse 表示,十余家设备厂商的产品使用 GoAhead,但这不代表它们出货了脆弱配置。

技术细节:一个没设的标志位

最严重那处本质上是一个缺失的标志。运维可以配置证书吊销列表(CRL),GoAhead 的 OpenSSL 后端确实把文件载入了证书存储,但从未设置 X509_V_FLAG_CRL_CHECK——OpenSSL 需要这个标志才会去查列表。结果是每次握手都直接返回成功,而文件载入没有报错、启动时也不会告警,管理员看不出吊销检查是关着的。Féry 在 6.1.0 配 OpenSSL 3.6.2 的环境验证:一张由可信 CA 签发、已被吊销的客户端证书,在开启签发者校验时仍完成了双向 TLS 握手。默认构建既不开双向 TLS 也不配 CRL,只有刻意加固的部署受影响。

第二处是个长度笔误。GoAhead 配置 RFC 3526 的 2048 位 Diffie-Hellman 组时,把一字节生成元 dhm_g 的 sizeof 当成 256 字节素数 dhm_p 的长度。Mbed TLS 只读到素数首字节 0xFF,于是在 TLS 1.2 的 DHE_RSA 握手里宣告 255 位模数,共享密钥只剩 8 种可能,被动监听者离线逐个试即可解密。该笔误 2018 年引入,OpenSSL 与主流浏览器会以”模数过小”拒绝该参数。

第三处出在 LibreSSL 的 legacy X.509 验证器。GoAhead 设了 10 张的链深度上限,但验证器建链循环在超长链上直接停止而不记录深度错误,GoAhead 收到的是”无法本地获取签发者证书”(错误码 20),该错误在关闭签发者校验时被容忍。演示中一条 17 张证书、根为攻击者自签 CA 的链顺利越限;OpenSSL 与 LibreSSL 4.x 都会拒绝这条链。

影响评估:上游修了不等于设备有补丁

三处缺陷共同的特点是”都不阻断握手完成”,不会在日志里留下明显异常。截至目前无公开在野利用,未入 CISA KEV。真正的风险在修复的传导路径:Althouse 提醒,上游有修复版本不等于设备已有补丁,那取决于厂商什么时候重新构建并推送固件。

修复建议

  • OpenSSL 构建升级到 6.1.1。无法升级时至少确认管理界面不对公网开放,并用一张测试用吊销证书做一次握手验证。
  • Mbed TLS 构建关掉有限域 DHE 套件,或切换到 OpenSSL 后端,这是该缺陷唯一不依赖固件更新的缓解手段。
  • LibreSSL 构建开启签发者校验并指定可信 CA bundle,或换 OpenSSL / LibreSSL 4.x。仅限制链深度不够,问题就出在深度错误没被记录。

参考来源