Go1.16.6 發(fā)布:又一個小問題引發(fā)安全 Bug
閱讀本文大概需要 5 分鐘。
大家好,我是 polarisxu。
今早,Go 官方發(fā)布了 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.
當為協(xié)商的參數(shù)提供了錯誤類型的證書時,crypto/tls 客戶端可能會 panic。net/http 客戶端執(zhí)行 HTTPS 請求也會受到此影響。攻擊者可以在有特權(quán)的網(wǎng)絡(luò)位置,不訪問服務(wù)器證書的私鑰的情況下觸發(fā)該 panic,只要是受信任的服務(wù)器的 ECDSA 或 Ed25519 證書存在 (或者可以頒發(fā)),或者客戶端配置有 Config.InsecureSkipVerify。我想不少客戶端可能都配置了 Config.InsecureSkipVerify,所以需要引起注意。
這個漏洞發(fā)現(xiàn)后,官方緊急修復并發(fā)版,從這個 issue 的時間可以看到:

大概率是代碼的一個小問題引起的,好比之前有一次,我發(fā)了一篇文章:快一個月,Go1.16 才發(fā)現(xiàn)了比較嚴重的 Bug,但這個 Bug 有點 Low。。。看看這次的改動:

進行類型斷言,直接使用其結(jié)果,沒有進行判斷。除非能確保 cert.PublicKey 一定是 *rsa.PublicKey,否則應(yīng)該使用 ok 式斷言。從報的 issue 看,顯然不能確保,似乎為了圖省事,想一行代碼搞定?大家在進行類型斷言時,一定要注意此問題。
我在 Go 語言中文網(wǎng)為大家準備好了最新下載地址:https://studygolang.com/dl,也可以使用你喜歡的 Go 版本管理工具,比如 goup,或者按照官方的方式:

我是 polarisxu,北大碩士畢業(yè),曾在 360 等知名互聯(lián)網(wǎng)公司工作,10多年技術(shù)研發(fā)與架構(gòu)經(jīng)驗!2012 年接觸 Go 語言并創(chuàng)建了 Go 語言中文網(wǎng)!著有《Go語言編程之旅》、開源圖書《Go語言標準庫》等。
堅持輸出技術(shù)(包括 Go、Rust 等技術(shù))、職場心得和創(chuàng)業(yè)感悟!歡迎關(guān)注「polarisxu」一起成長!也歡迎加我微信好友交流:gopherstudio
