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/x509、html/template、net/url、os。 - 1.26.2(2026-04-07):
go命令、编译器、archive/tar、crypto/tls、crypto/x509、html/template、os。 - 1.26.3(2026-05-07):
go命令、pack工具、html/template、net、net/http、net/http/httputil、net/mail、syscall。
crypto/x509 和 html/template 在这几个补丁里反复出现,1.26.4 又补了一次 x509。如果版本停留在 1.26.0–1.26.3,中途的修复并没有自动带上。
升级建议
仍在 1.26.0–1.26.3 的服务升到 1.26.4;1.25 线升到 1.25.11。
对后端的实际动作:先 go.mod 里的 toolchain / go 版本对齐,再走一遍 CI 与容器基础镜像的 Go 版本;生产环境如果有按版本分组的二进制,确认它们都跟着动了。1.26.4 与 1.25.11 是各自线上的安全补丁版本,升级路径本身不带语言行为变更。