6 月 26 号晚上,大量 QQ 被盗的新闻一度冲上微博热搜。很多人反映自己的 QQ 不受控制地发送大量违规图片。
6 月 27 号早上,腾讯 QQ 官方下场发了公告。
公告总结来说就是“用户扫了钓鱼二维码,和腾讯无关”。
到底和腾讯有关吗?我们来分析分析。
扫码登录
先看 QQ 扫描登录的流程,大致分为三个阶段:
- 二维码展示阶段
- 扫码阶段
- 登录确认阶段
先简单过一下登录流程:
- 用户打开电脑 QQ。
- 电脑 QQ 显示一个二维码。
- 用户拿起手机扫码。
- 电脑 QQ 显示“扫码成功,请用 QQ 手机版确认”。
- 手机 QQ 显示“您正在一台新设备登录 QQ”,让用户选择请选择登录还是拒绝。
- 用户选择登录,电脑 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 劫取也没有任何意义。
总结
总结一下我的观点就是:
一个有钱人家里钱太多了总是被偷,于是这个有钱人花重金打造了世界上最牛的门,开门需要经过二十四道机关和五次密码确认,最后还需要验证指纹和人脸。
即使这样,这个有钱人的钱还是被偷了。
为什么还会被偷呢?
记者采访了这个有钱人。
这个有钱人只说了一句话:一切责任尽在用户。
写在最后
吃瓜归吃瓜,还是要搞技术的,我预估扫码登录的流程会成为近期热门面试题。
为什么呢?
第一,可以验证候选人对技术有没有敏锐的捕捉力。
第二,可以很好地延伸到其他技术点。比如:
- Redis 过期时间怎么设置?项目中有用到过吗?
- Token、Cookie、Session 三者有什么区别?
- 为什么要轮询二维码状态?用 Http 长连接不行吗?用 Websocket 不行吗?
- 还有哪些常见的攻击手段?应对措施分别是什么?
- 了解 OAuth2.0 和 JWT 吗?
你看,这一套组合拳下来是不是行云流水、一气呵成?