通过更新 HTTP 缓存提高安全性和隐私性

忘记或滥用 Cache-Control 标头可能会对您网站的安全性和用户隐私产生负面影响。

Arthur Sonzogni
Arthur Sonzogni

默认情况下,任何类型的缓存始终允许对资源进行缓存。不使用或滥用 Cache-Control 标头可能会对您网站的安全性和用户隐私产生负面影响。

如果您不想公开个性化回复,我们建议您执行以下任一操作:

  • 阻止中间方缓存资源。设置 Cache-Control: private
  • 设置适当的辅助缓存键。 如果响应因 Cookie 而发生变化(在 Cookie 存储凭据时可能会发生这种情况),请设置 Vary: Cookie

请继续阅读下文,了解其重要性,并探索:

  1. 您可能不知道的安全和隐私问题
  2. 不同类型的 HTTP 缓存和常见误解
  3. 针对高价值网站的推荐措施

Spectre 漏洞导致的泄漏资源

Spectre 漏洞允许页面读取操作系统进程的内存。这意味着攻击者可以在未经授权的情况下获得对跨源数据的访问。因此,新型网络浏览器会限制在启用了跨域隔离功能的网页上使用部分功能,例如 SharedArrayBuffer高分辨率计时器

现代网络浏览器会强制执行跨域嵌入器政策 (COEP)。这可确保跨源资源符合以下任一条件:

  • 公开资源,请求但未使用 Cookie
  • 通过 CORS 或 CORP 标头明确允许跨源共享的资源

COEP 设置无法防止攻击者利用 Spectre。但是,这可确保跨域资源对攻击者毫无价值(当浏览器作为公共资源加载时),也不允许与攻击者共享跨域资源(与 CORP: cross-origin 共享时)。

HTTP 缓存对 Spectre 有何影响?

如果 Cache-Control 标头设置不正确,攻击者可能会发起攻击。例如:

  1. 系统会缓存存储了凭据的资源。
  2. 攻击者加载了一个跨源隔离页面。
  3. 攻击者再次请求资源。
  4. COEP:credentialless 由浏览器设置,因此获取资源时不使用 Cookie。不过,缓存可能会改为返回存储了凭据的响应。
  5. 然后,攻击者可以使用 Spectre 攻击来读取个性化资源。

虽然网络浏览器的 HTTP 缓存实际不允许此类攻击发生,但存在额外的缓存超出了浏览器的直接控制范围。这可能会导致此攻击取得成功。

关于 HTTP 缓存的常见误解

1. 资源仅由浏览器缓存

通常有多层缓存。有些缓存专门用于单个用户,有些则供多个用户使用。其中一些由服务器控制,一些由用户控制,另一些由中间方控制。

  • 浏览器缓存。这些缓存由单个用户拥有并专用于单个用户,并在用户的网络浏览器中实现。它们可以避免多次获取相同的响应,从而提高性能。
  • 本地代理。此环境可能已由用户安装,但也可以由中间方(其公司、其组织或互联网提供商)管理。本地代理通常会为多个用户缓存单个响应,从而构成“公共”缓存。本地代理具有多个角色。
  • 源服务器缓存 / CDN。这由服务器控制。源服务器缓存的目标是通过为多个用户缓存相同的响应来减少源服务器的负载。CDN 的目标类似,但它们分布在全球各地并分配给最近的一组用户,以减少延迟时间。
浏览器与服务器之间通常会有多层缓存。
浏览器与服务器之间可能存在各种缓存层。例如,您可能会遇到服务器缓存,然后是 CDN 和浏览器缓存。CDN 与浏览器缓存之间也可能存在本地代理设置。

2. SSL 可防止中间机构缓存 HTTPS 资源

许多用户会定期使用本地配置的代理,无论是用于访问目的(例如共享按流量计费的连接)、病毒检查还是用于数据泄露防护 (DLP) 目的。中间缓存正在执行 TLS 拦截

中间缓存通常安装在公司员工的工作站上。网络浏览器已配置为信任本地代理的证书。

最终,这些本地代理可能会缓存一些 HTTPS 资源。

HTTP 缓存的工作原理

  • 默认情况下,系统隐式允许缓存资源。
  • 主缓存键由网址和方法组成。(网址、方法)
  • 辅助缓存键Vary 标头中包含的标头。Vary: Cookie 表示响应取决于 Cookie
  • Cache-Control 标头提供更精细的控制。

高价值网站(包括高流量网站和与个人身份信息交互的网站)的开发者应立即采取行动来提高安全性。

如果对资源的访问因 Cookie 而异,则存在最大的风险。对于未采取预防措施的请求,中间缓存可能会返回使用 Cookie 请求的响应。

建议您采取以下措施之一:

  • 阻止中间方缓存资源。设置 Cache-Control: private
  • 设置适当的辅助缓存键。 如果响应因 Cookie 而发生变化(在 Cookie 存储凭据时可能会发生这种情况),请设置 Vary: Cookie

尤其需要更改默认行为:始终定义 Cache-ControlVary

其他注意事项

还有其他类似类型的攻击使用 HTTP 缓存,但这些攻击依赖于与跨域隔离不同的机制。例如,Jake Archibald 在如何在 CORS 中胜出中描述了一些攻击。

一些网络浏览器会根据请求资源响应时是否使用了凭据来拆分其 HTTP 缓存,从而缓解了这些攻击。自 2022 年起,Firefox 确实会拆分缓存,而 Chrome 和 Safari 则不会。 Chrome 将来可能会拆分缓存。请注意,这些攻击是不同的,与按顶级源进行拆分相辅相成。

即使可以通过网络浏览器解决此问题,则问题仍然存在于本地代理缓存中。因此,我们仍建议您遵循上述建议。


标题照片由 Ben PattinsonUnsplash 提供。