不存在的浏览器安全漏洞:PDF 中的 JavaScript

有一种相当常见的安全漏洞报告形式:”我可以在 PDF 文件中放入 JavaScript,而且它还能运行!”

例如,用 Chrome 浏览器打开此 PDF 文件,您可以看到显示的 alert(1) 消息:

在 PDF 中支持 JavaScript 是 PDF 渲染软件(包括 Chrome 和 Edge 等常用浏览器)开发人员的设计和期望。与 HTML 相似,PDF 文件是一种活动内容类型,可能包含 JavaScript。

定期有经验不足的安全研究人员兴奋地针对浏览器提出这个问题,而这些报告很快就会 “By Design “得到解决。

经验丰富的安全研究人员会定期针对愿意托管或传输不受信任的 PDF 文件的网站和应用程序提出此问题,认为这代表了 “存储的跨站脚本漏洞“。

他们的困惑在某种程度上是可以理解的–如果一个网站允许用户上传包含脚本的 HTML 文档,然后从其域中提供该 HTML 文档,那么其中的任何脚本都将在提供域的安全环境中运行。这就是典型的存储 XSS 攻击,它带来了安全威胁,因为嵌入的脚本可以窃取或操纵 cookie(通过访问 document.cookie 属性)、操纵网络平台存储(IndexedDB、localStorage 等)、从第三方发起请求伪造攻击等。

PDF 文档的情况则截然不同。

Chrome 浏览器安全常见问题解答对这一限制进行了简洁的描述,指出与 DOM 为 HTML 文档提供的绑定相比,为 PDF 提供的绑定更为有限,而且 PDF 也不会根据其提供服务的域获得任何环境授权。

这意味着什么?这意味着,虽然 PDF 中的 JavaScript 可以运行,但脚本运行的环境是有限的:无法访问 cookie 或存储空间,提出请求的能力也非常有限(例如,您可以在其他地方浏览文档窗口,但仅此而已),而且无法使用 HTML 文档对象模型 (DOM) 对象(如文档、窗口、导航器等)所提供的 Web 平台强大功能。虽然 JavaScript 在 PDF 中的功能极其有限,但并非不存在,PDF 引擎软件必须注意避免引入新功能,以免破坏 PDF 处理代码的安全假设。

限制 PDF 中的 JavaScript

工程师在处理 PDF 中的 JavaScript 时应注意尊重应用程序/用户设置。例如,如果用户关闭了某个网站的 JavaScript,那么该网站上托管的 PDF 也不应允许使用脚本。这在 Chrome 浏览器和 Edge 中均可正常运行。

令人有些意外的是,Firefox 的全局 javascript.enabled 开关并不影响其 PDF 查看器内的脚本:

相反,Firefox 提供了一个单独的 pdfjs.enableScripting 偏好设置,可以通过 about:flags 页面进行配置。

Chromium 目前会忽略 PDF 响应中的 Content-Security-Policy 标头,因为它会使用网络技术来渲染 PDF 文件,而这些技术可能会被 CSP 禁止,从而导致用户困惑和网络开发人员烦恼。

本文文字及图片出自 Browser Security Bugs that Aren’t: JavaScript in PDF

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注