性能文章>从扫码登录的原理分析QQ大量被盗事件>

从扫码登录的原理分析QQ大量被盗事件原创

https://a.perfma.net/img/2382850
4周前
183101

6 月 26 号晚上,大量 QQ 被盗的新闻一度冲上微博热搜。很多人反映自己的 QQ 不受控制地发送大量违规图片。

6 月 27 号早上,腾讯 QQ 官方下场发了公告。

公告总结来说就是“用户扫了钓鱼二维码,和腾讯无关”。

到底和腾讯有关吗?我们来分析分析。

扫码登录

先看 QQ 扫描登录的流程,大致分为三个阶段:

  1. 二维码展示阶段
  2. 扫码阶段
  3. 登录确认阶段

先简单过一下登录流程:

  1. 用户打开电脑 QQ。
  2. 电脑 QQ 显示一个二维码。
  3. 用户拿起手机扫码。
  4. 电脑 QQ 显示“扫码成功,请用 QQ 手机版确认”。
  5. 手机 QQ 显示“您正在一台新设备登录 QQ”,让用户选择请选择登录还是拒绝。
  6. 用户选择登录,电脑 QQ 登录成功,整个流程结束。

根据用户的行为画出整个时序图:

这套扫码登录的流程在业界被广泛地使用,也足以证明其合理性。

过程一共有四个参与者,分别是:用户手机电脑腾讯 QQ 服务器

黑客无法伪造用户、手机、和腾讯 QQ 服务器这三个参与者,但是可以在电脑端上动手脚,这次的盗号事件,正是如此。

到底是怎么攻击的呢?我们往下看。

黑客如何盗号

根据我了解到的一些信息,我大胆猜测一下盗号的过程:

网吧里面的 WeGame 被黑客注入了,然后黑客用手表 QQ 的登录二维码伪装成 WeGame 的登录二维码,劫持了用户的授权信息,黑客利用授权信息和腾讯服务器交互,批量发送图片。

按照我的推论,还原一下犯罪现场:

首先,黑客入侵一个大的网吧管理服务商,在 WeGame 这个软件上面注入一层钓鱼入口。

然后这个服务商下的网吧下载了这个被注入的 WeGame。

用户去网吧上网,打开 WeGame 的时候同时也打开了钓鱼入口。

这个钓鱼入口输入账号密码显示登录错误。

于是,用户只能扫码登录,用户一扫描,看到的却是登录手表 QQ。

用户感到疑惑,但是也没有想太多,点了确定登录。

授权成功,黑客拿到授权信息。

整个过程黑客并没有直接盗取到你的账号密码,只是通过“钓鱼”拿到了你的授权信息。

而腾讯的服务器,只认授权信息不认人,只要授权信息是对的,不管谁去请求,腾讯都会放行。

就这样,黑客得到了服务器的信任,让你的账号批量发送图片。

回答

按照上面的推论,会有几个问题:

1、为什么没有把被盗号的人挤下线。

上面提到了,黑客拿到的是手表 QQ 的授权信息,手表QQ 和手机 QQ 以及电脑 QQ 都不冲突。

也就是说,即使你手机 QQ 在线,黑客也能发送消息,甚至你一边撤回,黑客还能一边继续发图片。

2、类似大量盗号事件是不是第一次?

不是。早在五月份就有类似的案例,但看起来腾讯并没有重视。

3、为什么 QQ 经常被盗,但是微信没有这种情况?

QQ 诞生于 1999 年,属于远古时代的产物,历史遗留问题比较多。

微信诞生于 2011 年,跳过了 QQ 踩过的一些坑,权限把控得也更严格。

虽然功能上微信没有 QQ 强大,但安全方面一直做得比 QQ 要好。毕竟安全是微信和支付宝这种带有金融属性的软件的根基,安全做不好是玩不下去的。

4、为什么没有扫过任何码 QQ 也被盗了?为什么三百年没用过的 QQ 也被盗了?为什么有些去世的人的 QQ 也被盗了?

如果真的有这种情况,那我也没法解释,只能让腾讯来解释了。

一些其他看法

上面是我根据网上的信息推测处理的,网络上还有其他的观点。

比较主流的是“学习通信息撞库”和“js 劫取授权信息”。

学习通撞库

这种说法的核心是:学习通泄漏了用户的信息,然后有些用户学习通的密码和 QQ 密码设置的是一样,间接导致用户 QQ 密码泄漏。

