從掃碼登錄的原理分析QQ大量被盜事件
6 月 26 號晚上,大量 QQ 被盜的新聞一度沖上微博熱搜。很多人反映自己的 QQ 不受控制地發(fā)送大量違規(guī)圖片。
6 月 27 號早上,騰訊 QQ 官方下場發(fā)了公告。

公告總結(jié)來說就是“用戶掃了釣魚二維碼,和騰訊無關(guān)”。
到底和騰訊有關(guān)嗎?我們來分析分析。
掃碼登錄
先看 QQ 掃描登錄的流程,大致分為三個階段:
二維碼展示階段 掃碼階段 登錄確認(rèn)階段
先簡單過一下登錄流程:
用戶打開電腦 QQ。 電腦 QQ 顯示一個二維碼。 用戶拿起手機(jī)掃碼。 電腦 QQ 顯示“掃碼成功,請用 QQ 手機(jī)版確認(rèn)”。 手機(jī) QQ 顯示“您正在一臺新設(shè)備登錄 QQ”,讓用戶選擇請選擇登錄還是拒絕。 用戶選擇登錄,電腦 QQ 登錄成功,整個流程結(jié)束。
根據(jù)用戶的行為畫出整個時序圖:

這套掃碼登錄的流程在業(yè)界被廣泛地使用,也足以證明其合理性。
過程一共有四個參與者,分別是:用戶、手機(jī)、電腦、騰訊 QQ 服務(wù)器。
黑客無法偽造用戶、手機(jī)、和騰訊 QQ 服務(wù)器這三個參與者,但是可以在電腦端上動手腳,這次的盜號事件,正是如此。
到底是怎么攻擊的呢?我們往下看。
黑客如何盜號
根據(jù)我了解到的一些信息,我大膽猜測一下盜號的過程:
網(wǎng)吧里面的 WeGame 被黑客注入了,然后黑客用手表 QQ 的登錄二維碼偽裝成 WeGame 的登錄二維碼,劫持了用戶的授權(quán)信息,黑客利用授權(quán)信息和騰訊服務(wù)器交互,批量發(fā)送圖片。
按照我的推論,還原一下犯罪現(xiàn)場:
首先,黑客入侵一個大的網(wǎng)吧管理服務(wù)商,在 WeGame 這個軟件上面注入一層釣魚入口。
然后這個服務(wù)商下的網(wǎng)吧下載了這個被注入的 WeGame。
用戶去網(wǎng)吧上網(wǎng),打開 WeGame 的時候同時也打開了釣魚入口。

這個釣魚入口輸入賬號密碼顯示登錄錯誤。
于是,用戶只能掃碼登錄,用戶一掃描,看到的卻是登錄手表 QQ。
用戶感到疑惑,但是也沒有想太多,點(diǎn)了確定登錄。
授權(quán)成功,黑客拿到授權(quán)信息。

整個過程黑客并沒有直接盜取到你的賬號密碼,只是通過“釣魚”拿到了你的授權(quán)信息。
而騰訊的服務(wù)器,只認(rèn)授權(quán)信息不認(rèn)人,只要授權(quán)信息是對的,不管誰去請求,騰訊都會放行。
就這樣,黑客得到了服務(wù)器的信任,讓你的賬號批量發(fā)送圖片。
回答
按照上面的推論,會有幾個問題:
1、為什么沒有把被盜號的人擠下線。
上面提到了,黑客拿到的是手表 QQ 的授權(quán)信息,手表QQ 和手機(jī) QQ 以及電腦 QQ 都不沖突。
也就是說,即使你手機(jī) QQ 在線,黑客也能發(fā)送消息,甚至你一邊撤回,黑客還能一邊繼續(xù)發(fā)圖片。
2、類似大量盜號事件是不是第一次?
不是。早在五月份就有類似的案例,但看起來騰訊并沒有重視。

