8. 安全注意事项
8. 安全注意事项 (Security Considerations)
same-origin policy 是许多 user agent (包括 Web 浏览器) 安全性的基石之一. 历史上, 一些 user agent 尝试过其他安全模型, 包括 taint tracking 和 exfiltration prevention, 但这些模型当时被证明难以实现 (尽管近期又有人对复兴其中一些想法产生兴趣).
评估 same-origin policy 的安全性很困难, 因为 origin 概念本身在安全格局中扮演着核心角色. 抽象的 origin 本身只是一个隔离单元, 与大多数一刀切概念一样并不完美. 即便如此, 它仍存在一些系统性弱点, 如下所述.
8.1 对 DNS 的依赖 (Reliance on DNS)
在实践中, same-origin policy 的安全性依赖 Domain Name System (DNS), 因为许多常用 URI scheme (例如 http) 使用基于 DNS 的命名授权机构. 如果 DNS 被部分或完全攻破, same-origin policy 可能无法提供应用所需的安全属性.
某些 URI scheme (例如 https) 对 DNS 攻破更具抵抗力, 因为 user agent 会采用证书等其他机制来验证从这些 URI 获取的内容来源. 其他 URI scheme, 例如 chrome-extension URI scheme (见 [CRX] 第 4.3 节), 使用基于公钥的命名授权机构, 因而完全不受 DNS 攻破影响.
Web origin 概念会隔离从不同 URI scheme 获取的内容; 这对于限制 DNS 攻破的影响至关重要.
8.2 不同的隔离单元 (Divergent Units of Isolation)
随着时间推移, 多种技术逐渐将 Web origin 概念作为一种方便的隔离单元. 然而, 今天使用的许多技术 (例如 cookies [RFC6265]) 早于现代 Web origin 概念. 这些技术通常具有不同的隔离单元, 从而导致漏洞.
一种替代做法是只使用 "registry-controlled" domain 作为隔离单元, 而不是使用 fully qualified domain name (例如使用 "example.com" 而不是 "www.example.com"). 这种做法由于多种原因存在问题, 因而不推荐 (NOT RECOMMENDED):
-
"registry-controlled" domain 的概念是围绕 DNS 的人为实践产物, 而不是 DNS 本身的属性. 例如, 日本许多市政机构在 DNS 层次结构中相当深的位置运行公共注册表. 虽然存在广泛使用的 "public suffix list", 但这些列表很难保持最新, 并且在不同实现之间存在差异.
-
这种做法与不使用基于 DNS 的命名授权机构的 URI scheme 不兼容. 例如, 如果某个 URI scheme 使用公钥作为命名授权机构, 那么 "registry-controlled" public key 的概念就有些不连贯. 更糟的是, 某些 URI scheme (例如 nntp) 使用与 DNS 相反方向的点分委派 (例如 alt.usenet.kooks), 另一些 scheme 虽然使用 DNS, 但以通常顺序的反向呈现 label (例如 com.example.www).
最好的情况下, 使用 "registry-controlled" domain 也是特定于 URI scheme 和实现的. 最坏的情况下, URI scheme 和实现之间的差异可能导致漏洞.
8.3 环境权限 (Ambient Authority)
使用 same-origin policy 时, user agent 会基于内容的 URI 授予内容权限, 而不是基于该内容可以指称哪些对象授予权限. 这种将 designation 与 authority 分离的做法是 ambient authority 的一个例子, 可能导致漏洞.
例如考虑 HTML 文档中的 cross-site scripting. 如果攻击者能够将脚本内容注入 HTML 文档, 这些脚本将以该文档 origin 的权限运行, 可能允许脚本访问敏感信息, 例如用户的医疗记录. 然而, 如果脚本权限被限制为脚本能够指称的那些对象, 那么攻击者将脚本注入第三方托管的 HTML 文档并不会获得任何优势.
8.4 IDNA 依赖和迁移 (IDNA Dependency and Migration)
same-origin policy 的安全属性可能关键依赖 user agent 所采用 IDNA 算法的细节. 特别是, 根据 user agent 使用 IDNA2003 [RFC3490] 还是 IDNA2008 [RFC5890], 它可能会将某些国际化域名 (例如涉及 U+00DF 字符的域名) 映射到不同的 ASCII 表示.
从一种 IDNA 算法迁移到另一种算法可能会重新绘制多个安全边界, 可能建立新的安全边界, 或更糟的是, 拆除两个彼此不信任实体之间的安全边界. 改变安全边界是有风险的, 因为将两个彼此不信任的实体合并到同一个 origin 中, 可能允许其中一方攻击另一方.