我个人觉得这种可能性很低。

为什么呢?

第一,腾讯和学习通这种体量的 APP 肯定会对用户密码脱敏加密处理,并不能直接撞库攻击。

第二,就算破解了加密方式,拿到了用户的密码,也很难直接登录用户的 QQ。因为在登录的时候,会触发新设备登录验证,如果拿不到用户的登录验证码,是没有办法登录成功的。

JS 取授权信息

根据酷安大佬@JiuXia2025 的说法,此次大量 QQ 被盗是因为用户点了某个链接,然后被 js 劫取了浏览器里面的 Cookie,黑客从中拿到了能控制 QQ 账号的 key,从而批量发送图片。

图片来自于why技术

对于大佬的实力,我不怀疑。

对于大佬的观点,我保持一个怀疑的态度。

第一,我不相信这么多年过去了,腾讯还没有对 js 攻击做防护。

第二,我不认为在 QQ 里面点开一个链接,QQ 会给浏览器授权具备“发送消息”的权限。如果没有“发送消息”的权限,就算浏览器的授权信息算被 js 劫取也没有任何意义。

总结

总结一下我的观点就是:

一个有钱人家里钱太多了总是被偷,于是这个有钱人花重金打造了世界上最牛的门,开门需要经过二十四道机关和五次密码确认,最后还需要验证指纹和人脸。

即使这样,这个有钱人的钱还是被偷了。

为什么还会被偷呢?

记者采访了这个有钱人。

这个有钱人只说了一句话:一切责任尽在用户。

写在最后

吃瓜归吃瓜,还是要搞技术的,我预估扫码登录的流程会成为近期热门面试题。

为什么呢?

第一,可以验证候选人对技术有没有敏锐的捕捉力。

第二,可以很好地延伸到其他技术点。比如:

  1. Redis 过期时间怎么设置?项目中有用到过吗?
  2. Token、Cookie、Session 三者有什么区别?
  3. 为什么要轮询二维码状态?用 Http 长连接不行吗?用 Websocket 不行吗?
  4. 还有哪些常见的攻击手段?应对措施分别是什么?
  5. 了解 OAuth2.0 和 JWT 吗?

你看,这一套组合拳下来是不是行云流水、一气呵成?

所以啊,还是得继续学啊!

毕竟,宇宙的尽头是卷王,你不学习他称王。

以上所有推论仅代表个人观点,属于个人猜想,素材全部来自于网上。

一切以官方公告为准,不信谣不传谣。

参考资料

分类:标签:
请先登录,感受更多精彩内容
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

关于内存溢出,咱再聊点有意思的?
概述 上篇文章讲了JVM在GC上的一个设计缺陷,揪出一个导致GC慢慢变长的JVM设计缺陷,可能有不少人还是没怎么看明白的,今天准备讲的大家应该都很容易看明白 本文其实很犹豫写不写,因为感觉没有
又发现一个导致JVM物理内存消耗大的Bug(已提交Patch)
概述 最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的。在查的过程中,阴差阳错地发现了JVM另外的一个Bug。这个B
LONG究竟有多长,从皇帝的新衣到海康SDK
转眼之间初中毕业30年了,但我仍清楚的记得初中英语的一篇课文,题目叫《皇帝的新装》(“The king’s new clothes”)。这篇课文的前两句话是:”Long long ago, there
谨防JDK8重复类定义造成的内存泄漏
概述 如今JDK8成了主流,大家都紧锣密鼓地进行着升级,享受着JDK8带来的各种便利,然而有时候升级并没有那么顺利?比如说今天要说的这个问题。我们都知道JDK8在内存模型上最大的改变是,放弃了Perm
JVM垃圾回收与一次线上内存泄露问题分析和解决过程
本文转载自:花椒技术微信公众号 前言内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。Ja
强如 Disruptor 也发生内存溢出?
前言```OutOfMemoryError ```问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界、空指针等)来说这类问题是很难定位和解决的。本文以最近碰到的一次线上内存溢出的定位、解决问题的
去哪儿国内酒店稳定性治理实践之缓存治理
背景2019 年 9 月,我们连续遇到几次与缓存相关的故障:1. DBA 运维失误,导致我们存储在 redis 里的核心基础数据被清空。由于无法正常提供报价,出现 ATP(订单量骤降)故障,之后通过定