Skip to content

浏览器中隐私和特性的矛盾 #48

Description

@hax

最近这几年来,浏览器厂商对隐私的注重越来越提升。一些小众浏览器以此为卖点,比如Brave。而随着Chrome一家独大的情况愈演愈烈,有被边缘化趋势的其他浏览器也都着重以隐私为差异化点。比如Safari。

既然以此为差异点,言下之意就是Chrome的隐私保护就比较差一点,那为什么Chrome就差一点?有一种攻讦认为Google是依赖互联网广告的,因此不愿意『过度隐私保护』来削弱第三方广告主的利益。

但是,『过度』隐私保护或许确实达不到目标,比如当初 DNT(Do not track)的纷争。IE10默认打开了DNT,而这是不符合DNT规范的,DNT的一项重要要求是,开启DNT必须是用户主动的选择,而对于广告商的约束也是基于这是用户的主动选择。IE10实际上为了彰显其『保护隐私』而破坏了DNT的基础,最终反而对保护隐私不力,因为广告商会因为DNT并非用户的主动选择而选择忽略之。当然,DNT只是浏览器发了个http头,但本身从来就没有被广告商真正广泛支持(包括微软自己),所以马后炮来看,也很难说IE10在DNT失败上到底要付多大责任,反正最终DNT被证明是一个失败的尝试,而DNT设置自身反而会被作为一种信息用于fingerprinting,因此今年2月,Safari 12.1主动移除了这项功能。

除了认为Google主动『不太重视』隐私保护,另一个点可能是Chrome的功能跑得太快,Chromium的contributor比其他浏览器多一个甚至两个数量级,每天代码变更太多,这当然是Chrome对其他浏览器的极大优势,但也导致根本来不及review所有变更是否对隐私和安全造成了新的影响。据说微软放弃EdgeHTML转投Chromium之后,会着重投入到改善Chromium的隐私能力上。

回来说Safari,Safari对于事关隐私的特性是非常注重,不惜牺牲开发者所需要的功能。比如高精度计时,按照标准可以有5微秒的精度,但Safari只提供了100微秒的精度,比标准差了20倍,就是为了提高时间差分攻击的难度。

我最近在TPAC上听一个Google的人说,Safari的目标号称是要把可以被用作fingerprinting的entropy控制在8个字节bits以内。这是一个非常难以达到的目标。

也因此,Safari做了一些可能比较激进的改动。比如不允许CSS中指定本地字体。因为这可以被用来探测用户安装了哪些字体,并可被用作fingerprinting。对于开发者来说,这意味着除了基本font-family比如serif/sans-serif之外,就只能使用web fonts了,但是对于CJK来说,web fonts的开销还是非常大的。

另一个事情是cache。传统上http cache是共享的,比如大家都用jQuery,就可以从同一个CDN上加载。但是这也存在被利用来探测用户的风险,因此需要被隔离。这意味着每个网站都需要单独加载比如说jQuery,即使之前另一个网站是从同一个CDN以完全一致的URL加载过。Safari已经是这样了,FF和Chrome也打算跟进。(参见 https://github.com/shivanigithub/http-cache-partitioning/

我们还需要注意,这两个事情是有叠加效果的,一方面我们被迫更多使用web fonts,另一方面web fonts也不能跨站共享缓存,结果就是要个性化字体的成本就变得更高了。

本质上,特性和隐私可能是存在矛盾的。比如SharedArrayBuffer也是一个可以被变相用来提供高精度计时的机制。一些对底层硬件能力的暴露也很容易被用来做fingerprinting(比如canvas 2D和3D)。我们要么完全禁用之,要么必须付出一定的性能代价来消除可被利用的entropy,不同的浏览器还可能采取不同的策略。这里也包括一些国内厂商,比如UC等为了一些(不太确定的)理由就阉割掉了WebAssembly能力。

在这个过程中,开发者可能是最被动的。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions