保护浏览器帮助程序对象

Ben*_*aum 8 bho cross-domain

我目前正在构建浏览器帮助程序对象.

一件事的BHO所要做的是使绕过跨域策略跨站点请求.

  • 为此,我公开了__MyBHONameSpace.Request一种WebClient内部使用的方法.

  • 然而,我发现任何使用我的BHO的人现在都有一个CSRF漏洞,因为智能攻击者现在可以从我客户的计算机发出任意请求.

有没有聪明的方法可以缓解这种情况?

Rob*_*b W 7

完全防止此类攻击的唯一方法是将页面JavaScript的执行上下文与扩展程序的JavaScript代码分开.

当我研究这个问题时,我发现Internet Explorer确实提供了一种实现这种上下文创建的方法,即通过IActiveScript.我没有实现此解决方案,原因如下:

  1. 缺乏将IActiveScript与BHO相结合的文档/示例.
  2. 对未来缺乏确定性(例如/sf/answers/1230727781/).
  3. 可能的性能影响(IE因其卓越的性能而闻名,每个页面的两个JavaScript引擎实例如何影响浏览速度?).
  4. 维护成本:基于非常合理的假设,我已经有了一个运行良好的现有解决方案.因为我不确定替代方法(使用IActiveScript)是否是无障碍和面向未来的(见2),我决定放弃这个想法.

我所做的是:

  1. 接受非常坚定的攻击者将能够访问我的扩展程序的功能(部分).
    • @Benjamin询问访问持久性存储API是否会对用户的隐私构成威胁.我认为这种风险是可以接受的,因为存储配额是强制执行的,并且所有存储的数据在使用之前都经过验证,并且不会给攻击者提供任何攻击用户的工具.如果攻击者想要通过持久存储跟踪用户,他们可以localStorage在某个域上使用,并通过<iframe>使用postMessage API 与此域通信.这种方法适用于所有浏览器,而不仅仅是安装了我的BHO的IE,所以当有一种方法已经适用于所有现代浏览器时,任何攻击者都不太可能花时间对我的BHO进行逆向工程以使用API​​(IE8 + ).
  2. 限制扩展的功能:
    1. 只应在需要激活扩展的页面上激活扩展.这大大减少了攻击面,因为攻击者更难以运行代码https://trusted.example.com并欺骗用户访问https://trusted.example.com.
    2. 在扩展级别(在BHO内部的本机代码(例如C++)中)创建并实施白名单 URL以进行跨域访问.
    3. 对于敏感API,限制其暴露于一小组可信URL(同样,不是在JavaScript中,而是在本机代码中).
    4. 处理跨域功能的扩展部分不与Internet Explorer共享任何状态.Cookie和授权标头将从请求和响应中删除.因此,即使攻击者设法访问我的API,他们也不能冒充其他网站的用户,因为缺少会话信息.
      这不能防止使用请求者的IP进行身份验证的站点(例如Intranet站点或路由器),但这个攻击向量已经被正确的白名单实现所覆盖(请参阅步骤2).

"在本机代码中强制执行"并不意味着"本机代码中的硬代码".您仍然可以提供包含元数据和JavaScript代码的更新.MSVC++(2010)支持ECMAScript样式的正则表达式<regex>,这使得实现基于正则表达式的白名单非常容易.

如果您想继续使用IActiveScript,可以在ceee,Gears(已停产)或任何其他试图增强IE脚本环境的项目的源代码中找到示例代码.