Google chrome extension 保护Chrome本机消息主机

Google chrome extension 保护Chrome本机消息主机,google-chrome-extension,chrome-native-messaging,Google Chrome Extension,Chrome Native Messaging,我正在开发一个使用Chrome本机消息传递的应用程序,它通过Chrome扩展启动 我的问题是:如何确保主机应用程序与我提供的应用程序完全相同 我需要确保扩展调用的应用程序的真实性。如果我没有权限阅读注册表或检查某些内容是否已更改,我如何获得它?这是一个很好的问题,我猜答案是“很遗憾,你不能” 实现某种加密散列(比如Chrome用来验证扩展文件的散列)会很有趣,但这并不是一个很好的保证 考虑(所有这些假设): 这样可以很容易地保护注册表项/清单,但是文件本身呢 假设你固定了一个可执行文件的散列,

我正在开发一个使用Chrome本机消息传递的应用程序,它通过Chrome扩展启动

我的问题是:如何确保主机应用程序与我提供的应用程序完全相同


我需要确保扩展调用的应用程序的真实性。如果我没有权限阅读注册表或检查某些内容是否已更改,我如何获得它?

这是一个很好的问题,我猜答案是“很遗憾,你不能”

实现某种加密散列(比如Chrome用来验证扩展文件的散列)会很有趣,但这并不是一个很好的保证

考虑(所有这些假设):

  • 这样可以很容易地保护注册表项/清单,但是文件本身呢
  • 假设你固定了一个可执行文件的散列,那么更新它就会很痛苦(你必须同步更新扩展名)。可以通过某种公钥签名而不是散列来解析
  • 假设您将可执行文件固定在清单中。它的数据文件呢?更重要的是,本地应用程序使用的库如何
保护一个Chrome扩展/应用很容易,因为你唯一依赖的“库”/“运行时”就是Chrome本身(你信任它)。本机应用程序可能依赖于系统上的很多东西(如前面提到的库),您如何跟踪


无论如何,这似乎是一件有趣的事情。看看Chrome是否已经有类似的功能,如果没有,尝试提出功能请求。也许可以尝试一些与铬相关的邮件列表来询问开发人员。

如果我正确理解了这个问题,解决方案可能是

  • 在安装时向服务器注册可执行文件,同时对可执行文件进行签名,并将注册号存储在可执行文件和服务器中
  • 在来自扩展的每个请求(postMessage)中,另外发送一个由服务器提供的令牌
  • 通过将扩展中的令牌和您的注册表号一起传递给服务器,请求服务器提供下一个令牌以向扩展发送响应
  • 如果您是注册用户,服务器将使用令牌进行响应
  • 使用您的注册表号对其进行加密,并将其与来自扩展的令牌一起发送到扩展
  • 分机持有者浏览器将询问服务器是否有良好的响应
  • 在扩展令牌的帮助下,服务器将识别可执行注册表号,解密可执行令牌,并验证我们(服务器)为扩展令牌生成的可执行令牌
  • 一旦服务器确认,浏览器会将其视为响应 重要的是,您的注册表号应该是安全的,并且客户端计算机无法从可执行文件中取出它(使用适当的签名可以实现)

    当chrome停止支持Applet时,我在chrome中为智能卡读卡器实现了同样的功能

    唯一的循环漏洞是,客户机可以在一些工具的帮助下跟踪其发送的每个请求


    如果您能够使用某种httpOnly Cookie(客户端机器无法读取)或密码机制使您与服务器的可执行通信安全,那么很可能是您可以实现的安全解决方案,但我认为值得分享Chromium团队对我提交的bug的官方回应:

    可以修改用户计算机上注册表或FS的攻击者也可以修改chrome二进制文件,因此,此类攻击者可以通过篡改chrome代码来禁用chrome中实现的任何类型的验证。因此,chrome必须信任FS(以及来自本地机器的任何东西)


    您可以在构建时相对轻松地对可执行文件进行签名:计算可执行文件的哈希值,使用私钥对其进行加密,然后将其存储在可执行文件本身中。扩展再次计算散列,然后将其与存储在可执行文件中的散列进行比较(使用公钥解密)。因此,这是一个简单的签名过程,但正如你所说,你必须对本机应用程序依赖的每个文件进行签名。你还可以争辩说,如果共享库遭到破坏,你已经输掉了游戏。我不确定静态链接能改善多少情况。关于注册表呢?当我安装主机应用程序时,我设置为extension以在我定义的某个路径中调用它。但是如果有人更改注册表并将目标指向另一个路径,而不是已更改的应用程序(而不是签名的应用程序),扩展将不会识别更改的路径,并且将正常执行。有没有办法读取注册表以确保注册表上定义的路径对应于真正加载的应用程序?没有,据我所知,目前还没有。正如我所说,您可以尝试将其作为一项功能进行请求。根据biziclop的回答,我可以使用私钥对每个文件进行签名,并将哈希值与文件一起存储。之后,进入扩展名,我需要打开文件并验证签名。对于每个需要以扩展名打开的文件,用户需要授予权限或确认一些弹出窗口?有没有办法让这个过程对用户透明?