V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mornlight
V2EX  ›  微博

对微博被恶意加关注问题的一点分析和猜测

  •  6
     
  •   mornlight · 2017-10-11 02:33:22 +08:00 · 12384 次点击
    这是一个创建于 2602 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因

    我是微博重度用户。

    在国庆节前后几天,我遭遇了一轮又一轮的被动加关注问题,刚开始以为自己不小心泄露了密码,因为之前很长时间我都没有遇到过这类问题,先从自己身上找原因。然后就是既定流程:修改密码 -> 在安全中心退出所有已登录设备 -> 清空所有第三方授权。

    然后,好像并没有什么用。

    很多人认为是微博内部故意设计了一套策略,强行给用户塞关注来赚黑心钱,但我认为这个说法站不住脚,微博这两年市值和营收一直涨,不需要冒风险捞这种钱。

    于此同时,我看了我身边的一些人身上也发生了同样的问题,以及 V2EX 里也有多个人发帖:

    微博还会自动帮你关注人的?

    新浪微博被 wt.weidaogou.com.cn 等垃圾推广号包围了

    微博自动关注一些垃圾营销号, 没有办法解决吗?

    大家惊讶地发现彼此遇到的可能是同一波人,被强加的关注有很高的重叠率,套路也都类似,要么是发表各种 copy 来的文章、视频不知名营销号,要么就直接脸都不要直接给你发硬广。

    思考

    镇定下来,再次思考一下,到底哪个地方出了问题?哪个地方能出问题?

    从技术实现上看,能给我的微博帐号加关注的,通常只有三个途径:1. 我的帐号被盗,能直接被别人登录上去。2. 我使用的第三方客户端等可以通过微博开放平台走 OAuth 拿到 access token,然后权限被滥用。3. 我在浏览器上使用 Web 版微博时,cookies 被泄露。这个可能性最大,因为很早就听说过做微博黑产的,和运营商合作后劫持微博的流量,给用户塞关注,挣钱不要太容易。

    我首先排除掉了盗号这一途径,一方面我修改后的密码是 1Password 生成的随机密码,没可能被碰撞或猜出来,另一方面我登录时刻意看过是 HTTPS,可以认为这个流程中不会泄露密码给其他人。我的电脑使用习惯良好,中木马的可能性也几乎没有。

    然后考虑第三方授权的问题,我在第一次修改密码清空所有授权后,再次把授权给出去的只有我 Mac 上的客户端 Maipo 和手机上的几个微博客户端:WeicoPro,Cosmos,微博国际版,微博官方版。

    微博官方版和国际版可以信任,排除掉,然后看 Weico 和 Cosmos,接上 Charles,抓所有的请求下来看,没有发现它们会往其他地方上传敏感信息,微博的 api 接口也是 HTTPS。

    解不开 Maipo 的 HTTPS 请求,尴尬。难道这个客户端里 Pin 了公钥?有点不科学。先不管了,反正走的是 HTTPS 就行。只是有一个 http 请求不太正常,但这是授权成功后发往开发者服务器的请求,里面即使带了 access_token 其实也没关系,因为其他人没有开发者手上的 secret key 啥也干不了。

    我目前在使用的这几个客户端要么官方,要么老牌,要么开发者是我信任的,几乎可以排除它们的嫌疑。

    控制变量,缩小范围

    那么,只剩第三种可能了。我用的 Web 版微博在某个地方泄露了 cookies,导致我的帐号被临时性盗用。但是我作为一个好歹有一些信息安全基础的人,在今年 8 月份微博主站上了 HTTPS 后,就一直用的 HTTPS,哪里还能被偷到 cookie 呢?

    想不明白,那先放一放,做点其他的尝试:再次走一遍修改密码取消授权的流程,然后只在 Web 版和官方 App 上使用微博,其他地方一律不再登录。

    这样尝试了 3 天后,我没有再遇到加关注的问题。

    和我预期的不一致,这好像是在刁难我胖虎了。

    看起来这事和微博 Web 版没有关系?我错怪 Web 版了?

    那就把非官方客户端一个个恢复使用,首先是 Mac 上的 Maipo

    使用 Maipo 一天后,加关注的问题又来了。看起来 Maipo 会引入这个问题。

    可是 Maipo 的开发者是微博员工,他是最不可能在背地里利用微博干坏事的,而且从其他人的反馈看,他们没有使用 Maipo 也遭遇了这个问题。我无法把原因归结到 Maipo 身上。

    又思考了一天,以前 debug 代码的经验突然给了我另一个想法:Maipo 的某些行为会触发 Web 版微博泄露 cookie,这不是单方面的谁的问题,而是两者同时存在时才会产生的问题。

    找了一圈,Maipo 里能和 Web 版产生关系的,我只能找到一个操作:View on Weibo.com

    这个是在 Maipo 里对某一条微博进行的动作,执行后会在浏览器里打开这条微博的链接。开启浏览器的抓包,尝试做一次 View on Weibo.com

    我发现了什么! Maipo 打开微博的链接是 HTTP 的,虽然访问后会 301 跳转到 HTTPS,但这个 HTTP 请求仍然会携带上浏览器在 weibo.com 域下的所有 cookie

    在 Charlse 里看到请求头的那一瞬间,好像所有的谜团都解开了一样。

    结论

    那么,这一切都可以有一个合理的解释了:

    微博黑产在运营商线路上劫持 http://weibo.com 的 HTTP 请求,窃取用户 cookie,然后通过 cookie 给用户加关注。

    虽然微博主站已经上了 HTTPS,但用户登录后的 cookie 没有设置 secure,导致用户访问 HTTP 链接时虽然会被 301 到 HTTPS 上,但也会携带有效 cookie 出去,被运营商劫持。

    清除授权、修改密码都没有用,只要你登录后在某个特定场景访问到了 HTTP 的微博链接,那就很可能中招。只是在微博 Web 版站内的话没问题,因为默认都是 HTTPS 了,但是你的浏览器书签、别人发给你的链接、旧的外链、其他应用生成的链接都可能还是 HTTP 的。

    需要注意的是,以上的结论来自于对比实验和技术可行性分析后的猜测,没有任何的实锤证据可以证明结论的正确性。微博官方应该可以根据访问记录查出来,我没法查,只能合理假设。

    防御措施

    不指望微博会给 cookie 设置 secure 了或者上 HSTS ( HTTP Strict Transport Security ) 了,他们有业务上的考虑。但是作为用户,肯定还是有办法解决问题的。比较彻底的做法是在家里路由器层级上自己劫持微博的 HTTP 请求,直接 301 到 HTTPS,比较 geek。

    更简单的做法是,自己往 Chrome 浏览器的 HSTS 列表里加入 weibo.com 域名:

    在 Chrome 里打开 chrome://net-internals/#hsts

    Add weibo.com

    Query weibo.com ,能查询到就可以了。如下图:

    HSTS

    weibo.com 加到 HSTS 里后,Chrome 再遇到 HTTP 的微博链接,会直接在浏览器内部就跳转到 HTTPS,请求不传到外面去,可以保证通讯安全。然后,你就不要在其他的浏览器或电脑上登录微博了。

    我平时用的都是 Chrome,Safari 我没找到哪里可以自己添加 HSTS,Firefox 好像可以修改配置文件夹里的 SiteSecurityServiceState.txt 来实现,我没试。

    被这个问题困扰的同学可以试试看,我这边是有效的,不知道其他人情况如何,欢迎反馈结果。

    第 1 条附言  ·  2017-10-11 13:46:49 +08:00
    更新:有 access_token 就可以做关注操作,不需要应用私钥签名,所以这一步的分析是不够准确的,但目前没有发现黑产会劫持第三方应用的回调请求的迹象。access_token 通过 HTTP 传递是不安全行为。
    58 条回复    2020-02-27 09:59:34 +08:00
    ryd994
        1
    ryd994  
       2017-10-11 02:37:56 +08:00 via Android
    Set-Cookie: mycookie=somevalue; path=/securesite/; Expires=12/12/2010; secure; httpOnly
    onlyhot
        2
    onlyhot  
       2017-10-11 05:21:07 +08:00
    虽然不用微博,但是文章很赞!
    Trim21
        3
    Trim21  
       2017-10-11 05:29:12 +08:00 via iPhone   ❤️ 1
    套路真深啊……
    赶紧设置个 hsts 去
    carlclone
        4
    carlclone  
       2017-10-11 06:00:31 +08:00 via Android   ❤️ 1
    这很 geek
    SnowzTail
        5
    SnowzTail  
       2017-10-11 06:33:57 +08:00 via Android
    感谢!
    des
        6
    des  
       2017-10-11 07:39:10 +08:00 via Android
    改密码触发了规则?

    最好的方法难道不是用 https 注册一个账户,然后不登录,半年之后再来看嘛?
    AdamChrist
        7
    AdamChrist  
       2017-10-11 08:05:45 +08:00
    厉害了...点赞
    zirconium
        8
    zirconium  
       2017-10-11 08:12:16 +08:00 via iPhone
    点赞(。ò ∀ ó。)
    sadpast
        9
    sadpast  
       2017-10-11 08:15:38 +08:00 via Android
    别骗自己了,我的账户没有任何授权,也没有被盗,放了几个月没有用依然如此。
    stanjia
        10
    stanjia  
       2017-10-11 08:38:33 +08:00   ❤️ 1
    清空状态,又上角退出登录, 删除收藏 和历史记录。
    你会发现你的世界清净了许多,再也不用为哪个明星和哪个明星结婚的事儿操心了.
    CEBBCAT
        11
    CEBBCAT  
       2017-10-11 09:10:49 +08:00 via Android
    真,真的吗?话说微博为什么不出面澄清呢?
    lcatt
        12
    lcatt  
       2017-10-11 09:16:18 +08:00
    虽然不用微博,但是文章很赞!+1
    x86
        13
    x86  
       2017-10-11 09:23:51 +08:00
    指不定就是自己卖粉,又不是没做过这事
    tghgffdgd
        14
    tghgffdgd  
       2017-10-11 09:33:53 +08:00 via Android
    这没法解释连我自己都没办法关注的情况下被关注。

    https://www.v2ex.com/t/396491
    learnshare
        15
    learnshare  
       2017-10-11 09:51:31 +08:00
    有一定的道理,但不一定是这个原因

    1. 这波关注是大范围的,可能微博主动采取了措施,或者相关责任人看见新闻停手了;
    2. 有内鬼卖刷粉服务;
    3. 微博测试一下新功能。
    Hilong
        16
    Hilong  
       2017-10-11 09:56:21 +08:00
    从来没用过 web 版的,只用官方手机 app 的也出现这种情况。这种是因为什么呢
    mengyaoss77
        17
    mengyaoss77  
       2017-10-11 10:06:56 +08:00 via Android
    分析的很厉害,看看楼下怎么说吧。
    大部分人还是不太信任微博的,谁都不嫌钱多吧。
    terrytw
        18
    terrytw  
       2017-10-11 10:14:36 +08:00   ❤️ 1
    这个还要讨论和思考么
    微博从创立的一开始就会帮助用户自动关注各类垃圾账户
    把长期未登录的账号做成官方僵尸号
    mornlight
        19
    mornlight  
    OP
       2017-10-11 10:27:12 +08:00 via iPhone
    @terrytw 是的,长期未使用的帐号可能变成官方僵尸号拿去充粉,这个我觉得微博做得出来。这些天中招的很多是活跃帐号,不太相信是官方故意的。
    mornlight
        20
    mornlight  
    OP
       2017-10-11 10:28:30 +08:00 via iPhone
    @des 不活跃帐号可能是另外的问题。
    mornlight
        21
    mornlight  
    OP
       2017-10-11 10:30:09 +08:00 via iPhone
    @Hilong 改一次密码后,再接着只使用官方 App,还会这样吗?
    learnshare
        22
    learnshare  
       2017-10-11 10:33:26 +08:00
    @terrytw
    @mornlight

    我专门翻几年没用的账号看过,timeline 里会出现 [精准] 的推荐(根据近期的网页浏览记录)。但没有标注为推荐,像是已关注的人发出来的,但实际上并未关注

    运营商卖数据的可能性比较高,因为第三方广告跟踪都被我屏蔽了
    helloSwift
        23
    helloSwift  
       2017-10-11 10:36:45 +08:00 via iPhone
    这个求知欲好感人😂,很赞
    terrytw
        24
    terrytw  
       2017-10-11 10:37:48 +08:00
    @mornlight 也许微博要融资 /私有化 /做年报 /新领导上任冲业绩
    我 2010/2011 年刚注册微博的时候,隔不了几天再登陆就已经有 100 多个关注了
    微博这两年市值和关注一直在涨完全就是因为他各类下作手段用得好
    才不是他产品服务有什么特别突出的地方
    terrytw
        25
    terrytw  
       2017-10-11 10:42:31 +08:00
    @learnshare 在运营商不给固定 IP 的情况下想要定位用户卖数据只怕有点难吧?
    更像是本地的一些客户端或者是 COOKIES 造成的?
    mornlight
        26
    mornlight  
    OP
       2017-10-11 10:49:48 +08:00 via iPhone
    @terrytw 对微博持有这个怀疑是没问题的,某种程度上可以验证:改个随机密码,退出所有设备,之后半年不再使用微博,看看会不会加关注。
    要相信微博黑产的力量,这是他们赚钱的东西。在多个可能性都存在时直接把锅甩官方头上的话没法解决问题,意义也不大。
    terrytw
        27
    terrytw  
       2017-10-11 10:54:55 +08:00
    @mornlight 你说的有道理,希望你能解决问题:)

    我个人觉得在多重可能性存在的时候,往往最简单的就是事实
    “直接把锅甩官方头上的话没法解决问题”,有时候问题的确没法解决
    特别是强势一方比如国家、金融机构、大的互联网公司等想要强奸用户的时候
    SeanChense
        28
    SeanChense  
       2017-10-11 10:58:50 +08:00
    Maipo 是我在微博实习的导师开发的
    mornlight
        29
    mornlight  
    OP
       2017-10-11 11:16:15 +08:00
    @SeanChense #28 昨天在微博上 @了他一下讲这个事情,他没理我
    learnshare
        30
    learnshare  
       2017-10-11 11:16:15 +08:00
    @terrytw 你忘了一件事,通过光猫拨号上网,运营商很容易知道你是谁,你家有多少设备,哪个设备在干啥。IP 对于跟踪用户来说完全不重要
    LMkillme
        31
    LMkillme  
       2017-10-11 11:51:48 +08:00
    佩服楼主的钻研精神,而且答案也是对的,真相就是微博开放给运营商一些 API,如今被运营商内部人员拿来做灰产,滥用牟利,微博也是毫无办法。
    wdxz5586
        32
    wdxz5586  
       2017-10-11 11:56:14 +08:00
    @mornlight 抱歉昨天错过了那个 @,感谢这么详细的分析!
    关于提到的几个问题:
    - 我会在下次更新的时候跳转网页时改为 HTTPS ;
    - 另外回调 access_token 时,黑产如果能通过同样方法拿到 access_token,也可以进行加关注的操作,我也会尝试改成 HTTPS。
    - Maipo 的确校验了公钥;
    mornlight
        33
    mornlight  
    OP
       2017-10-11 12:10:49 +08:00
    @wdxz5586 #32 啊?用 access_token 操作竟然是不需要应用私钥签名的,这比我预想的更危险了,很多客户端在这一步都不是 HTTPS。黑产那边看起来还没有专门针对回调的请求做劫持。
    wdxz5586
        34
    wdxz5586  
       2017-10-11 13:58:57 +08:00
    @mornlight 取得 access_token 的流程是需要 secret 的,拿到之后不需要
    Love4Taylor
        35
    Love4Taylor  
       2017-10-11 14:48:16 +08:00 via Android
    weibo.com 加入 HSTS 的话 微博图床上传接口就废了(不知道现在有没有搞好
    jasontse
        36
    jasontse  
       2017-10-11 14:55:45 +08:00 via iPad
    我没有用过 Web 版微博,都是使用手机版官方客户端,然后也从没有授权过第三方。我从没遇到过自动关注营销号这种事。
    mornlight
        37
    mornlight  
    OP
       2017-10-11 15:00:51 +08:00
    @Love4Taylor #35 完全 HTTPS 有许多麻烦,目前微博没法一步到位也可以理解。
    mornlight
        38
    mornlight  
    OP
       2017-10-11 15:03:12 +08:00
    @jasontse #36 我之前也没怎么遇到过,这次是大规模的无差别的,很过分了。
    jasontse
        39
    jasontse  
       2017-10-11 15:03:50 +08:00 via iPad
    对于运营商,我不用他们的 DNS,HTTP 劫持投诉过,工信部闹过,京东 CPS 举报封过他们的返利账户。反正碰见我他们就像碰到鬼一样,运营商目前挺老实的。
    sonyxperia
        40
    sonyxperia  
       2017-10-11 15:12:54 +08:00
    ctt
        41
    ctt  
       2017-10-11 15:16:46 +08:00
    自从微博全站支持 https 之后,我登出了一段时间,然后再开始只用 https 就没被搞鬼过。
    ittianyu
        42
    ittianyu  
       2017-10-11 16:24:55 +08:00
    我表示几年没用微博了,今年四月份那会,突然收到异地登陆的通知,2333,怎么看都不是 cookies 问题,而且也有 V 友碰到同样问题,难道是密码泄漏?有点担心这个,密码被我改成 随机码了
    mornlight
        43
    mornlight  
    OP
       2017-10-11 16:38:02 +08:00
    @ittianyu #42 也有被异地登录的情况,这个目前没找到原因。
    hjc4869
        44
    hjc4869  
       2017-10-11 16:39:48 +08:00
    微博自己是干过这种事情的,而且不止加关注,还会转发+点赞,之前就曝光过有博主人都死了几年了账号还在转发蓝 V 的推广。
    不过这个只是针对 inactive 的账号,针对 active 的账号的更有可能是楼主这种情况,被劫持了。
    mornlight
        45
    mornlight  
    OP
       2017-10-11 17:05:21 +08:00
    @hjc4869 是的,对于非活跃帐号的问题我没有足够的信息,无法做出判断,如果微博自己做手脚我也不意外。对于每天都登录的这种活跃帐号我更倾向于认为有人在中间搞鬼。
    caonan
        46
    caonan  
       2017-10-11 17:57:26 +08:00
    这是今天看过最爽的一篇文,解开谜底的那一刻心脏猛跳,楼主犀利耶!
    happywowwow
        47
    happywowwow  
       2017-10-11 22:40:04 +08:00
    `被运营商劫持`
    根据都没看到石锤证据也能说这话
    有罪推论满分
    mornlight
        48
    mornlight  
    OP
       2017-10-11 23:32:25 +08:00
    @happywowwow #47 你再看看标题。
    dangge
        49
    dangge  
       2017-10-12 21:48:48 +08:00
    Maipo 用户, Share (一个第三方安卓微博 app )用户,最近一个月没有活跃,偶然上了一次微博看了下发现被加了一页关注.
    改过一次密码后用 chrome 登录了手机网页版微博.
    同时授权了 Maipo 客户端后,第二天重现自动关注.
    不做结论,只说现状.
    哦对了,上海电信.
    mornlight
        50
    mornlight  
    OP
       2017-10-12 22:10:28 +08:00   ❤️ 1
    @dangge #49 我和我认识的另一个朋友按这个帖子里说的思路处理以后,这几天都没有再出现加关注的问题。同样上海电信。
    to2false
        51
    to2false  
       2017-10-16 09:13:47 +08:00
    只用官方客户端和 web 版的表示两天之内给我关注了三波
    livc
        52
    livc  
       2017-10-24 18:49:57 +08:00
    所以应该咋办?我给 Chrome 添加了 weibo.com 的 HSTS,其他终端需要退出登录吗?使用第三方客户端怎么办?
    mornlight
        53
    mornlight  
    OP
       2017-10-25 13:12:53 +08:00
    @livc #52 稳妥起见,加 HSTS 后,修改一次密码,所有终端重新登录一遍。正常使用没关系。
    livc
        54
    livc  
       2017-11-03 15:41:38 +08:00
    @mornlight #49 那其他终端重新登录是不是要用流量登录?用 Wi-Fi 的话还是被劫持吧?
    mornlight
        55
    mornlight  
    OP
       2017-11-03 16:04:04 +08:00
    @livc #54 仅有登录操作没关系的。
    88080398
        56
    88080398  
       2017-12-16 12:15:34 +08:00
    新注册的手机号,用的是 emore 第三方微博,一直没有被强行加关注过。

    知道昨天在 V2 看到某个帖子介绍 m.weibo.cn/beta 的时候,用安卓浏览器登录了一下,结果今天早上起来被强加了一个关注,删除之后,中午发现又被强加了两个关注。

    在登录历史里发现了两个在安卓设备上的 moliza 和 chrome44 的登录记录,现在已经退出。
    mojorrisme
        57
    mojorrisme  
       2020-02-27 02:19:06 +08:00
    作为在微博灰产边缘徘徊几年的小辣鸡!!!!觉得楼主分析很正确
    mornlight
        58
    mornlight  
    OP
       2020-02-27 09:59:34 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5407 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 05:48 · PVG 13:48 · LAX 21:48 · JFK 00:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.