通过更新 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 缓存的运作方式

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

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

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

我们建议您采取以下某个步骤:

  • 防止中介缓存资源。设置 Cache-Control: private
  • 设置适当的次级缓存键。如果响应因 Cookie 而异(Cookie 存储凭据时可能会发生这种情况),请设置 Vary: Cookie

具体而言,请更改默认行为:始终定义 Cache-ControlVary

其他注意事项

还有其他类似的攻击会使用 HTTP 缓存,但这些攻击依赖于与跨源隔离不同的机制。例如,Jake Archibald 在 How to win at CORS 中介绍了一些攻击。

一些网络浏览器会拆分其 HTTP 缓存,以便根据是否使用凭据请求资源响应来缓解这些攻击。自 2022 年起,Firefox 会拆分缓存,而 Chrome 和 Safari 不会。 Chrome 未来可能会拆分缓存。请注意,这些攻击与按顶级源拆分不同,但可以互为补充。

即使可以缓解网络浏览器存在的这个问题,但该问题仍会存在于本地代理缓存中。因此,我们仍建议您遵循上述建议。


标题照片由 Unsplash 用户 Ben Pattinson 拍摄。