大家好,今早 Go 官方发布了 Go1.20.1 和 Go1.19.6,这是两个小版本,主要涉及到安全更新,一共修复了 4 个 Bug。
path/filepath:filepath.Clean 函数在 Windows 上的 path 遍历。
在 Windows 上,filepath.Clean 函数可以将无效路径(例如 a/../c:/b)转换为有效路径 c:\b。将相对(如果无效)路径转换为绝对路径可能会引发目录遍历攻击。
filepath.Clean 函数现在会将此路径转换为相对(但仍然无效)路径 .\c:\b。
issue: https://go.dev/issue/57274
net/http, mime/multipart:过度资源消耗导致的拒绝服务
使用 mime/multipart.Reader.ReadForm 进行多部分表单解析可能会消耗大量无限量的内存和磁盘文件。这也会影响在 net/http 包中使用请求方法 FormFile、FormValue、ParseMultipartForm 和 PostFormValue 进行的表单解析。
ReadForm 采用 maxMemory 参数,并记录为“在内存中存储最多 maxMemory 字节 +10MB(为非文件部分保留)”。无法存储在内存中的文件部分以临时文件的形式存储在磁盘上。为非文件部分保留的不可配置的 10MB 空间过大,可能会自行打开拒绝服务向量。但是,ReadForm 没有正确考虑已解析表单消耗的所有内存,例如映射条目开销、部分名称和 MIME 标头,从而允许恶意制作的表单消耗超过 10MB。此外,ReadForm 对创建的磁盘文件数量没有限制,允许相对较小的请求体创建大量的磁盘临时文件。
ReadForm 现在正确地考虑了各种形式的内存开销,并且现在应该保持在其记录的 10MB + maxMemory 字节内存消耗的限制范围内。用户仍然应该知道这个限制很高并且可能仍然是危险的。
ReadForm 现在最多创建一个磁盘临时文件,将多个表单部分组合成一个临时文件。mime/multipart.File 接口类型的文档指出,“如果存储在磁盘上,文件的底层具体类型将是一个 *os.File”。当一个表单包含多个文件部分时,情况就不再如此,因为这些部分合并到一个文件中。可以使用环境变量 GODEBUG=multipartfiles=distinct 重新启用之前为每个表单部分使用不同文件的行为。
用户应该知道 multipart.ReadForm 和调用它的 http.Request 方法不限制临时文件消耗的磁盘量。调用者可以使用 http.MaxBytesReader 限制表单数据的大小。
issue: https://go.dev/issue/58006
crypto/tls:大量的握手记录可能会导致 panic
客户端和服务器都可能发送大量的 TLS 握手记录,这会分别导致服务器和客户端
在尝试构建响应时出现 panic。
这会影响所有 TLS 1.3 客户端、显式启用会话恢复的 TLS 1.2 客户端 (通过将 Config.ClientSessionCache 设置为非零值)和请求客户端证书的 TLS 1.3 服务器(通过设置 Config.ClientAuth >= RequestClientCert)。
issue: https://go.dev/issue/58001
net/http: 避免 HPACK 解码中的二次复杂度
恶意制作的 HTTP/2 流可能会导致 HPACK 解码器中的 CPU 消耗过多,足以导致少量小请求拒绝服务。
这个问题也在 http://golang.org/x/net/http2 v0.7.0 中得到修复,供用户手动配置 HTTP/2。
issue: https://go.dev/issue/57855
Go 语言中文网已经为大家准备好了最新版本安装包,可以到 https://studygolang.com/dl 下载,也可以安装官方的方式试用。
这次的更新还是建议大家升级。
推荐阅读