| RFC 9116 | security.txt | 2022年4月 |
| Foudil & Shafranovich | 信息性 | [页] |
当安全漏洞被研究人员发现时, 往往缺少适当的报告渠道。因此, 漏洞可能会无人报告。本文档定义了一种机器可解析格式 (“security.txt”),用于帮助组织描述其漏洞披露实践, 从而使研究人员更容易报告漏洞。¶
本文档不是互联网标准轨道规范;它是 为信息性目的发布的。¶
本文档是互联网工程任务组 (IETF)的产物。它代表了 IETF 社区的共识。它已经 经过公开审查,并已获互联网工程指导组(IESG) 批准发布。并非所有由 IESG 批准的文档 都是任何级别的互联网标准候选文档; 参见 RFC 7841 第 2 节。¶
关于本文档当前状态、任何 勘误以及如何提供反馈的信息,可从 https://www.rfc-editor.org/info/rfc9116 获取。¶
Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
许多安全研究人员会遇到这样的情况:他们无法 向组织报告安全漏洞,因为没有可用于联系特定 资源所有者的报告渠道,也没有关于此类所有者 漏洞披露实践的信息。¶
按照 第 4 节 of [RFC2142], 现有约定是使用 <SECURITY@domain> 电子邮件地址进行 安全问题相关通信。该约定每个域仅提供一个 基于电子邮件的单一通信渠道,并且没有提供 一种让域所有者发布其安全披露实践信息的方式。¶
此外,第 2 节 of [RFC3013] 为互联网服务提供商 (ISP)规定了联系约定,第 3.2 节 of [RFC2350] 为计算机安全事件 响应团队(CSIRT)规定了联系约定, 第 5.2 节 of [RFC2196] 为站点运营者 规定了联系约定。按照 [RFC7485],区域互联网注册机构 (RIR)和域名注册机构还为 IP 地址、 自治系统号(ASN)和域名的所有者提供联系信息。然而, 这些都没有解决安全研究人员如何定位组织的联系信息 和漏洞披露实践,以便报告漏洞的问题。¶
在本文档中,我们定义了一种更丰富、机器可解析且更具可扩展性 的方式,让组织可以传达关于其安全披露 实践以及联系途径的信息。漏洞披露的其他细节 不在本文档范围内。鼓励读者查阅其他 文档,例如 [ISO.29147.2018] 或 [CERT.CVD]。¶
按照 [CERT.CVD], “漏洞响应”指产品漏洞报告, 它与网络入侵和网站被攻陷的报告 (“事件响应”)相关但不同。本文档定义的机制旨在 用于前者(“漏洞响应”)。如果实现者希望 将此机制用于事件响应,则应注意 第 5.1 节 中讨论的其他安全考虑。¶
“security.txt” 文件旨在作为组织维护的其他关于 其安全披露实践的公共资源的补充,而不是其替代品 或取代品。¶
本文档中的关键词 “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、 “SHALL NOT”、 “SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“NOT RECOMMENDED”、“MAY” 和 “OPTIONAL”,当且仅当它们像这里所示以全大写形式出现时, 应按照 BCP 14 [RFC2119] [RFC8174] 中所述进行解释。¶
术语 “researcher” 对应于 [ISO.29147.2018] 和 [CERT.CVD] 中的术语 “finder” 和 “reporter”。 术语 “organization” 对应于 [ISO.29147.2018] 和 [CERT.CVD] 中的术语 “vendor”。¶
术语 “implementors” 包括参与 漏洞披露过程的所有各方。¶
本文档定义了一个放置在已知位置的文本文件, 它提供关于特定组织漏洞披露实践的信息。 此文件的格式是机器可解析的,并且必须遵循 第 4 节 中定义的 ABNF 语法。此文件旨在帮助安全研究人员 披露安全漏洞。¶
按照约定,该文件命名为 “security.txt”。其位置和范围在 第 3 节 中描述。¶
此文本文件包含多个具有不同值的字段。字段包含一个 “名称”,它是字段的第一部分,一直到冒号 (例如:“Contact:”),并遵循 第 3.6.8 节 of [RFC5322] 中为 “field-name” 定义的语法。字段名称不区分大小写(按照 第 2.3 节 of [RFC5234])。 “值”位于字段名称之后(例如:“mailto:security@example.com”),并遵循 第 3.2.5 节 of [RFC5322] 中为 “unstructured” 定义的语法。该文件可以包含空行。¶
字段必须始终由名称和值组成 (例如:“Contact: mailto:security@example.com”)。“security.txt” 文件 可以拥有无限数量的字段。每个字段必须出现在 自己单独的一行中。除非字段定义另有规定, 多个值不得链接在一起作为单个字段。 除非特定字段的定义中另有说明,否则一个字段可以 出现多次。¶
实现者应注意,某些字段可能 包含使用百分号编码的 URI(按照 第 2.1 节 of [RFC3986])。¶
建议 使用 第 7 节 of [RFC4880] 中描述的 OpenPGP 明文签名 对 “security.txt” 文件进行数字签名。使用数字签名时,还 建议组织使用 “Canonical” 字段(按照 第 2.5.2 节), 从而允许数字签名认证该文件的位置。¶
在验证用于生成签名的密钥时, 安全研究人员始终有责任确保所使用的密钥 确实是其信任的密钥。¶
与许多其他格式和协议一样,此格式可能需要随着时间推移 发生变化,以适应不断变化的互联网环境。因此, 可扩展性通过 第 6.2 节 中定义的字段 IANA 注册表提供。 通过该过程注册的任何字段必须 视为可选。为了鼓励可扩展性和互操作性, 研究人员必须忽略他们未明确支持的任何字段。¶
除非另有说明,所有字段必须 视为可选。¶
“Acknowledgments” 字段表示指向某个页面的链接, 在该页面上会表彰提交报告的安全 研究人员。所引用的页面应列出报告安全漏洞 并协作修复这些漏洞的安全研究人员。组织应注意 限制所发布的漏洞信息,以防止 未来的攻击。¶
如果此字段表示 Web URI,则它必须以 “https://” 开头 (按照 第 2.7.2 节 of [RFC7230])。¶
示例:¶
Acknowledgments: https://example.com/hall-of-fame.html¶
安全致谢页面示例:¶
We would like to thank the following researchers: (2017-04-15) Frank Denis - Reflected cross-site scripting (2017-01-02) Alice Quinn - SQL injection (2016-12-24) John Buchner - Stored cross-site scripting (2016-06-10) Anna Richmond - A server configuration issue¶
“Canonical” 字段表示 “security.txt” 文件所在的规范 URI, 通常类似于 “https://example.com/.well-known/security.txt”。 如果此字段表示 Web URI,则它必须以 “https://” 开头 (按照 第 2.7.2 节 of [RFC7230])。¶
虽然此字段表示从给定 URI 检索到的 “security.txt” 旨在适用于该 URI,但它不得 被解释为适用于文件中列出的所有规范 URI。研究人员应该 使用额外的信任机制(例如数字签名,按照 第 2.3 节)来确定 特定规范 URI 是否适用。¶
如果此字段出现在 “security.txt” 文件中,而用于 检索该文件的 URI 未列在任何 canonical 字段中, 则该文件的内容不应该被信任。¶
Canonical: https://www.example.com/.well-known/security.txt Canonical: https://someserver.example.com/.well-known/security.txt¶
“Contact” 字段表示研究人员 应用于报告安全漏洞的方法,例如电子邮件地址、电话号码和/或 带有联系信息的网页。此字段必须 始终存在于 “security.txt” 文件中。如果此字段表示 Web URI, 则它必须以 “https://” 开头(按照 第 2.7.2 节 of [RFC7230])。 安全电子邮件地址应使用 第 4 节 of [RFC2142] 中定义的约定。¶
该值必须遵循 第 3 节 of [RFC3986] 中描述的 URI 语法。 这意味着在指定电子邮件地址和电话号码时,必须使用 [RFC6068] 和 [RFC3966] 中定义的 “mailto” 和 “tel” URI 方案。 当此字段的值是电子邮件地址时, 建议使用加密(按照 第 2.5.4 节)。¶
这些字段应该按偏好顺序列出, 第一次出现的是首选 联系方式,第二次出现的是第二首选联系方式,依此类推。 在下面的示例中,第一个电子邮件地址 (“security@example.com”)是首选联系方式。¶
Contact: mailto:security@example.com Contact: mailto:security%2Buri%2Bencoded@example.com Contact: tel:+1-201-555-0123 Contact: https://example.com/security-contact.html¶
“Encryption” 字段表示安全研究人员 应用于加密通信的加密密钥。密钥不得 出现在此字段中。相反,此字段的值 必须是指向可检索该密钥的位置的 URI。 如果此字段表示 Web URI,则它必须以 “https://” 开头 (按照 第 2.7.2 节 of [RFC7230])。¶
在验证密钥真实性时,安全研究人员 始终有责任确保所指定的密钥确实是 他们信任的密钥。研究人员不得假设该密钥 用于生成 第 2.3 节 中引用的数字签名。¶
可从 Web 服务器获得的 OpenPGP 密钥示例:¶
Encryption: https://example.com/pgp-key.txt¶
可从 OPENPGPKEY DNS 记录获得的 OpenPGP 密钥示例:¶
Encryption: dns:5d2d37ab76d47d36._openpgpkey.example.com?type=OPENPGPKEY¶
通过指纹引用 OpenPGP 密钥的示例:¶
Encryption: openpgp4fpr:5f2de5521c63a801ab59ccb603d49de44b29100f¶
“Expires” 字段表示在何日期和时间之后, “security.txt” 文件中包含的数据 被视为过时且不应使用(按照 第 5.3 节)。此字段的值按照 [ISO.8601-1] 和 [ISO.8601-2] 的互联网配置文件进行格式化,具体如 [RFC3339] 中所定义。建议 该字段的值小于未来一年,以避免过时。¶
此字段必须始终存在,并且 不得出现多于一次。¶
Expires: 2021-12-31T18:37:07z¶
“Hiring” 字段用于链接到供应商的 安全相关职位。 如果此字段表示 Web URI,则它必须以 “https://” 开头 (按照 第 2.7.2 节 of [RFC7230])。¶
Hiring: https://example.com/jobs.html¶
# Our security address Contact: mailto:security@example.com # Our OpenPGP key Encryption: https://example.com/pgp-key.txt # Our security policy Policy: https://example.com/security-policy.html # Our security acknowledgments page Acknowledgments: https://example.com/hall-of-fame.html Expires: 2021-12-31T18:37:07z¶
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 # Canonical URI Canonical: https://example.com/.well-known/security.txt # Our security address Contact: mailto:security@example.com # Our OpenPGP key Encryption: https://example.com/pgp-key.txt # Our security policy Policy: https://example.com/security-policy.html # Our security acknowledgments page Acknowledgments: https://example.com/hall-of-fame.html Expires: 2021-12-31T18:37:07z -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.2 [signature] -----END PGP SIGNATURE-----¶
对于基于 Web 的服务,组织必须将 “security.txt” 文件放置在 “/.well-known/” 路径下,例如 https://example.com/.well-known/security.txt, 按照域名或 IP 地址的 [RFC8615]。为了 旧版兼容性,“security.txt” 文件可以放置在顶级路径 或重定向(按照 第 6.4 节 of [RFC7231])到 “/.well-known/” 路径下的 “security.txt” 文件。如果 “security.txt” 文件 同时存在于两个位置,则必须使用 “/.well-known/” 路径下的那个。¶
该文件必须通过 HTTP 1.0 或更高版本访问, 并且文件访问必须使用 “https” 方案(按照 第 2.7.2 节 of [RFC7230])。 它必须具有 “text/plain” 的 Content-Type, 且默认 charset 参数设置为 “utf-8”(按照 第 4.1.3 节 of [RFC2046])。¶
检索 “security.txt” 文件以及这些文件中指示的资源可能会导致 重定向(按照 第 6.4 节 of [RFC7231])。 研究人员应执行额外分析(按照 第 5.2 节),以确保这些重定向 不是恶意的,或不是指向攻击者控制的资源。¶
“security.txt” 文件必须仅适用于用于检索它的 URI 中的域 或 IP 地址,而不适用于其任何子域或父域。 “security.txt” 文件也可以适用于发布该文件的组织 提供的产品和服务。¶
按照 第 1.1 节,本规范 旨在用于漏洞响应。 如果实现者希望将其用于事件响应,则应注意 第 5.1 节 中讨论的其他 安全考虑。¶
组织应该使用 policy 指令(按照 第 2.5.7 节) 来提供关于其漏洞披露流程范围和细节的附加信息。¶
下面给出一些示例:¶
# The following only applies to example.com. https://example.com/.well-known/security.txt # This only applies to subdomain.example.com. https://subdomain.example.com/.well-known/security.txt # This security.txt file applies to IPv4 address of 192.0.2.0. https://192.0.2.0/.well-known/security.txt # This security.txt file applies to IPv6 address of 2001:db8:8:4::2. https://[2001:db8:8:4::2]/.well-known/security.txt¶
“security.txt” 文件的文件格式必须是纯文本(MIME 类型 “text/plain”),如 第 4.1.3 节 of [RFC2046] 中定义,并且必须 使用 Net-Unicode 形式的 UTF-8 [RFC3629] 编码 [RFC5198]。¶
此文件的格式必须遵循下面的 ABNF 定义 (该定义纳入来自 [RFC5234] 的核心 ABNF 规则,并使用 [RFC7405] 中的区分大小写字符串支持)。¶
body = signed / unsigned
unsigned = *line (contact-field eol) ; one or more required
*line (expires-field eol) ; exactly one required
*line [lang-field eol] *line ; exactly one optional
; order of fields within the file is not important
; except that if contact-field appears more
; than once, the order of those indicates
; priority (see Section 3.5.3)
; signed is the production that should match the OpenPGP clearsigned
; document
signed = cleartext-header
1*(hash-header)
CRLF
cleartext
signature
cleartext-header = %s"-----BEGIN PGP SIGNED MESSAGE-----" CRLF
hash-header = %s"Hash: " hash-alg *("," hash-alg) CRLF
hash-alg = token
; imported from RFC 2045; see RFC 4880 Section
; 10.3.3 for a pointer to the registry of
; valid values
;cleartext = 1*( UTF8-octets [CR] LF)
; dash-escaped per RFC 4880 Section 7.1
cleartext = *((line-dash / line-from / line-nodash) [CR] LF)
line-dash = ("- ") "-" *UTF8-char-not-cr
; MUST include initial "- "
line-from = ["- "] "From " *UTF8-char-not-cr
; SHOULD include initial "- "
line-nodash = ["- "] *UTF8-char-not-cr
; MAY include initial "- "
UTF8-char-not-dash = UTF8-1-not-dash / UTF8-2 / UTF8-3 / UTF8-4
UTF8-1-not-dash = %x00-2C / %x2E-7F
UTF8-char-not-cr = UTF8-1-not-cr / UTF8-2 / UTF8-3 / UTF8-4
UTF8-1-not-cr = %x00-0C / %x0E-7F
; UTF8 rules from RFC 3629
UTF8-octets = *( UTF8-char )
UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
UTF8-1 = %x00-7F
UTF8-2 = %xC2-DF UTF8-tail
UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
%xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) /
%xF1-F3 3( UTF8-tail ) /
%xF4 %x80-8F 2( UTF8-tail )
UTF8-tail = %x80-BF
signature = armor-header
armor-keys
CRLF
signature-data
armor-tail
armor-header = %s"-----BEGIN PGP SIGNATURE-----" CRLF
armor-keys = *(token ": " *( VCHAR / WSP ) CRLF)
; Armor Header Keys from RFC 4880
armor-tail = %s"-----END PGP SIGNATURE-----" CRLF
signature-data = 1*(1*(ALPHA / DIGIT / "=" / "+" / "/") CRLF)
; base64; see RFC 4648
; includes RFC 4880 checksum
line = [ (field / comment) ] eol
eol = *WSP [CR] LF
field = ; optional fields
ack-field /
can-field /
contact-field / ; optional repeated instances
encryption-field /
hiring-field /
policy-field /
ext-field
fs = ":"
comment = "#" *(WSP / VCHAR / %x80-FFFFF)
ack-field = "Acknowledgments" fs SP uri
can-field = "Canonical" fs SP uri
contact-field = "Contact" fs SP uri
expires-field = "Expires" fs SP date-time
encryption-field = "Encryption" fs SP uri
hiring-field = "Hiring" fs SP uri
lang-field = "Preferred-Languages" fs SP lang-values
policy-field = "Policy" fs SP uri
date-time = < imported from Section 5.6 of [RFC3339] >
lang-tag = < Language-Tag from Section 2.1 of [RFC5646] >
lang-values = lang-tag *(*WSP "," *WSP lang-tag)
uri = < URI as per Section 3 of [RFC3986] >
ext-field = field-name fs SP unstructured
field-name = < imported from Section 3.6.8 of [RFC5322] >
unstructured = < imported from Section 3.2.5 of [RFC5322] >
token = < imported from Section 5.1 of [RFC2045] >
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
BIT = "0" / "1"
CHAR = %x01-7F
; any 7-bit US-ASCII character,
; excluding NUL
CR = %x0D
; carriage return
CRLF = CR LF
; Internet standard newline
CTL = %x00-1F / %x7F
; controls
DIGIT = %x30-39
; 0-9
DQUOTE = %x22
; " (Double Quote)
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
HTAB = %x09
; horizontal tab
LF = %x0A
; linefeed
LWSP = *(WSP / CRLF WSP)
; Use of this linear-white-space rule
; permits lines containing only white
; space that are no longer legal in
; mail headers and have caused
; interoperability problems in other
; contexts.
; Do not use when defining mail
; headers and use with caution in
; other contexts.
OCTET = %x00-FF
; 8 bits of data
SP = %x20
VCHAR = %x21-7E
; visible (printing) characters
WSP = SP / HTAB
; white space
¶
由于使用了 URI 和知名资源, [RFC3986] 和 [RFC8615] 的安全考虑适用于此处,此外还包括 下面列出的考虑事项。¶
攻陷网站的攻击者也能够攻陷 “security.txt” 文件,或设置到其自己站点的重定向。 这可能导致安全报告无法被组织接收, 或被发送给攻击者。¶
为了防止这种情况,组织应使用 “Canonical” 字段来指示 文件的位置(按照 第 2.5.2 节),对其 “security.txt” 文件进行数字签名(按照 第 2.3 节),并定期监控该文件 和所引用的资源,以检测篡改。¶
安全研究人员在使用文件中包含的信息之前,应验证 “security.txt” 文件,包括验证 数字签名并检查任何可用的历史记录。如果 “security.txt” 文件看起来可疑或已被攻陷, 则不应使用它。¶
虽然不建议这样做,但实现者可以选择使用 “security.txt” 文件中发布的信息进行事件响应。在这种情况下, 在信任此类信息之前应极其谨慎,因为 它可能已被攻击者攻陷。研究人员应使用其他方法 来验证此类数据,包括带外验证 Pretty Good Privacy(PGP) 签名、基于 DNSSEC 的方法等。¶
如果 “security.txt” 文件中引用的信息和资源不正确 或未保持最新,这可能导致安全报告无法被 组织接收,或被发送给错误的联系人,从而可能 将安全问题暴露给第三方。没有 “security.txt” 文件可能 比在此文件中包含过时信息更好。组织必须使用 “Expires” 字段(见 第 2.5.5 节)向研究人员指明 文件中的数据何时不再有效。¶
组织应确保此文件中的信息以及任何引用的 资源(例如网页、电子邮件地址和电话号码) 保持最新、可访问、由组织控制, 并保持安全。¶
被攻陷或恶意站点可能会创建异常 大或其他格式错误的文件,试图发现或利用 解析代码中的弱点。 研究人员应确保任何此类代码 能够稳健地处理大型或格式错误的文件和字段,并且他们可以选择不 解析大于 32 KB、字段长于 2,048 个字符或 包含超过 1,000 行的文件。ABNF 语法(如 第 4 节 中定义)也可作为验证这些文件的方式。¶
同样的担忧也适用于 “security.txt” 文件中引用的任何其他资源, 以及发布此文件后收到的任何安全报告。 此类资源和报告可能是敌意的、格式错误的或恶意的。¶
“security.txt” 文件的存在可能会被研究人员 解释为授予他们针对发布该文件的域或 IP 地址 或针对发布该文件的组织提供的产品和服务 进行安全测试的许可。 这可能导致研究人员对组织进行更多测试。另一方面, 不发布 “security.txt” 文件的决定可能会被 运营该网站的组织解释为向研究人员发出信号: 拒绝对该特定站点或项目进行测试的许可。这可能导致 研究人员向该组织报告安全问题时受到阻力。¶
因此,研究人员不应假定 “security.txt” 文件的存在或缺失授予或拒绝安全测试许可。 任何此类许可可以在公司的漏洞披露政策中说明 (按照 第 2.5.7 节),也可以在新字段中说明(按照 第 2.4 节)。¶
在多用户/多租户环境中,用户可能能够 接管 “security.txt” 文件的位置。组织应在根处保留 “security.txt” 命名空间,以确保没有第三方可以创建带有 “security.txt” 和 “/.well-known/security.txt” 名称的页面。¶
为了防止 “security.txt” 文件在传输过程中被篡改, 实现者在提供文件本身以及检索其中 引用的任何 Web URI 时必须使用 HTTPS(按照 第 2.7.2 节 of [RFC7230])(除非本规范另有说明)。作为 TLS 握手的一部分,研究人员应按照 [RFC6125] 和以下考虑事项验证所提供的 X.509 证书:¶
还可以通过在线证书状态协议(OCSP) [RFC6960]、证书吊销列表(CRL)或类似机制 检查证书吊销状态。¶
在 “security.txt” 文件无法通过 HTTPS 提供(例如 localhost)或使用无效证书提供的情况下,建议进行额外的人工验证,因为 内容可能在传输过程中已被修改。¶
作为额外保护层,还建议 组织使用 OpenPGP 对其 “security.txt” 文件进行数字签名(按照 第 2.3 节)。 此外,为了保护安全报告在传输过程中不被篡改或观察, 组织应指定加密密钥(按照 第 2.5.4 节),除非 使用 HTTPS 提交报告。¶
然而,此类密钥有效性的确定不在 本规范范围内。安全研究人员需要建立其他安全方式来 验证它们。¶
实现者应注意, “security.txt” 文件中引用的任何资源不得指向 Well-Known URIs 命名空间,除非 它们已在 IANA 注册(按照 [RFC8615])。¶
IANA 已根据 [RFC8126] 创建 “security.txt Fields” 注册表。该注册表包含 用于 “security.txt” 文件的字段,这些字段由本规范定义。¶
新的注册或更新必须按照 [RFC8126] 的第 4.5 节和 5 节中所述的 “Expert Review” 指南发布。如此注册的任何新字段 均被本规范视为可选,除非发布本规范的新版本。¶
指定专家应确定拟议的注册或更新 是否为使用此格式的组织和研究人员提供价值,并且在行业接受的漏洞披露流程 (例如 [ISO.29147.2018] 和 [CERT.CVD])的背景下是否合理。¶
新的注册和更新必须包含 以下信息:¶
现有注册可由本文档未来的更新按适当情况 标记为 historic 或 deprecated。¶
初始注册表包含以下值:¶
2.1. 注释
任何以 “#”(%x23)符号开头的行必须 被解释为注释。注释内容可以包含 %x21-7E 和 %x80-FFFFF 范围内的任何 ASCII 或 Unicode 字符,以及制表符(%x09) 和空格(%x20)字符。¶
示例:¶