什么是在注入脚本和Google Chrome扩展程序代码/内容脚本之间传递消息的最安全方式?

7

定义: 请注意,我将使用第一个答案中提供的“注入脚本”、“扩展代码”和“内容脚本”的定义。question

假设: 如果我直接在注入脚本(在 web 区域)中处理机密信息,那么处理机密信息就不太安全,而如果我在内容脚本和扩展代码的 chrome:// 区域内处理,则更加安全。因此,我应该使用消息传递将机密信息从 web 区域发送到 chrome:// 区域进行处理。

问题: 我正在构建一个 Google Chrome 扩展程序,在注入脚本中需要对敏感用户数据执行一些操作。所涉及的数据是机密的,我必须尽一切努力确保除了扩展程序用户之外,任何人都无法看到它,直到我对其进行操作。在可用于在注入脚本和扩展代码/内容脚本之间传递消息的 3 种技术中,哪种最适合此目的?

我对可用于在注入脚本和扩展代码/内容脚本之间传递数据的 3 种不同技术的理解:

  1. 对于注入脚本和扩展代码(例如后台页面)之间的消息传递,可以使用chrome.runtime API

  2. 对于注入脚本和内容脚本之间的消息传递,可以使用window.postMessage

  3. 另一种在注入脚本和内容脚本之间传递消息的方法是通过document.dispatchEvent(CustomEvent)

我理解的是,方法1不能用于注入脚本和内容脚本之间的消息传递,而方法2和3不能用于注入脚本和扩展代码之间的消息传递(除非消息被内容脚本转发到例如后台页面等位置)。


1
我认为第一种技术是最好的选择,因为任何人都可以拦截来自window.postMessage(假设域名匹配)和document.dispatchEvent的消息,只要他们知道这些消息将要发生。至少你可以通过传递扩展ID将第一种技术限制为仅广播到特定扩展程序。 - Patrick Roberts
你没有提到的另一个选项是使用CORS创建一个XMLHttpRequest来连接一个安全网站,并通过套接字或长轮询将信息从服务器传递回扩展程序。 - Patrick Roberts
1个回答

6

在您的后台页面/内容脚本中运行的代码相当独立,但是一旦您将脚本注入页面上下文中,您就处于野外。任何扩展程序和页面本身都可以访问该上下文并影响您的代码执行方式。

例如,某些扩展程序可以覆盖chrome.runtime.sendMessage以发送消息并记录它。这需要严肃考虑-可能,您已经失败了。

话虽如此,方法1比2/3更难被攻击-正如所解释的那样,攻击者扩展程序需要直接更改页面上下文才能干涉,而在DOM事件的情况下,它只能从其内容脚本的安全性中监听它们-事件广播到所有内容脚本上下文。

理论上,您也可以为通道使用某种非对称加密-为注入的脚本提供加密密钥,并将解密密钥保留在特权区域。如果只拦截通信,则可以保护通信,但在某个时刻,明文数据存在于全局上下文中-攻击者脚本可能足以提取它(这是您必须假设在注入的脚本之前执行)。


感谢您的回复@Xan。这样说是否公平:方法1的安全性因此依赖于这两个假设?1)我注入代码的网页不会尝试拦截消息传递,2)我可以信任我的用户保护自己免受攻击者获取计算机访问权限并秘密安装恶意扩展程序来拦截消息传递。 - user5508297
我忘记了另一个假设:3.) 我注入代码的网页不容易受到常见的网络安全漏洞的攻击,攻击者可以利用这些漏洞将恶意脚本注入到网页中。 - user5508297
1
我建议不要添加加密,因为这可能会增加虚假的安全感。最好专注于开发可信赖的基元,你知道它们没有被破坏。也就是说,在 document_start 注入你的脚本,并保存一个可调用的 dispatchEvent / postMessage 的副本或者(可能比前面更好,因为它是非全局的)MessageChannel。@user5508297 但是,既然你假设网页没有被破坏(“假设3”),我不明白你试图减轻什么。 - Rob W
1
@RobW 在 document_start 注入代码并不是万能的,因为攻击者可能会在符合条件的扩展列表中更早地在 document_start 处注入代码。你永远不能假设自己先下手为强。 - Xan
大家好,我有一个关于Google Chrome扩展中安全消息传递的新问题 - 你们有答案吗?任何帮助都将不胜感激。http://stackoverflow.com/questions/38579382/google-chrome-extension-message-passing-can-any-useful-checks-be-performed-on-t?noredirect=1#comment64547919_38579382 - user5508297
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接