對微博被惡意加關注問題的一點分析和猜測
起因
我是微博重度用戶。
在國慶節前後幾天,我遭遇了一輪又一輪的被動加關注問題,剛開始以為自己不小心泄露了密碼,因為之前很長時間我都沒有遇到過這類問題,先從自己身上找原因。然後就是既定流程:修改密碼 -> 在安全中心退出所有已登錄設備 -> 清空所有第三方授權。
然後,好像並沒有什麼用。
很多人認為是微博內部故意設計了一套策略,強行給用戶塞關注來賺黑心錢,但我認為這個說法站不住腳,微博這兩年市值和營收一直漲,不需要冒風險撈這種錢。
於此同時,我看了我身邊的一些人身上也發生了同樣的問題,以及 V2EX 里也有多個人發帖:
微博還會自動幫你關注人的? - V2EX
新浪微博被 wt.weidaogou.com.cn 等垃圾推廣號包圍了 - V2EX
微博自動關注一些垃圾營銷號, 沒有辦法解決嗎? - V2EX
大家驚訝地發現彼此遇到的可能是同一波人,被強加的關注有很高的重疊率,套路也都類似,要麼是發表各種 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 啥也幹不了。(更新:經 Maipo 開發者提醒,有 access_token 就可以做關注操作,不需要應用私鑰簽名,所以這一步的分析是不夠準確的,但目前沒有發現黑產會劫持第三方應用的回調請求的跡象。access_token 通過 HTTP 傳遞是不安全的行為)
我目前在使用的這幾個客戶端要麼官方,要麼老牌,要麼開發者是我信任的,幾乎可以排除它們的嫌疑。
控制變數,縮小範圍
那麼,只剩第三種可能了。我用的 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 http://Weibo.com
我發現了什麼!Maipo 打開微博的鏈接是 HTTP 的,雖然訪問後會 301 跳轉到 HTTPS,但這個 HTTP 請求仍然會攜帶上瀏覽器在 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 列表裡加入 http://weibo.com 域名,然後再修改一次密碼:
在 Chrome 里打開 chrome://net-internals/#hsts
Add weibo.com
Query http://weibo.com,能查詢到就可以了。如下圖:
把 http://weibo.com 加到 HSTS 里後,Chrome 再遇到 HTTP 的微博鏈接,會直接在瀏覽器內部就跳轉到 HTTPS,請求不傳到外面去,可以保證通訊安全。然後,你就不要在其他的瀏覽器或電腦上登錄微博了。
我平時用的都是 Chrome,Safari 我沒找到哪裡可以自己添加 HSTS,Firefox 好像可以修改配置文件夾里的 SiteSecurityServiceState.txt 來實現,我沒試。
被這個問題困擾的同學可以試試看,我這邊是有效的,不知道其他人情況如何,歡迎反饋結果。
推薦閱讀:
※為了營造和諧美好的網路環境,讓我們一起來屏蔽微博監督員
※如何評價微博的暴走漫畫的動圖評論表情?
※fb表情包大戰前因後果及後續發展?
TAG:微博 |