使用 iframe 对不受信任的代码进行沙箱处理

信息安全 网页浏览器 沙盒 同源策略
2021-08-31 21:35:12

我正在尝试创建一个可扩展的平台,我的站点将在其中提供模型和一些视图(客户端,在浏览器中),第三方站点也可以添加自己的视图。这里的目标是只有我的模型会向我的服务器发出 HTTP 请求,第三方视图只能对我的平台进行 API 调用,仅此而已(如果他们愿意,他们也可以“打电话回家”,但他们不能碰任何未通过 API 明确向他们公开的内容)。

建议的解决方案是为每个第三方扩展创建一个不可见的 iframe,仅使用postMessage与它们进行通信(编辑:要成为正确的“视图”,它当然必须是可见的,但作为替代方案,它只能具有以下作用“控制器”,将可视组件的呈现委托给主页 - 如果它增加了任何安全优势,则可以使用,但理想情况下没有)。这会正确地“沙箱”代码吗?我假设:

  • 由于同源策略,他们将无法访问主页的 DOM,或对其进行任意 JavaScript 调用,或在我的域上发出 Ajax 请求;
  • 他们可能会在我的服务器上发出 GET 请求(包括从中加载脚本),但只要我在重要的地方使用 CSRF 令牌就可以了。这种情况与在同一个浏览器中有两个打开的选项卡没有什么不同,其中一个通过其各自的站点进行了身份验证;
  • 他们将无法点击劫持用户,因为 如果他们的 iframe 不可见;我还假设他们不能使它们可见或调整它们的大小,因为这将涉及访问父页面的 DOM,这是正确的吗?
  • 他们可以发送垃圾邮件Window.alert(或更糟:)Window.promptconsole.log或访问其他“全球”内容。这是迄今为止我发现的更严重的问题,但仍然无法想出防止这种情况的方法。
    • 澄清:这里的问题是尝试冒充父站点的可能性,例如显示一条要求输入密码的消息。
    • 另外,如果我弄错了,请纠正我 - 我假设 iframe 中的 JavaScript 可以平等地访问这些资源,并且父页面无法否认这一点。
  • 他们可以嵌入闪存或其他可能存在安全漏洞的插件。然而,它在 iframe 中的事实在任何方面都不会使它变得更糟,还是我弄错了?

这些假设是否正确,还有什么我应该注意的吗?用户需要一定程度的信任(这个想法是每个用户都应该能够在自己的空闲时间选择扩展,无论我的网站是否认可它们,同时最终承担他选择的后果),但是我想尽一切可能减轻这些风险。


更新:我想根据评论者提出的问题稍微澄清一下这个问题。在页面中包含第三方脚本有很多原因 - 广告、分析、与社交网络的交互等。不过,这是一个安全问题,实际上这是人们使用 AdBlock 或 NoScript 的原因之一(因此您可以选择性地选择允许哪些域在您的浏览器中运行代码)。通常,该站点信任包含其脚本的第三方,但并非总是如此(例如,Facebook 应用程序可以由任何人创建 - 但它们在 Facebook 页面内运行),而且我已经看到 iframe 被用于“隔离”第三方——聚会内容。

尽管在浏览器中进行跨站点通信的一种选择是使用 postMessage 来打开两个打开的选项卡(或窗口)来交换消息,但单个页面提供了更无缝的体验。使用 iframe(可见或不可见)的全部含义,以及它在沙盒中对不受信任的内容的可行性,是我在这个问题中的主要关注点,恕我直言也适用于更广泛的受众(见上文段落)。

在我的特殊情况下,我试图避免让嵌入的内容冒充父站点(请参阅上面第 4 个要点中的说明),并尽可能保护用户免受其他滋扰。虽然每个用户都可以选择自己的扩展程序,并最终对后果负责,但我想减轻任何在我能力范围内的已知问题(并尝试对用户进行教育以解决那些无法解决的问题)。

2个回答

您说您将在 iframe 中加载第三方内容,但第三方内容是托管在与您的主要内容相同的域中,还是从单独的域中提供?

如果第三方内容托管在与您的主页相同的域中,那么不,您的方法是完全不安全的如果 iframe 中的内容来自同一来源(大致相同的域),则 iframe 中的内容对主页具有完整的脚本访问权限。阅读同源政策。

更合理的方法是将第三方扩展内容托管在与您的主页不同的域上。如果您这样做,那么是的,您的方法提供了合理的安全性扩展内容将被沙盒化,并且无法与主页混淆(大部分情况下)。还有一些风险,如下所述:

  • iframe 中的第三方内容可以导航主页面(例如,通过设置window.locationtop.location)。因此,第三方内容将整个页面替换为第三方选择的内容。这可能允许网络钓鱼或欺骗攻击。警惕的用户可能会注意到此类攻击,因为浏览器地址栏中的 URL 会发生变化,但有些用户可能不会注意到。

  • 第三方扩展仍然可以在自己的 iframe 中加载令人讨厌的内容(例如,色情、广告等)。

  • 第三方扩展仍然可以尝试对您的用户进行偷渡式下载攻击。如果您的用户有一个易受攻击的浏览器,他们可能会被攻击感染(当然,如果他们访问任何恶意站点,这可能是真的;iframe 并没有增加风险——它只是不会让它消失, 任何一个)。

  • 第三方内容可以播放电影或声音,可能会惹恼用户。

  • 第三方扩展可能能够在主页上安装点击劫持攻击。(您提到 iframe 将是不可见的,但我不确定需要哪些具体方法来确保这是对点击劫持的强大防御。那里有很多浏览器怪癖。)

  • 您的站点使用强大的 CSRF 防御非常重要。否则,第三方内容将非常适合发动 CSRF 攻击。

其中许多风险相对较小,在大多数情况下可能是可以接受的,但我想为您和其他人概述它们。

另一种方法是使用Javascript 沙盒系统(这些也可以被认为是构建“虚拟 iframe”的一种方式)。参见例如CajaSESADsafeFBJS和 Microsoft 的 Web Sandbox。

您还可以查看沙盒 iframe,但我认为并非所有浏览器都支持它们,因此您还不能依赖这种机制来保证安全性(遗憾的是)。

另请参阅允许在我的网站上放置广告之前我应该​​注意哪些风险?, 使用 iframe 的安全问题, 如何扫描 Javascript 中的恶意代码?.

此外,有关与同源策略和此类主题相关的浏览器怪癖的详细信息,我强烈推荐浏览器安全手册

如果您访问此演示,您会看到代码在框架中检测到自身(可以修改以检测其所在的页面),而不是更改 url。可能冒充父站点的 url。(旁注我注意到谷歌和雅虎出现空白,我相信它的 bc 他们的标题发送“X-Frame-Options:SAMEORIGIN”)

我不太了解控制窗口,因此另一个窗口可能会关闭您的站点并启动另一个窗口来模拟它。但是从 DOM 和 javascript 的角度来看,他们的代码执行应该是安全的,不会对您的用户造成伤害。然而,欺骗用户是另一回事。