3、為什么 QQ 經(jīng)常被盜,但是微信沒有這種情況?
QQ 誕生于 1999 年,屬于遠(yuǎn)古時代的產(chǎn)物,歷史遺留問題比較多。
微信誕生于 2011 年,跳過了 QQ 踩過的一些坑,權(quán)限把控得也更嚴(yán)格。
雖然功能上微信沒有 QQ 強(qiáng)大,但安全方面一直做得比 QQ 要好。畢竟安全是微信和支付寶這種帶有金融屬性的軟件的根基,安全做不好是玩不下去的。
4、為什么沒有掃過任何碼 QQ 也被盜了?為什么三百年沒用過的 QQ 也被盜了?為什么有些去世的人的 QQ 也被盜了?
如果真的有這種情況,那我也沒法解釋,只能讓騰訊來解釋了。
一些其他看法
上面是我根據(jù)網(wǎng)上的信息推測處理的,網(wǎng)絡(luò)上還有其他的觀點(diǎn)。
比較主流的是“學(xué)習(xí)通信息撞庫”和“js 劫取授權(quán)信息”。
學(xué)習(xí)通撞庫
這種說法的核心是:學(xué)習(xí)通泄漏了用戶的信息,然后有些用戶學(xué)習(xí)通的密碼和 QQ 密碼設(shè)置的是一樣,間接導(dǎo)致用戶 QQ 密碼泄漏。
我個人覺得這種可能性很低。
為什么呢?
第一,騰訊和學(xué)習(xí)通這種體量的 APP 肯定會對用戶密碼脫敏加密處理,并不能直接撞庫攻擊。
第二,就算破解了加密方式,拿到了用戶的密碼,也很難直接登錄用戶的 QQ。因為在登錄的時候,會觸發(fā)新設(shè)備登錄驗證,如果拿不到用戶的登錄驗證碼,是沒有辦法登錄成功的。
JS 取授權(quán)信息
根據(jù)酷安大佬@JiuXia2025 的說法,此次大量 QQ 被盜是因為用戶點(diǎn)了某個鏈接,然后被 js 劫取了瀏覽器里面的 Cookie,黑客從中拿到了能控制 QQ 賬號的 key,從而批量發(fā)送圖片。

圖片來自于why技術(shù)
對于大佬的實力,我不懷疑。
對于大佬的觀點(diǎn),我保持一個懷疑的態(tài)度。
第一,我不相信這么多年過去了,騰訊還沒有對 js 攻擊做防護(hù)。
第二,我不認(rèn)為在 QQ 里面點(diǎn)開一個鏈接,QQ 會給瀏覽器授權(quán)具備“發(fā)送消息”的權(quán)限。如果沒有“發(fā)送消息”的權(quán)限,就算瀏覽器的授權(quán)信息算被 js 劫取也沒有任何意義。
總結(jié)
總結(jié)一下我的觀點(diǎn)就是:
一個有錢人家里錢太多了總是被偷,于是這個有錢人花重金打造了世界上最牛的門,開門需要經(jīng)過二十四道機(jī)關(guān)和五次密碼確認(rèn),最后還需要驗證指紋和人臉。
即使這樣,這個有錢人的錢還是被偷了。
為什么還會被偷呢?
記者采訪了這個有錢人。
這個有錢人只說了一句話:一切責(zé)任盡在用戶。
寫在最后
吃瓜歸吃瓜,還是要搞技術(shù)的,我預(yù)估掃碼登錄的流程會成為近期熱門面試題。
為什么呢?
第一,可以驗證候選人對技術(shù)有沒有敏銳的捕捉力。
第二,可以很好地延伸到其他技術(shù)點(diǎn)。比如:
Redis 過期時間怎么設(shè)置?項目中有用到過嗎? Token、Cookie、Session 三者有什么區(qū)別? 為什么要輪詢二維碼狀態(tài)?用 Http 長連接不行嗎?用 Websocket 不行嗎? 還有哪些常見的攻擊手段?應(yīng)對措施分別是什么? 了解 OAuth2.0 和 JWT 嗎?
你看,這一套組合拳下來是不是行云流水、一氣呵成?
所以啊,還是得繼續(xù)學(xué)啊!
畢竟,宇宙的盡頭是卷王,你不學(xué)習(xí)他稱王。
以上所有推論僅代表個人觀點(diǎn),屬于個人猜想,素材全部來自于網(wǎng)上。
一切以官方公告為準(zhǔn),不信謠不傳謠。
參考資料
https://www.apereo.org/projects/cas
https://juejin.cn/post/6844904111398191117
https://mp.weixin.qq.com/s/kSzFnjPgflVdpKESvsfToA
