如何使用Firefox扩展模拟`location`,`navigator`和特定页面的朋友?

时间:2015-02-07 07:42:25

标签: javascript security firefox firefox-addon fingerprinting

我尝试开发Firefox扩展程序,以防止用户跟踪时使用的浏览器指纹识别来保护用户安全。

许多(如果不是全部)指纹识别技术包括记录navigator.pluginsnavigator.oscpunavigator.platform,屏幕分辨率,窗口工具栏高度等内容。扩展的概念由两部分组成 - 第一部分是随机过滤和置换插件及其哑剧类型,并诱导其他用于跟踪的变量的随机性;第二是隔离网页,以防止它重复使用以前隐藏的信息 - 例如.sol - 使用假的E-Tag或未发现的任何内容。

这两种方法都需要在特权navigatorscreenlocation对象的不可配置属性上重新实现getter,这就是我被卡住的地方。

例如,在浏览器控制台中输入简单明了的代码后就不起作用了:

Object.defineProperty(getBrowser().contentWindow.location, 'href', {
    get: function() {
        return 'foobar';
    }
});

它不会产生任何错误,但也不会重新定义属性。此外,由于某种原因,它会返回location对象的当前值 - 这是我对Object.defineProperty所期望的。

location替换location.wrappedJSObject会使浏览器吐出TypeError: can't redefine non-configurable property 'href',与非特权代码将抛出的内容相同。

我试图追踪你在某事上致电Object.defineProperty时会发生什么。它似乎从js::obj_defineProperty()开始,然后转到js::StandardDefineProperty,后者又进行了几次检查,然后下降到js::DefinePropertyOnObject,这有大量的检查我不会完全理解,最后以js::NativeDefineProperty结束,完成实际的对象修改。

所以,问题是:

  1. 是否可以完全重新定义页面内容沙箱的locationnavigatorscreen个对象,将其替换为由我的扩展程序控制的一些模拟代理?
  2. 或者,是否可以重新定义上述对象的不可配置属性?
  3. 或者,是否可以通过Chrome JavaScript调用js::NativeDefineProperty
  4. 或(不太喜欢),是否可以实现二进制加载项以将js::NativeDefineProperty公开给chrome作为服务?
  5. 更新:我在Mozilla IRC上遇到过一个问题,如何进行位置重写与隐私相关。目前,私密浏览模式下的所有窗口共享相同的cookie,存储等,因此即使您不经常重置也可以在私人模式下进行跟踪。常常是一个问题 - 理想情况下,您应该在每个访问过的网站后重置,因为每个网站都可以标记您。如果有能力调整私人模式的粒度,那就太酷了,比如,将独立的私人窗口或标签彼此分开。

    我考虑过使用某种标签唯一的长随机标记标记所有网址 - 因此http://example.com/foo在两个单独的私有标签中打开,变为http://example.com.AYZYXP/foohttp://example.com.QUSOFX/foo。从浏览器的角度来看,这些是两个不同的域名,具有自己的缓存规则,cookie,DOM存储,IndexedDB,F​​lashPlayer pesistence或其他任何东西。从网页的角度来看,保持对两个标签的展示都是http://example.com/foo是必要的,因为公开标记会违背标记的想法 - 这就是我需要进行位置重写的原因

1 个答案:

答案 0 :(得分:0)

可能有一种方法可以进行一次更改,浏览器会将其发送到所有内容,而window.navigator.blah的javascript代码将返回被覆盖的值。如果我找到类似的东西,我会睁大眼睛。

以下是XPCOM参考:https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface

我相信如果你探索所有那些你会找到覆盖东西的东西。

但下面是一个附加观察者的解决方案

我不确定您是否设置了请求或响应标头,如果window.navigator.blah的javascript将返回但值得拍摄的内容,则无论如何都要复制粘贴代码。看看吧。

你所做的是为http-on-modify-request建立一个观察者(或者其他人可以在这里看到其他观察者:MDN :: Observer Notifications - HTTP Requests

然后在观察者的处理程序中,使用setRequestHeader等进行修改,如果您为setResponseHeader做观察者,甚至可以http-on-examine-response

请参阅此主题,此处的示例代码仅欺骗第一个标签的用户代理:How can I change the User Agent in just one tab of Firefox?