Go 安全策略

概览

本文档说明了 Go 安全团队处理报告问题以及您期望得到的回应的过程。

报告安全漏洞

Go 发行版中的所有安全漏洞都应通过电子邮件发送至 security@golang.org。此邮件将发送给 Go 安全团队。

为确保您的报告不被标记为垃圾邮件,请在您的电子邮件中包含“vulnerability”一词。请为您的报告邮件使用描述性的主题行。

您的电子邮件将在 7 天内得到确认,并且您将及时了解进展情况,直至问题解决。您的问题将在 90 天内得到修复或公开。

如果您在 7 天内未收到电子邮件回复,请再次与 Go 安全团队联系 security@golang.org。请确保您的电子邮件中包含vulnerability一词。

如果您在 3 天后仍未收到对您报告的确认,则您的电子邮件可能已被标记为垃圾邮件。在这种情况下,请在此处提交问题。选择“我要报告 Google 产品相关的技术安全或滥用风险漏洞(SQLi、XSS 等)”,并将“Go”列为受影响的产品。

跟踪

根据您问题的性质,Go 安全团队会将其归类为 PUBLIC、PRIVATE 或 URGENT 跟踪的问题。所有安全问题都将分配 CVE 编号。

Go 安全团队不会为安全问题分配传统的细粒度严重性标签(例如 CRITICAL、HIGH、MEDIUM、LOW),因为严重性高度取决于用户如何使用受影响的 API 或功能。

例如,encoding/json 解析器中的资源耗尽问题的潜在影响取决于正在解析的内容。如果用户解析来自本地文件系统的受信任 JSON 文件,则影响可能很低。如果用户解析来自 HTTP 请求正文的不可信任意 JSON,则影响可能高得多。

尽管如此,以下问题跟踪也表明了安全团队认为问题的严重程度和/或影响范围。例如,对许多用户具有中等到显著影响的问题是此策略中的 PRIVATE 跟踪问题,而影响可以忽略不计或很小的,或者仅影响一小部分用户的问题是 PUBLIC 跟踪问题。

PUBLIC

PUBLIC 跟踪的问题影响小众配置、影响非常有限或已经广为人知。

PUBLIC 跟踪的问题会带有 Proposal-Security 标签,通过 Go 提案审查流程进行讨论,公开修复,并向下一个计划的 次要版本(大约每月一次)进行反向移植。发布公告将包含这些问题的详细信息,但不会提前公告。

过去 PUBLIC 问题的示例包括

  • #44916:archive/zip:调用 Reader.Open 时可能出现 panic
  • #44913:encoding/xml:使用 xml.NewTokenDecoder 配合自定义 TokenReader 时出现无限循环
  • #43786:crypto/elliptic:P-224 曲线上的错误操作
  • #40928:net/http/cgi,net/http/fcgi:当 Content-Type 未指定时发生跨站脚本(XSS)
  • #40618:encoding/binary:ReadUvarint 和 ReadVarint 可以从无效输入读取无限数量的字节
  • #36834:crypto/x509:Windows 10 上的证书验证绕过

PRIVATE

PRIVATE 跟踪的问题是对已承诺的安全属性的违反。

PRIVATE 跟踪的问题将在下一个计划的 次要版本修复,在此之前将保持私密。

在发布前三到七天,会向 golang-announce 发送预先公告,宣布即将发布的版本中包含一个或多个安全修复程序,以及这些问题是否影响标准库、工具链或两者,以及每个修复程序的保留 CVE ID。

对于存在于主要版本发布候选版中的问题,我们遵循相同的流程,包括将修复程序包含在下一个计划发布的候选版中。

过去 PRIVATE 问题的部分示例包括

  • #53416:path/filepath:Glob 中的堆栈溢出
  • #53616:go/parser:所有 Parse* 函数中的堆栈溢出
  • #54658:net/http:在发送 GOAWAY 后处理服务器错误
  • #56284:syscall, os/exec:环境变量中未经验证的 NUL

URGENT

URGENT 跟踪的问题威胁到 Go 生态系统的完整性,或正在野外被积极利用并导致严重损害。目前没有近期示例,但它们将包括 net/http 中的远程代码执行,或 crypto/tls 中的实际密钥恢复。

URGENT 跟踪的问题将私密修复,并触发立即的专门安全发布,可能不会提前公告。

如果您认为现有问题与安全相关,我们要求您发送电子邮件至 security@golang.org。电子邮件应包含问题 ID 和简要说明,解释为什么应根据此安全策略处理该问题。

披露流程

Go 项目使用以下披露流程:

  1. 收到安全报告后,将指派一名主要处理者。此人负责协调修复和发布流程。

  2. 确认问题并确定受影响的软件列表。

  3. 审计代码以查找任何潜在的类似问题。

  4. 如果与提交者协商后确定需要分配 CVE 编号,则主要处理者将获取一个。

  5. 为最近两个主要版本和 head/master 修订版准备修复程序。为最近两个主要版本准备修复程序,并将其合并到 head/master。

  6. 在应用修复程序的日期,将向 golang-announce、golang-dev 和 golang-nuts 发送公告。

此过程可能需要一些时间,尤其是在需要与其他项目维护者协调的情况下。我们将尽一切努力以尽可能及时的方式处理此漏洞,但是,遵循上述流程以确保披露得到一致处理非常重要。

对于包含 CVE 编号分配的安全问题,该问题将在 CVEDetails 网站的“Golang”产品以及国家漏洞披露网站上公开列出。

接收安全更新

接收安全公告的最佳方式是订阅 golang-announce 邮件列表。任何与安全问题相关的消息都将以 [security] 开头。

对此策略的评论

如果您有任何改进此策略的建议,请提交问题进行讨论。