Go1.16.6 发布:又一个小问题引发安全 Bug
阅读本文大概需要 5 分钟。
大家好,我是 polarisxu。
今早,Go 官方发布了 Go1.16.6 和 Go1.15.14,这是两个小版本,主要修复安全漏洞。因此,如果你的代码可能涉及到,建议进行升级。
crypto/tls clients can panic when provided a certificate of the wrong type for the negotiated parameters. net/http clients performing HTTPS requests are also affected. The panic can be triggered by an attacker in a privileged network position without access to the server certificate's private key, as long as a trusted ECDSA or Ed25519 certificate for the server exists (or can be issued), or the client is configured with Config.InsecureSkipVerify. Clients that disable all TLS_RSA cipher suites (that is, TLS 1.0–1.2 cipher suites without ECDHE), as well as TLS 1.3-only clients, are unaffected.
当为协商的参数提供了错误类型的证书时,crypto/tls 客户端可能会 panic。net/http 客户端执行 HTTPS 请求也会受到此影响。攻击者可以在有特权的网络位置,不访问服务器证书的私钥的情况下触发该 panic,只要是受信任的服务器的 ECDSA 或 Ed25519 证书存在 (或者可以颁发),或者客户端配置有 Config.InsecureSkipVerify。我想不少客户端可能都配置了 Config.InsecureSkipVerify,所以需要引起注意。
这个漏洞发现后,官方紧急修复并发版,从这个 issue 的时间可以看到:
大概率是代码的一个小问题引起的,好比之前有一次,我发了一篇文章:快一个月,Go1.16 才发现了比较严重的 Bug,但这个 Bug 有点 Low。。。看看这次的改动:
进行类型断言,直接使用其结果,没有进行判断。除非能确保 cert.PublicKey 一定是 *rsa.PublicKey
,否则应该使用 ok 式断言。从报的 issue 看,显然不能确保,似乎为了图省事,想一行代码搞定?大家在进行类型断言时,一定要注意此问题。
我在 Go 语言中文网为大家准备好了最新下载地址:https://studygolang.com/dl,也可以使用你喜欢的 Go 版本管理工具,比如 goup,或者按照官方的方式:
我是 polarisxu,北大硕士毕业,曾在 360 等知名互联网公司工作,10多年技术研发与架构经验!2012 年接触 Go 语言并创建了 Go 语言中文网!著有《Go语言编程之旅》、开源图书《Go语言标准库》等。
坚持输出技术(包括 Go、Rust 等技术)、职场心得和创业感悟!欢迎关注「polarisxu」一起成长!也欢迎加我微信好友交流:gopherstudio