【问题标题】:Secure channel with postMessage through IFRAME通过 IFRAME 使用 postMessage 的安全通道
【发布时间】:2017-03-23 18:40:57
【问题描述】:

我们有一个应用程序概述如下。 UI 由安全域 https://aaa.com 提供,并托管来自同一域的脚本。

它将客户端站点 https://client.com 加载到 IFRAME。此站点不可信任,并且可能包含恶意 XSS,因为它的代码质量通常低于我们的应用程序。

该站点从我们的第二个域https://bbb.com 加载另一个受信任的脚本。如有必要,此脚本也可以源自 https://aaa.com。 aaa 和 bbb 脚本都从 aaa.com 调用 REST API,并且需要安全令牌。安全令牌是通过从域 aaa 的顶部窗口登录 UI 获得的。

我们需要建立一个安全通道,以便将安全令牌从浏览器窗口中的私有闭包(scriptA.js)传递到我们在 IFRAME 中的脚本(scriptB.js)中的私有闭包

由于客户端站点是不同的域,我们需要使用 postMessage API 来进行脚本的通信。理想情况下,我们希望传递可信消息,例如“嘿,我是 scriptB,向我发送使用此密钥加密的令牌(为该单个事件生成的非对称加密公钥),并让 scriptA 发送恶意 XSS 无法读取的加密密钥”。

然而,恶意 XSS 也可能伪装成 scriptB,因为它位于同一个域中,并使用自己的密钥更早地发送此类消息并从响应中侦听令牌。

问题是我们如何确保可以在 scriptA 中验证请求消息是从 https://bbb.com 加载的脚本发送的,而不是从 client.com 或其他域加载的 XSS,或者其他安全方式通信可用于安全地将令牌从 scriptA 传递到 scriptB。

有什么建议吗?

【问题讨论】:

    标签: javascript security iframe encryption postmessage


    【解决方案1】:

    只是为了让潜在的访问者知道。我们没有想出解决这个确切问题的方法,因为任何保护此类通信的方法都包括 CORS,它仅在您使用 cookie 进行授权时可用。如果通信不涉及 cookie,攻击者服务器可以用作转发代理来绕过包含的任何 CORS 措施。

    除非 postMessage 包含脚本的 URL(不是托管窗口),否则似乎没有办法保护此类通信并防止 XSS 模仿目标脚本。

    我们最终解决它的方式是基于以下假设:

    • 即使令牌是安全的,恶意 XSS 仍然可以发出键盘和鼠标事件,并以用户在给定视图中的方式操纵内容。

    出于这个原因,我们选择将之前更通用的令牌包装为另一个令牌的声明,该令牌由 scriptA 从父窗口上下文调用的服务器 API 生成(它是安全的),并限制可能的用户操作仅适用于用户操作可以完成的操作。此令牌在 scriptB 调用的服务器上经过验证。

    这导致了一个事实,即使 XSS 会从消息中窃取令牌,它也只能通过伪造键盘和鼠标事件来模拟用户操作。此外,令牌是有时间限制的,所以即使 XSS 窃取了令牌,攻击者也无法保留它,以便以后在外部操作相同的数据。

    最终,客户端的安全漏洞只会危害他自己的单个页面,而不是整个基础架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2018-12-19
      • 1970-01-01
      相关资源
      最近更新 更多