大家好,我是 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 的时间可以看到:
![1.16.6.png](https://static.studygolang.com/210714/17bdc5de177623ec6aef0b4232a8d8cd.png)
大概率是代码的一个小问题引起的,好比之前有一次,我发了一篇文章:[快一个月,Go1.16 才发现了比较严重的 Bug,但这个 Bug 有点 Low。。。](https://mp.weixin.qq.com/s/AddZm8qaWBY-Hgexq6tWkA)看看这次的改动:
![1.16.6-1.png](https://static.studygolang.com/210714/1414694fb4fc85315216e94a773fa994.png)
进行类型断言,直接使用其结果,没有进行判断。除非能确保 cert.PublicKey 一定是 `*rsa.PublicKey`,否则应该使用 ok 式断言。从报的 issue 看,显然不能确保,似乎为了图省事,想一行代码搞定?大家在进行类型断言时,一定要注意此问题。
我在 Go 语言中文网为大家准备好了最新下载地址:<https://studygolang.com/dl>,也可以使用你喜欢的 Go 版本管理工具,比如 goup,或者按照官方的方式:
![go1.16.6.png](https://static.studygolang.com/210714/fc69bf5a24ea532faa8207f59f2a26cf.png)
有疑问加站长微信联系(非本文作者)