6

我正在使用 Chrome Native Messaging 开发一个应用程序,该应用程序通过 Chrome 扩展程序启动。

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

我需要确保扩展调用的应用程序的真实性。如果我无权读取注册表或检查是否有更改,我该如何获取它?

4

3 回答 3

2

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

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

考虑(所有这些假设):

  • 您可以通过这种方式很容易地保护注册表项/清单,但是文件本身呢?
  • 假设您固定了可执行文件的哈希,那么更新它会变得很痛苦(您也必须同步更新扩展)。可以通过某种公钥签名而不是哈希来解决。
  • 假设您将可执行文件固定在清单中。它的数据文件呢?更重要的是,原生应用程序使用的库呢?

保护 Chrome 扩展程序/应用程序很容易,因为您依赖的唯一“库”/运行时是 Chrome 本身(并且您信任它)。一个原生应用程序可以依赖于系统上的很多很多东西(比如已经提到的库),你如何跟踪?

无论如何,这似乎是一件有趣的事情。如果已经有类似的东西,请查看 Chrome错误跟踪器,如果没有 - 尝试提出功能请求。也许尝试一些与 Chromium 相关的邮件列表来询问开发人员。

于 2015-04-07T20:07:32.097 回答
2

我意识到这是一篇较旧的帖子,但我认为值得分享 Chromium 团队对我提交的错误的官方回应:https ://bugs.chromium.org/p/chromium/issues/detail?id=514936

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

于 2016-12-09T17:47:49.927 回答
0

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

  1. 在安装时将您的可执行文件注册到您的服务器并签署可执行文件并将您的注册号存储在可执行文件和服务器中
  2. 在来自扩展的每个请求(postMessage)中,另外发送一个由您的服务器提供的令牌
  3. 通过将扩展中的令牌与您的注册表号一起传递,请求服务器提供下一个令牌以向扩展发送响应
  4. 如果您是注册用户,服务器将使用令牌响应
  5. 使用您的注册号对其进行加密,并将其与来自扩展的令牌一起发送到扩展
  6. 扩展持有者浏览器将询问服务器它的良好响应
  7. 在扩展令牌的帮助下,服务器将识别可执行注册表号并解密可执行令牌并验证我们(服务器)为扩展令牌生成的
  8. 一旦服务器确认,浏览器将其视为响应

重要的是,您的注册表号应该是安全的,并且客户端机器无法从可执行文件中获取它(使用正确的签名可以实现)

由于 chrome 停止了对 Applet 的支持,我在 chrome 中为智能卡读卡器实现了相同的功能

唯一的漏洞是,客户端机器可以借助一些工具跟踪其发送的每个请求

如果您能够使用一些 httpOnly Cookie(客户端机器无法读取)或密码机制使您与服务器的可执行通信安全,则很可能是您可以实现的安全解决方案

于 2015-12-27T21:05:36.680 回答