BAIZE - 浏览器上的隐私保护引擎

白泽是中国古代神话中地位崇高的神兽,祥瑞之象征,传说中白泽可以预测吉凶,是令人逢凶化吉的吉祥之兽。白泽亦能说人话,通万物之情,晓天下万物状貌。

白泽是直接运行在浏览器上且基于机器的隐私保护引擎,能够有效的阻挡跟踪脚本、恶意广告脚本。使用 JavaScript 开发,可以运行在 Node.js、浏览器环境中。2020 年中完成,2020 年 10 月开源在 GitHub

传统的过滤方式是使用过滤规则进行过滤,但这些过滤规则都是基于开源组织、公益组织或个人手动更新的,需要耗费大量的人力进行维护。我们模仿杀毒软件的启发式引擎,基于集成学习,提出了一种自动有效的机器学习方法。通过脚本的多维度特征来学习并创建分类器从而阻止跟踪脚本及恶意广告脚本。

设计这个的起源是源于我某天在翻 Brave 公司的研究时发现了有篇论文叫《AdGraph: A Graph-Based Approach to Ad and Tracker Blocking》,这个是基于图的,将网页的 html 结构、网络请求、JavaScript 的行为等构建成图表示,然后训练分类器来进行分类哪些是广告和跟踪资源。这篇论文将不同的资源的构建方法区分开来了,其中有个部分叫 Domain Based Blocking。

现有的广告拦截工具一般都会尝试通过识别域名是否为广告商的域名来拦截广告相关的、跟踪器相关的 JavaScript 脚本或是来着这种网站的一切资源。但这种方式其实并不是很有效,比如说一些广告服务商会通过定时更换自己的域名或者修改网址来规避这个方法。

市面上常见的如 AdBlocker Plus、uBlock Origin 等工具其实都是用的类似的方案,使用一个或多个规则列表来拦截广告或者跟踪资源。《An Automated Approach for Complementing Ad Blockers’ Blacklists》提出了基于机器学习来增强规则列表的方法,以规则列表为基础,将额外的网络请求做分类。《Leveraging Machine Learning to Improve Unwanted Resource Filtering》也是一种基于机器学习的方式来识别出可以内容,但是这两种方法都可能收到前面谈到的问题的攻击。

Tracking the Trackers》、苹果的《Intelligent Tracking Prevention 2.0》则是通过识别第三方域的方式来拦截可疑资源。

AdGraph 则系统通过图的方式将网页的 html 结构、网络请求、JavaScript 的行为等构建成图表示,然后进行分类,从而自动识别出什么是可以资源。但是 AdGraph 是一个比较大的模型,是需要修改浏览器浏览器才能支持的,这时候我就想到有没办法设计一个纯 JavaScript 的基于轻量级的模型结构的小型启发器作为上游,启发器不拦截的请求才往下到规则列表再进行拦截一次从而减轻和降低通过规则列表来过滤请求的性能负担。

为什么这么说呢,首先规则列表是很庞大的,比如 AdGraph 中举例的数据,EasyList、EasyPrivacy 加起来就有 88167 条,更别说一般用户绝不可能只订阅这两个规则列表,每个国家还有每个国家特殊的规则列表,且这些规则列表是在持续增加的。这些庞大的规则列表如果每个网页的所有请求都要过滤一遍的话是一个比较大的负担。通过 BAIZE,是不需要那么多的规则列表的,只需要一些基本的规则即可实现很好的效果。

在模型结构的选择上其实遇到了一个比较大的困难,那就是既需要对浏览器的完美的兼容性又需要有着非常好的性能,且不需要额外引入一个庞大的 js 库,测试了几乎市面上所有的集成学习算法,考虑到训练时间、预测效果、文件大小、对浏览器的兼容性,最终选择了 Adaboost

Adaboost算法基本原理就是将多个弱分类器(弱分类器一般选用单层决策树)进行合理的结合,使其成为一个强分类器。
Adaboost 采用迭代的思想,每次迭代只训练一个弱分类器,训练好的弱分类器将参与下一次迭代的使用。也就是说,在第 N 次迭代中,一共就有 N 个弱分类器,其中 N-1 个是以前训练好的,其各种参数都不再改变,本次训练第 N 个分类器。其中弱分类器的关系是第N个弱分类器更可能分对前 N-1 个弱分类器没分对的数据,最终分类输出要看这 N 个分类器的综合效果。

数据上面收集了 Alexa top 100 网站中的首页所有的网络请求,合计 11764 行(标注了可以和非可疑)作为训练。同时为了达到更好的测试效果,我们选取了国内的一些知名网站且不包含在训练集中的网站的首页网络请求,合计 760 行。

然后选择了这些网络请求的八项特征:

namedescribe
domain域名
third-party是否是第三方请求
type请求类型
root-domain根域名
path-length路径长度
query-count参数数量
adwords是否符合通用广告规则
sub-domain是否是子域名

其中【adwords】是从 EasyList 等规则数据中通过英文分词统计词频后得到的。

在不使用任何过滤规则的情况下,最终获得来一个还不错的成绩,而且预测一个请求是否为可疑的仅需 0.1 ms。

nameaccaucrecall
Baize91.8%78.3%80.2%

最重要的是白泽是不需要在浏览器引入额外的机器学习库的,只需要引入一个 json 即可。模型大小仅为 31 kb。

总而言之,针对广告服务商会通过定时更换自己的域名或者修改网址来规避规则拦截的这个问题,BAIZE 提供了一种基于机器学习的非常轻量级、运行速度非常快的纯 JavaScript 的小型引擎来为 EasyList 等规则列表带来了启发式能力,能够有效拦截一些未被收录列表的可疑请求。这些请求不单单仅限于 CSS、JS、图片等静态资源获取,还包括普通的 HTTP 请求、WebSocket 请求等。

在真实世界中,比如访问某度首页,在不开启 BAIZE 仅使用规则列表的方式仅能拦截 4 个,开启后能拦截 31 个可疑请求且不影响正常使用。