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

1 回复

更多关于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/httpgolang.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 团队对安全问题的快速响应。升级是必要的,以避免拒绝服务和授权漏洞。

回到顶部