Golang安全更新:1.12.8和1.11.13版本正式发布
Golang安全更新:1.12.8和1.11.13版本正式发布 各位Gopher们:
我们刚刚发布了Go 1.12.8和Go 1.11.13版本,以解决近期报告的安全问题。我们建议所有用户升级到这些版本之一(如果不确定选择哪个,请选择Go 1.12.8)。
- net/http:HTTP/2实现中的拒绝服务漏洞
接受来自不可信客户端直接连接的net/http和golang.org/x/net/http2服务器可能会被远程攻击导致分配无限量内存,直至程序崩溃。如果发送队列积累了过多控制消息,服务器现在将关闭连接。 这些问题对应CVE-2019-9512和CVE-2019-9514,以及Go问题golang.org/issue/33606。 感谢Netflix的Jonathan Looney发现并报告这些问题。
此问题也在golang.org/x/net/http2的v0.0.0-20190813141303-74dc4d7220e7版本中得到修复。
- net/url:解析验证问题
url.Parse会接受具有畸形主机的URL,导致Host字段可能包含任意后缀,这些后缀既不会出现在Hostname()也不会出现在Port()中,从而允许在某些应用程序中绕过授权。请注意,具有无效非数字端口的URL现在将通过url.Parse返回错误。 该问题对应CVE-2019-14809和Go问题golang.org/issue/29098。 感谢Cure53的Julian Hector和Nikolai Krein,以及Adi Cohen发现并报告此问题。
所有支持平台的下载文件可在https://golang.org/dl获取。
致谢, Dmitri代表Go团队
更多关于Golang安全更新:1.12.8和1.11.13版本正式发布的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang安全更新:1.12.8和1.11.13版本正式发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
以下是针对 Go 1.12.8 和 1.11.13 版本安全更新的专业评论。这些更新修复了关键安全问题,强烈建议用户立即升级以避免潜在风险。我将提供相关示例代码来说明问题。
1. net/http HTTP/2 拒绝服务漏洞修复
在 Go 1.12.8 和 1.11.13 之前,如果服务器使用 net/http 或 golang.org/x/net/http2 处理 HTTP/2 连接,恶意客户端可能通过发送大量控制消息导致服务器内存耗尽并崩溃。新版本通过限制队列大小并在超限时关闭连接来缓解此问题。
示例代码:使用 net/http 设置 HTTP/2 服务器(升级后自动修复):
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Gopher! Secure with Go 1.12.8+")
}
func main() {
http.HandleFunc("/", handler)
// 在 Go 1.12.8 或 1.11.13 中,HTTP/2 实现已修复漏洞
server := &http.Server{
Addr: ":8080",
}
fmt.Println("Server starting on :8080 with HTTP/2 support")
err := server.ListenAndServeTLS("cert.pem", "key.pem") // 需要 TLS 证书以启用 HTTP/2
if err != nil {
fmt.Printf("Server failed: %v\n", err)
}
}
在旧版本中,如果客户端发送过多控制帧(如 SETTINGS 或 PING),服务器可能崩溃;新版本会在检测到异常时终止连接。
2. net/url 解析验证问题修复
在旧版本中,url.Parse 可能接受畸形主机 URL,导致 Host 字段包含意外后缀,从而绕过某些应用程序的授权检查。新版本对无效端口(如非数字端口)返回错误。
示例代码:演示 url.Parse 在修复前后的行为变化:
package main
import (
"fmt"
"net/url"
)
func main() {
// 测试 URL 包含畸形主机和无效端口
testURL := "http://example.com:abc/path" // 无效非数字端口
parsed, err := url.Parse(testURL)
if err != nil {
fmt.Printf("Error parsing URL: %v\n", err) // 在 Go 1.12.8+ 中,这会返回错误
return
}
fmt.Printf("Parsed Host: %s, Hostname: %s, Port: %s\n", parsed.Host, parsed.Hostname(), parsed.Port())
}
在 Go 1.12.8 或 1.11.13 之前,此代码可能解析成功但 Port() 返回空字符串;新版本中,url.Parse 会直接返回错误,防止潜在授权绕过。
升级说明
- 下载最新版本从 https://golang.org/dl。
- 对于依赖
golang.org/x/net/http2的项目,确保更新到 v0.0.0-20190813141303-74dc4d7220e7 或更高版本。 - 运行
go version确认升级成功,输出应类似go version go1.12.8 linux/amd64。
这些修复基于社区报告(如 Netflix 和 Cure53),体现了 Go 团队对安全问题的快速响应。升级是必要的,以避免拒绝服务和授权漏洞。

