描述
远程主机受到 GLSA-202311-09 中所述漏洞的影响(Go:多个漏洞)
- Reader.Read 未对文件标头的最大大小设置限制。恶意构建的存档可导致 Read 分配不受限制的内存量,从而可能导致资源耗尽或错误。
修复后,Reader.Read 将标头块的最大大小限制为 1 MiB。(CVE-2022-2879)
- ReverseProxy 转发的请求包括入站请求的原始查询参数,包括 net/http 拒绝的无法解析的参数。当 Go 代理转发具有不可解析值的参数时,这可能允许查询参数走私。修复后,在 ReverseProxy 之后设置出站请求的表单字段时,ReverseProxy 会审查转发的查询中的查询参数。Director 函数返回即表示代理已解析查询参数。不解析查询参数的代理继续转发不变的原始查询参数。(CVE-2022-2880)
- 从不受信任的来源编译正则表达式的程序容易受到内存耗尽或拒绝服务的影响。解析后的 regexp 表示与输入的大小成线性关系,但在某些情况下,常数因子可高达 40,000,使得相对较小的 regexp 消耗大量内存。修复后,每个被解析的 regexp 被限制为 256 MB 内存占用。正则表达式的表示会使用比拒绝的表达式更多的空间。正则表达式的正常使用不受影响。 (CVE-2022-41715)
- 攻击者可造成接受 HTTP/2 请求的 Go 服务器内存过度增长。HTTP/2 服务器连接包含客户端发送的 HTTP 标头密钥的缓存。尽管此缓存中的条目总数已上限,但攻击者可发送非常大的密钥,从而导致服务器为每个打开的连接分配大约 64 MiB。(CVE-2022-41717)
- 恶意构建的 HTTP/2 流可造成 HPACK 解码器过度消耗 CPU,这足以通过少量小请求造成拒绝服务。(CVE-2022-41723)
- 大量握手记录可能会造成 crypto/tls 错误。客户端和服务器都可能发送大型 TLS 握手记录,从而在尝试构造响应时分别造成服务器和客户端错误。这会影响所有 TLS 1.3 版客户端、明确启用会话恢复的 TLS 1.2 版客户端(通过将 Config.ClientSessionCache 设置为非 nil 值)以及请求客户端证书的 TLS 1.3 版服务器(通过设置 Config.ClientAuth >= RequestClientCert)。(CVE-2022-41724)
- net/http 和 mime/multipart 中的过量资源消耗可能导致拒绝服务。
使用 mime/multipart.Reader.ReadForm 进行的多部分表单解析会消耗大量不受限制的内存和磁盘文件。这也会影响使用 Request 方法 FormFile、FormValue、ParseMultipartForm 和 PostFormValue 在 net/http 程序包中进行的表单解析。ReadForm 采用 maxMemory 参数,据记载其在内存中最多可存储 +10MB maxMemory 字节(为非文件部分预留)。无法存储在内存中的文件部分以临时文件的形式存储在磁盘上。为非文件部分保留的不可配置的 10MB 过大,可能会单独打开拒绝服务矢量。但是,ReadForm 没有正确考虑解析的表单消耗的所有内存,例如映射条目开销、部分名称和 MIME 标头,从而允许恶意构建的表单消耗远远超过 10MB。此外,ReadForm 对创建的磁盘文件数量没有限制,允许相对较小的请求正文创建大量磁盘临时文件。修复后,ReadForm 现在可以正确考虑各种形式的内存开销,并且现在应将开销保持在其记录的 10MB + maxMemory 字节内存消耗内。用户仍应意识到此限制较高且可能仍然存在危险。此外,ReadForm 现在至多创建一个磁盘临时文件,从而将多个表单部分合并为一个临时文件。mime/multipart.File 接口类型的文档指出,如果存储在磁盘上,File 的底层具体类型将为 *os.File.。当表单包含多个文件部分时,情况不再如此,这是因为将多个文件部分合并为一个文件所致。可通过环境变量 GODEBUG=multipartfiles=distinct 重新启用之前对每个表单部分使用不同文件的行为。用户应注意,multipart.ReadForm 和调用它的 http.Request 方法不会限制临时文件消耗的磁盘数量。调用方可使用 http.MaxBytesReader 限制表单数据的大小。(CVE-2022-41725)
- 即使在解析小型输入时,HTTP 和 MIME 标头解析也可能会分配大量内存,从而可能导致拒绝服务。输入数据的某些异常模式可导致用于解析 HTTP 和 MIME 标头的通用函数分配远超所需的内容来保存已解析的标头。攻击者可能会利用此行为,导致 HTTP 服务器通过小型请求分配大量内存,从而可能导致内存耗尽和拒绝服务。
经修复后,标头解析现在可以正确分配所需内存来保存已解析的标头。
(CVE-2023-24534)
- 在处理包含大量部分的表单输入时,多部分表单解析可能会消耗大量 CPU 和内存。此问题由多种原因导致:1. mime/multipart.Reader.ReadForm 限制解析多部分表单可以消耗的总内存。ReadForm 可能会低估所消耗的内存量,导致它接受的输入大于预期。2. 限制总内存的做法并未考虑到包含多个部分的表单中的大量小型分配给垃圾回收器增加的压力。3.
ReadForm 可以分配大量短效缓冲区,这会进一步加大对垃圾回收器造成的压力。这些因素相结合,攻击者便可让解析多部分表单的程序消耗大量 CPU 和内存,从而可能导致拒绝服务。
这会影响使用 mime/multipart.Reader.ReadForm 的程序,也会影响使用 Request 方法 FormFile、FormValue、ParseMultipartForm 和 PostFormValue 在 net/http 程序包中进行的表单解析。经修复后,ReadForm 现在可以更好地估算已解析表单的内存消耗量,并大幅减少短效分配。此外,经修复的 mime/multipart.Reader 会对已解析表单的大小施加以下限制:1. 使用 ReadForm 解析的表单包含的部分不超过 1,000 个。此限制可通过环境变量 GODEBUG=multipartmaxparts= 进行调整。2. 使用 NextPart 和 NextRawPart 解析的表单部分包含的标头字段不超过 10,000 个。此外,使用 ReadForm 解析的所有表单部分包含的标头字段不超过 10,000 个。此限制可通过环境变量 GODEBUG=multipartmaxheaders= 进行调整。(CVE-2023-24536)
- 在包含具有极大行号的 //line 指令的 Go 源代码中,调用任何 Parse 函数都有可能因整数溢出而造成无限循环。(CVE-2023-24537)
- 模板未正确将反引号 (`) 视为 Javascript 字符串分隔符,也未按预期对其进行转义。自 ES6 起,反引号可用于 JS 模板文本。如果模板的 Javascript 模板文本中包含 Go 模板操作,则此操作的内容可用于停用文本,进而将任意 Javascript 代码注入 Go 模板。ES6 模板文字相当复杂,且其本身可以执行字符串插入操作,因此决定简单地禁止在此类文字中使用 Go 模板操作(例如 var a = {{.}}),因为没有显然安全的方式支持此行为。此方法与 github.com/google/safehtml 相同。经修复后,Template.Parse 在遇到此类模板时会返回一个 ErrorCode 值为 12 的错误。此 ErrorCode 当前并未导出,但将在 Go 1.21 版本中导出。依赖之前行为的用户可以使用 GODEBUG 标记 jstmpllitinterp=1 重新启用它,但需要注意的是现在将对反引号进行转义。应谨慎使用此做法。(CVE-2023-24538)
- 使用 cgo 时,go 命令可能在构建时生成非预期的代码。这可能导致在运行使用 cgo 的 go 程序时发生意外情况。如果不受信任的模块包含名称中带换行符的目录,运行此模块则可能会导致此问题发生。使用 go 命令(即通过 go get)检索到的模块不受影响(使用 GOPATH-mode 检索到的模块,如 GO111MODULE=off)。(CVE-2023-29402)
- 在 Unix 平台上,当使用 setuid/setgid 位运行二进制文件时,Go 运行时的行为将和之前保持一致。这在某些情况下可能很危险,例如在转储内存状态或假设状态为标准 i/o 文件描述符时。如果在关闭标准 I/O 文件描述符的情况下执行 setuid/setgid 二进制文件,则打开任何文件都可能导致使用提升的权限读取或写入意外内容。
同样,如果 setuid/setgid 程序通过错误或信号终止,则可能泄漏其寄存器的内容。 (CVE-2023-29403)
- 使用 cgo 时,go 命令可能在构建时执行任意代码。在恶意模块上运行 go get 或运行构建不受信任代码的任何其他命令时,可能会发生这种情况。此问题可由通过 #cgo LDFLAGS 指令指定的链接器标记触发。大量非可选标记的参数被错误地视为可选,从而允许通过 LDFLAGS 审查走私禁用的标记。这会影响 gc 和 gccgo 编译器的使用。(CVE-2023-29404)
- 使用 cgo 时,go 命令可能在构建时执行任意代码。在恶意模块上运行 go get 或运行构建不受信任代码的任何其他命令时,可能会发生这种情况。此问题可由通过 #cgo LDFLAGS 指令指定的链接器标记触发。由于包含嵌入空格的标记处理不当,导致可以通过 LDFLAGS 审查走私禁用的标记,方法则是将这些标记纳入另一个标记的参数中。这会影响 gccgo 编译器的使用。(CVE-2023-29405)
- HTTP/1 客户端没有充分验证主机标头的内容。恶意构建的主机标头可以注入其他标头或整个请求。修复后,HTTP/1 客户端现在会拒绝发送包含无效 Request.Host 或 Request.URL.Host 值的请求。(CVE-2023-29406)
- 证书链中过大的 RSA 密钥可能会导致客户端/服务器花费大量 CPU 时间来验证签名。通过修复,将握手期间传输的 RSA 密钥大小限制为 <= 8192 位。根据对公众信任的 RSA 密钥的调查,目前流通中的证书中,只有三个的密钥大于此限制,并且这三个证书似乎都是未积极部署的测试证书。私有 PKI 中可能使用了更大的密钥,但我们针对的是 Web PKI,因此,为了提高 crypto/tls 用户的默认安全性,在此处造成中断似乎是合理的。(CVE-2023-29409)
- html/模板程序包无法正确处理 HTML 类的注释标记,亦无法正确处理 <script> 内容脚本中的 hashbang #! 注释标记。这可能会导致模板解析器错误地解释 <script> 内容脚本中的内容,从而导致操作被错误转义。这可被用于执行 XSS 攻击。(CVE-2023-39318)
- html/模版程序包没有应用正确的规则来处理出现的 <script, <!--, 情形和 </script within JS literals in ><script> 环境。这可能会导致模板解析器错误地将脚本上下文考虑为提前终止,从而导致操作被错误转义。这可被用于执行 XSS 攻击。(CVE-2023-39319)
- 当在模块内执行“go”命令时,Go 1.21 中引入的 go.mod 工具链指令可用于执行相对于模块根目录的脚本和二进制文件。此操作适用于使用“go”命令从模块代理下载的模块,以及直接使用 VCS 软件下载的模块。(CVE-2023-39320)
- 处理 QUIC 连接的不完整握手后消息时可能会引发恐慌。(CVE-2023-39321)
- QUIC 连接在读取握手后消息时不会设置缓冲数据量的上限,因而可促使恶意 QUIC 连接导致无限的内存增长。通过修复,连接现在可持续拒绝大于 65KiB 的消息。(CVE-2023-39322)
- Line 指令(“//line”)可用于绕过”//go: cgo_ 指令中的限制,允许在编译过程中传递被阻断的链接器和编译器标记。这可能会导致运行“go build”时意外执行任意代码。line 指令需要指令所在文件的绝对路径,这使得利用此问题变得更加复杂。(CVE-2023-39323)
- 恶意 HTTP/2 客户端如快速创建请求并立即重置请求,可能会导致服务器资源消耗过多。虽然请求总数受到 http2.Server.MaxConcurrentStreams 设置的限制,但重置正在进行的请求允许攻击者在现有请求仍在执行时创建新请求。应用修复程序后,HTTP/2 服务器现在会将同时执行的处理程序 goroutine 的数量绑定到流并发限制 (MaxConcurrentStreams)。达到限制时到达的新请求(这只能在客户端重置目前正在进行的请求之后发生)将排入队列,直到处理程序退出。如果请求队列变得太大,服务器将终止连接。对于手动配置 HTTP/2 的用户,golang.org/x/net/http2 中也修复了此问题。默认的流并发限制为每个 HTTP/2 连接 250 个流(请求)。可以使用 golang.org/x/net/http2 包来调整该值。请参阅 Server.MaxConcurrentStreams 设置和 ConfigureServer 函数。(CVE-2023-39325)
- HTTP/2 协议允许拒绝服务(服务器资源消耗),因为取消请求即可快速重置许多流,正如在 2023 年 8 月到 2023 年 10 月期间在现实环境中利用的那样。(CVE-2023-44487)
请注意,Nessus 尚未测试这些问题,而是只依据应用程序自我报告的版本号进行判断。
解决方案
所有 Go 用户皆应升级到最新版本:
# emerge --sync # emerge --ask --oneshot --verbose >=dev-lang/go-1.20.10 # emerge --ask --oneshot --verbose @golang-rebuild
插件详情
文件名: gentoo_GLSA-202311-09.nasl
支持的传感器: Nessus
风险信息
矢量: CVSS2#AV:N/AC:L/Au:N/C:C/I:C/A:C
矢量: CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
时间矢量: CVSS:3.0/E:F/RL:O/RC:C
漏洞信息
CPE: cpe:/o:gentoo:linux, p-cpe:/a:gentoo:linux:go
必需的 KB 项: Host/local_checks_enabled, Host/Gentoo/release, Host/Gentoo/qpkg-list
易利用性: Exploits are available
CISA 已知可遭利用的漏洞到期日期: 2023/10/31
参考资料信息
CVE: CVE-2022-2879, CVE-2022-2880, CVE-2022-41715, CVE-2022-41717, CVE-2022-41723, CVE-2022-41724, CVE-2022-41725, CVE-2023-24534, CVE-2023-24536, CVE-2023-24537, CVE-2023-24538, CVE-2023-29402, CVE-2023-29403, CVE-2023-29404, CVE-2023-29405, CVE-2023-29406, CVE-2023-29409, CVE-2023-39318, CVE-2023-39319, CVE-2023-39320, CVE-2023-39321, CVE-2023-39322, CVE-2023-39323, CVE-2023-39325, CVE-2023-44487