资讯 Go 1.26.4 / 1.25.11 修复三处安全问题:MIME 头解码、错误信息注入、大 SAN 列表下的 VerifyHostname

2026-09-14 21:04:28

Go 1.26.4 / 1.25.11 修复三处安全问题:MIME 头解码、错误信息注入、大 SAN 列表下的 VerifyHostname

Go 1.26.4 与 1.25.11 于 2026-06-02 发布,包含 3 个安全修复。

  • 公告:https://groups.google.com/g/golang-announce/c/tKs3rmcBcKw
  • 发布历史:https://go.dev/doc/devel/release

这三个问题都属可用性问题而非内存破坏,但它跟一条容易被忽略的路径相关:攻击者不需要让程序崩溃,只要让程序在错误的输入上多做几次乘法,就够拖垮一个连接池。下面按包分开说。

mime:WordDecoder.DecodeHeader 的二次复杂度

CVE-2026-42504,issue #79217。

mime.WordDecoder.DecodeHeader 在解码 MIME 头时,如果输入里塞进大量无效的 encoded-word,会消耗过多 CPU。触发条件是恶意的 MIME 头——也就是说,任何把外部输入的头部交给 MIME 解码器的代码路径都暴露在这个开销之下:邮件网关、解析 Content-Disposition / Content-Type 参数的服务、把 header 反序列化后做展示的接口。

这类输入不需要很大。无效 encoded-word 的解析代价随数量累积,攻击者用一份构造过的头部就能让单次解码占用远超正常值的 CPU 时间。修复方式是让 MIME 解码器更好地处理这一场景。对后端来说,如果 MIME 头来自请求或上游消息,值得在升级之外再加一层长度限制——毕竟解码器修的是最坏情况的斜率,不是给输入设上限。

net/textproto:错误里带上未转义的任意输入

CVE-2026-42507,issue #79346。

net/textproto 在返回错误时,会把输入原样放进 error 而不做转义。这个输入通常由外部控制,典型路径是 net/http 客户端用 ReadMIMEHeader 解析服务端返回的 header:服务端的 header 值被原封不动地拼进了客户端的错误对象里。

影响不在程序逻辑,而在程序输出。攻击者可以把误导性的文本,或者终端控制字节,注入到受害者的输出和日志中。在终端里看日志的人会看到伪造的行、被覆盖的字符,甚至看起来像另一条日志的尾巴;在聚合到日志系统后,也可能污染结构化解析。凡是把 error 直接打到终端或不经清洗写入日志的地方,都受这条影响。

同类问题也影响 net/smtp(issue #79345)。

这组被 Go 按 PUBLIC track 处理,而不是 embargo,原因是影响相对有限——不是可以静默利用的漏洞,也没有机密性、完整性层面的直接破坏。

需要明确的是,修复改的是库里的错误构造行为,不会替你处理已经写进日志的历史数据。如果下游有把 error 字符串当结构化字段解析的管道,升级后建议再看一遍对应位置的转义假设是否还成立。

crypto/x509:VerifyHostname 对每个 SAN 条目重复分割主机名

CVE-2026-27145,issue #79694。

(*x509.Certificate).VerifyHostname 之前对每个 DNS SAN 条目循环调用 matchHostnames,于是对同一个 host 反复执行 strings.Split(host, ".")。问题在于这个切分的结果跟 SAN 条目无关,但它在循环里被重算了一遍又一遍。

后果是验证成本按 SAN 数量 × 主机名标签数呈二次增长。DNS SAN 列表很大的证书——几百上千条 DNSNames——会让验证时间从可忽略变成一个可测量的量级。

这条的一个关键细节是触发位置:x509.Verify 在校验链之前就验证主机名,所以连不受信任的证书也能触发该开销。攻击者不需要一张能通过链校验的证书,只要能让你的服务走到主机名验证这一步就行。任何接受客户端证书、或者对上游证书做名称校验的服务,都可能被这个乘法惩罚。

1.26.x 系列此前已经修过什么

把这几个版本连起来看,1.26 线的安全修复节奏大致是这样:

  • 1.26.1(2026-03-05):crypto/x509html/templatenet/urlos
  • 1.26.2(2026-04-07):go 命令、编译器、archive/tarcrypto/tlscrypto/x509html/templateos
  • 1.26.3(2026-05-07):go 命令、pack 工具、html/templatenetnet/httpnet/http/httputilnet/mailsyscall

crypto/x509html/template 在这几个补丁里反复出现,1.26.4 又补了一次 x509。如果版本停留在 1.26.0–1.26.3,中途的修复并没有自动带上。

升级建议

仍在 1.26.0–1.26.3 的服务升到 1.26.41.25 线升到 1.25.11

对后端的实际动作:先 go.mod 里的 toolchain / go 版本对齐,再走一遍 CI 与容器基础镜像的 Go 版本;生产环境如果有按版本分组的二进制,确认它们都跟着动了。1.26.4 与 1.25.11 是各自线上的安全补丁版本,升级路径本身不带语言行为变更。

复制全文 生成海报 Go 安全 CVE 标准库 升级

推荐文章

程序员茄子在线接单