概览
1 月 3 日,Project Zero 披露了现代 CPU 中存在的漏洞,进程可以利用这些漏洞读取(最坏情况下)任意内存,包括不属于该进程的内存。这些漏洞分别被命名为 Spectre 和 Meltdown。Chrome 正在采取哪些措施来帮助确保网络安全?Web 开发者应该为自己的网站做些什么?
要点
作为浏览网页的用户,您应确保操作系统和浏览器始终保持最新状态。此外,Chrome 用户可以考虑启用网站隔离。
如果您是 Web 开发者,Chrome 团队建议:
- 尽可能使用
SameSite和HTTPOnlyCookie 属性,并避免从document.cookie读取,以防止 Cookie 进入渲染进程的内存。 - 确保您的 MIME 类型正确无误,并为包含用户特定内容或敏感内容的任何网址指定
X-Content-Type-Options: nosniff标头,以便为启用了网站隔离功能的用户充分利用跨源读取屏蔽功能。 - 启用网站隔离,如果它给您的网站带来问题,请告知 Chrome 团队。
如果您想知道这些步骤为什么会有帮助,请继续阅读!
风险
关于这些漏洞,已经有各种各样的解释,因此我不会再赘述。如果您有兴趣了解如何利用这些漏洞,建议您阅读 Google Cloud 团队同事撰写的博文。
Meltdown 和 Spectre 都可能允许进程读取不应能够读取的内存。有时,来自不同网站的多个文档
最终可能会在 Chrome 中共享一个进程。当一个网站使用 window.open、<a href="..." target="_blank"> 或 iframe 打开另一个网站时,就可能会发生这种情况。如果网站包含用户专属数据,则其他网站可能会利用这些新漏洞读取这些用户数据。
缓解措施
Chrome 和 V8 工程团队正在采取多项措施来缓解这种威胁。
网站隔离
通过防止敏感数据与攻击者控制的代码共享进程,可以大大降低成功利用 Spectre 的影响。Chrome 团队一直在开发一项名为“网站隔离”的功能来实现此目的:
由于存在一些已知问题,并且 Chrome 团队希望尽可能多地进行现场测试,因此网站隔离功能尚未默认启用。如果您是 Web 开发者,则应启用网站隔离,并检查您的网站是否仍能正常运行。如果您想立即选择启用,请启用 chrome://flags#enable-site-per-process。如果您发现某个网站无法正常运行,请提交错误报告并说明您已启用网站隔离功能,以帮助我们解决问题。
跨网站文档屏蔽
即使所有跨网站网页都放入单独的进程中,网页仍可以合法地请求一些跨网站子资源,例如图片和 JavaScript。为防止敏感信息泄露,网站隔离功能包含“跨网站文档屏蔽”功能,该功能会限制向渲染器进程传送哪些网络响应。
网站可以向服务器请求两种类型的数据:“文档”和“资源”。这里的文档是指 HTML、XML、JSON 和文本文件。网站能够接收来自其自身网域或具有宽松 CORS 标头的其他网域的文档。资源包括图片、JavaScript、CSS 和字体等。可以添加来自任何网站的资源。
如果满足以下条件,跨网站文档屏蔽政策会阻止进程接收来自其他来源的“文档”:
- 它们具有 HTML、XML、JSON 或 text/plain MIME 类型,并且
- 它们具有
X-Content-Type-Options: nosniffHTTP 响应标头,或者快速内容分析(“嗅探”)确认类型正确 - CORS 未明确允许访问该文档
被此政策屏蔽的文档在进程中会显示为空,但请求仍会在后台发生。
例如:假设攻击者创建了一个 <img> 标记,其中包含一个包含敏感数据(如 <img src="https://yourbank.com/balance.json">)的 JSON 文件。如果没有网站隔离,JSON 文件的内容会进入渲染进程的内存,此时渲染器会注意到它不是有效的图片格式,因此不会渲染图片。不过,现在有了 Spectre,就有可能读取该内存块。跨网站文档屏蔽功能会阻止此文件的内容进入运行渲染器的进程的内存,因为 MIME 类型会被跨网站文档屏蔽功能屏蔽。
根据用户指标,有许多 JavaScript 和 CSS 文件是使用 text/html 或 text/plain MIME 类型传送的。为避免屏蔽被意外标记为文档的资源,Chrome 会尝试嗅探响应,以确保 MIME 类型正确。这种嗅探并不完美,因此,如果您确定自己在网站上设置了正确的 Content-Type 标头,Chrome 团队建议您在所有响应中添加 X-Content-Type-Options: nosniff 标头。
如果您想试用跨网站文档屏蔽功能,请按照上述说明选择启用网站隔离功能。
SameSite 个 Cookie
我们回到上面的示例:<img
src="https://yourbank.com/balance.json">。只有在 yourbank.com 存储了可自动登录用户的 Cookie 时,此操作才有效。通常,对于向设置 Cookie 的网站发出的所有请求,系统都会发送 Cookie,即使请求是由第三方使用 <img> 标记发出的也是如此。SameSite Cookie 是一种新属性,用于指定 Cookie 只能附加到源自同一网站的请求,因此得名。遗憾的是,在撰写本文时,只有 Chrome 和 Firefox 58+ 支持此属性。
HTTPOnly和document.cookie
如果网站的 Cookie 仅在服务器端使用,而不由客户端 JavaScript 使用,您可以通过一些方法阻止 Cookie 的数据进入渲染进程。您可以设置 HTTPOnly Cookie 属性,该属性可明确阻止在受支持的浏览器(例如 Chrome)上通过客户端脚本访问 Cookie。如果无法设置 HTTPOnly,您可以避免读取 document.cookie(除非绝对必要),从而限制将加载 Cookie 数据公开给渲染进程。
使用rel="noopener"打开外部链接
当您使用 target="_blank" 链接到其他网页时,打开的网页可以访问您的 window 对象,可以将您的网页导航到其他网址,并且在没有网站隔离的情况下,会与您的网页位于同一进程中。为了更好地保护您的网页,在新窗口中打开的外部网页链接应始终指定 rel="noopener"。
高分辨率计时器
为了利用 Meltdown 或 Spectre,攻击者需要测量从内存中读取特定值所需的时间。为此,需要一个可靠且准确的计时器。
Web 平台提供的一个 API 是 performance.now(),其精确度可达 5 微秒。作为缓解措施,所有主流浏览器都降低了 performance.now() 的分辨率,以增加发起攻击的难度。
获取高分辨率计时器的另一种方法是使用 SharedArrayBuffer。该缓冲区由专用工作器用于递增计数器。主线程会读取此计数器,并将其用作计时器。目前,浏览器已决定停用 SharedArrayBuffer,直到其他缓解措施到位。
V8
要利用 Spectre,需要一个专门设计的 CPU 指令序列。V8 团队已针对已知的攻击概念验证实施了缓解措施,并正在对其优化编译器 TurboFan 进行更改,以确保即使在触发这些攻击时,其生成的代码也是安全的。不过,这些代码生成更改可能会导致性能下降。
保障网络安全
Spectre 和 Meltdown 的发现及其影响存在很多不确定性。希望本文能让您了解 Chrome 和 V8 团队在保障 Web 平台安全方面所做的工作,以及 Web 开发者如何通过使用现有安全功能来提供帮助。如果您有任何疑问,欢迎随时在 Twitter 上与我联系。