Go 安全决策
概述
本文档包含了 Go 安全团队针对各种常见上报问题所做出的决策。它主要作为一份参考,列出了我们不视为漏洞的情况。
此列表并非详尽无遗。
漏洞
远程代码执行
允许攻击者在预期不会执行代码的情况下执行代码的场景,属于 PRIVATE-track(私有跟踪)漏洞。此决策优先于所有其他决策。
本决策不涵盖那些预期会执行代码的函数。
包含的情况:
- 解析函数在处理恶意输入时执行了代码。
- 恶意请求导致 HTTP 服务器执行了代码。
不包含的情况:
go test命令会运行测试。在攻击者控制的测试上运行go test不在我们的威胁模型范围内。
恐慌
在处理攻击者控制的输入时发生恐慌,可能是一个漏洞。
在预期处理攻击者控制请求的服务器(例如 net/http 服务器)中发生的恐慌,通常是 PRIVATE-track(私有跟踪)漏洞。
在客户端(例如 net/http 客户端)中发生的恐慌,通常是 PUBLIC-track(公开跟踪)漏洞。
在处理可能的恶意输入的包中的解析函数中发生的恐慌(例如 archive/zip 或 image/png),通常是 PUBLIC-track(公开跟踪)漏洞。
由于其自然大小(例如非常大的图像)而导致恐慌的输入,通常不被归类为漏洞。
对于那些并非明显设计用于解析可能恶意数据的函数,其无效输入不在我们的威胁模型范围内,并且通常不属于安全漏洞的范畴。例如,图像解析器预期能够抵御无效输入,但图像编码器中的恐慌可能是一个 bug,但不会被当作漏洞处理。
过度的资源消耗
我们通常将过度的 CPU 或内存消耗(例如运行时相对于输入大小为 O(n²) 的函数)视为等同于恐慌。
非漏洞
攻击者控制的环境
如果一次攻击依赖于攻击者对程序运行环境的控制,则它不是一个漏洞。
这包括但不限于攻击者有能力向 $PATH 添加程序或设置任意环境变量的情况。
image, x/image: 大图像
解析大图像可能会分配大量内存。例如,一张 65536x65536 像素的 32 位颜色图像需要 16 MiB 来存储未压缩数据。
许多图像压缩格式可以将大的简单图像压缩成非常小的文件。解码这个小文件可能会分配大量内存。
解析不可信图像的用户应在解析前使用类似 image.DecodeConfig 的函数验证图像大小。
我们认为图像解析函数解码一个经过良好压缩的大图像,并不属于漏洞。
net/http: 重定向
net/http 包的 HTTP 客户端处理重定向。它在重定向处理中实现了与安全相关的行为。例如,当跟随重定向到一个不是初始请求域名的子域或精确匹配的域名时,它会剥离 “Authorization” 头部。
头部剥离是一种纵深防御措施,旨在避免配置错误或被入侵的服务器无意中将包含敏感头部的客户端请求转发到不受信任的目标。未能在重定向时剥离头部本身并不会让攻击者获取传递在头部中的凭据。然而,它可能与其他漏洞(例如,服务器存在开放重定向漏洞)结合利用来实现此目的。
更改 HTTP 客户端的行为存在很高的风险,会破坏依赖于当前行为的现有用户。例如,客户端的同源策略目前允许子域(从 example.com 重定向到 www.example.com 将保留头部),而 WHATWG Fetch 标准则不允许。将客户端与标准对齐可能是有价值的,但在安全版本中这样做更可能给现有用户带来困扰,而非解决真正的漏洞。
由于重定向清理是一项纵深防御措施,且对其进行更改存在风险,我们认为 HTTP 客户端重定向的所有方面都超出了安全漏洞处理流程的范围。