保險櫃鑰匙插門上,大學生單槍匹馬盜取淘寶11億使用者手機號

qinjianxiang發表於2022-03-01

Hello,大家好,我是民間發明家,覃健祥。我申請了20多項發明專利,聽到這個數字,有的朋友覺得好厲害但又不明白這些發明和我們的日常生活有什麼關係,有的甚至問我是不是為了資助獎勵申請了一堆湊數的專利。其實,我的大腦裡有100個創新點可以申請專利,只是申請專利的時間和金錢成本都太高了,我只能優先申請一些商業價值大的創新程度高的。

為了消除大家對專利的神祕感,我打算寫篇文章科普一下。恰好,就在2月23日,我有件名為《基於HMAC演算法的金鑰保護方法、裝置、裝置和儲存介質》的專利獲得了國家專利局的受理通知書,這件專利和淘寶11億客戶手機號被盜的驚天大案有關。我在專利中提出的漏洞普遍存在於各行各業,很多受害者正在被攻擊而不自知,而我提出的防護方案具有非常好的通用性。

在此也請各位讀者朋友多多轉發,好讓業界早日受益,若專利成功取得授權,我將授權國防/政務/科研/教育等公共行業免費使用,對本文傳播有貢獻的讀者朋友也可申請免費授權(可用於商業目的)。

月黑風高夜,昏暗的房間裡,瀰漫著羊肉湯的羶味,一個大學生模樣的年輕人端坐電腦前,幾億個手機號離奇出現在沾滿指紋的電腦螢幕上。在上千公里之外的不夜城,一個個淘寶網購使用者相繼收到陌生的微信好友申請,繼而被拉進一個微信群領優惠券購物,群主的廣告賬戶餘額飛速跳動,一個完美的獲取使用者隱私變現的閉環形成了。

是什麼神祕的力量讓中國兩大網際網路巨頭的使用者產生了神奇的交集?手機號怎樣完成了這不可思議的時空之旅?天之驕子為何鋌而走險?敬請收看本期《走近科學》,啊不對不對,手抖打錯了,敬請收看本期《了不起的小發明》,哈哈

1. 圈門鎖失守,猛虎啖羊羔

說到獲取幾億個手機號,人們最容易想到的手段之一就是爬蟲抓取。在人們的常識中,爬蟲屬於百度谷歌才有的高科技工具。誠然,百度谷歌要收錄全網上百億的網頁,還要保證一定的實時性,技術難度確實非常大,研發費用都是以億為單位的。

但是,抓取淘寶使用者手機號的爬蟲卻不需要那麼高的技術含量,因為淘寶有官方手機客戶端,淘寶為自己的手機客戶端提供了介面(即API),API有兩大優點,使得抓取難度遠遠小於網頁:

一是簡潔性。網頁不止包含了資料資訊,還包含了排版資訊,要把資料從網頁上提取出來,需要一些複雜的規則和演算法。

二是穩定性,網頁可能每個月都在改版,改版了,原來提取資料的規則和演算法就要重寫。而API非常穩定,通常一次定義好了之後幾年都不變。

於是,通過API抓取淘寶使用者手機號,不需要寫複雜的規則就能直接拿到手機號,爬蟲開發一次可以用很久。

淘寶的十幾億使用者在黑客眼裡就是羊圈裡成千上萬只肥羊,接下來就是想辦法突破羊圈的門了。高價值的使用者資訊必然有著極高的安全等級,淘寶採用了國際上主流的HMAC技術,鑑定呼叫介面的是官方的客戶端,還是未授權的第三方爬蟲。HMAC技術的H代表hash,中文翻譯是雜湊,是全世界銀行業金融業廣泛採用的基石技術,當下最火的區塊鏈也是靠雜湊來保證資料的可信性。

聽起來淘寶的使用者庫是不是跟諜戰大片裡的銀行金庫的保險櫃一樣安全了?遺憾的是,淘寶將HMAC演算法用到的金鑰,明文放在了HTTP COOKIE裡(後面會講技術細節),這就好比保險櫃鑰匙插在了門上。圈門大開,虎入羊群,一個大學本科文化水平的人,就這樣單槍匹馬從淘寶官方的介面中盜取了11.8億使用者的手機號使用者名稱等隱私。

這正是:

蓬門今始為君開,
花徑不曾緣客掃。
數只皁雕追紫燕,
一群猛虎啖羊羔。

2.天網疏不漏,伸手必被捉

2021年6月,中國裁判文書網公佈了一份判決文書,名為《逯某、黎某侵犯公民個人資訊一審刑事判決書》,編號為(2021)豫1403刑初78號,這個驚天大案的真相浮出水面。詳情可見騰訊的這篇報導:超11億條!你的淘寶資訊可能被洩露了

根據這份判決書,我們簡單回顧一下要點:

時間線

  • 案犯2019年9月開始作案
  • 淘寶網風控人員在2020年7月發現,8月報案,同月,嫌疑人被抓獲
  • 2021年6月一審判決。

損失

  • 案犯損失自由,淘寶損失商譽。
  • 兩名案犯分別被判處3年多有期徒刑,違法所得予以追繳,另處罰款數十萬。

被盜使用者規模

  • 淘寶報案稱有3500萬(只是2020年7月6日至7月13日之間被風控人員監測到的資料)
  • 司法機關查獲認定為11.8億,淘寶經抽樣核實,認可這11.8億資料的真實性
  • 嫌疑人辯稱只抓了幾千萬,剩下的11億是別的地方下載的,法院未予採納。

作案技術手段

  • 通過手機淘寶的官方介面介面抓取,判決書中所稱mtop,即mobile taobao open platform,手機淘寶專用的介面平臺
  • 不同於淘寶開放平臺(TOP),手機淘寶的介面平臺是淘寶私有的,只有兄弟公司和極少數合作伙伴能申請到訪問許可權。淘寶報案稱嫌疑人非法繞過風控機制,證明他們沒有合法申請的訪問許可權,推測是通過淘寶“插在門上的鑰匙”偽裝成淘寶官方客戶端抓取資料的

開發爬蟲的法律風險

在我們網際網路行業有幾句玩笑話:爬蟲玩得好,牢飯吃到飽;《Python爬蟲:從入門到入獄》。

我科普的目的是提高大家的安全意識和法律意識,分享安全防護技術的同時也做點普法工作。

爬蟲違法的高風險區有這些:

  1. 抓取大量個人隱私販賣牟利。罪名是侵犯公民個人資訊,屬於刑事犯罪。非法獲取/出售50條個人隱私即可判刑,本案中,涉案公民資訊條數超標10倍以上,觸發情節特別嚴重的法條,所以刑期也達到了3年以上
  2. 爬蟲訪問過於頻繁造成對方伺服器崩潰。罪名是破壞計算機資訊系統,屬於刑事犯罪,造成為1萬人服務的系統停機一小時即為情節嚴重。比如這個CTO和程式設計師雙雙被判刑的案子
    :某公司抓取市居住證系統致伺服器崩潰,多個政務系統中斷服務,CTO和程式設計師分別被判3年和1年刑。
  3. 抓取同行的資料用作商業目的。構成不正當競爭,屬於民事侵權。比如中國法院網報導過的這個案子:大眾點評訴百度案一審宣判 百度賠償323萬

擁有程式設計手藝的朋友們,一定要多瞭解法律常識,保持技術造福社會的初心,不要迷信“避風港原則”,莫伸手,伸手必被捉。

3. 蟻穴何足道,千里之堤潰

早在2015年,我就通過烏雲漏洞平臺向淘寶報告了HMAC金鑰明文放在cookie中的安全漏洞,但淘寶認為那個不是金鑰,危害等級低。我認為這個是app secret,淘寶認為這只是一個token,這只是文字表述的差異,就算你把它命名為noise,也不改變它在程式中100%承擔著HMAC演算法secret角色的事實。

烏雲漏洞報告截圖
2015年淘寶在cookie中放明文金鑰的截圖

這種將明文金鑰放在通訊報文中的做法,相當於給了攻擊者一個永久有效的訪問許可權,導致介面被攻擊者用來抓資料,淘寶的技術團隊認為本質上跟淘寶去抓別人的資料沒有區別。詳細對話過程參見我2015年9月29日發的這條微博

當時這事在阿里內網也引起過關注,但不知道為什麼,淘寶一直堅持使用這個顯然不安全不專業的方案,即使11億消費者的隱私被盜,也沒能引起淘寶的重視。直到今天(2022年3月1日),淘寶還在用6年前就被我找出過安全漏洞的方案。證據如下:

2022年3月1日淘寶在cookie中放明文金鑰的截圖

Dear Officer, the lift is running with huge safety risk.
No, there is no lift, this is only elevator.

諱疾忌醫,終致潰堤,扼腕嘆息。

4. 亡羊可補牢,為時猶未晚

提供網際網路服務的朋友們,一定要定期認真審視自己的安全體系,安全防護方案多多益善,不是說買了一套防火牆就萬事大吉了。淘寶這個級別的公司尚且遭遇這麼大的安全事故,正說明安全絕不是輕輕鬆鬆就能做好的。

希望阿里的朋友們,能幫我把這篇文章轉發給阿里相關技術團隊,儘早把這扇敞開了7年的大門關上。亡羊補牢,為時未晚。

當然了,11億消費者手機號這麼容易被盜,錯誤不止是明文金鑰這一個,API閘道器缺少優秀的限流限頻和隱私過濾功能也是重要原因。這個做起來也頗有難度,我這幾年投資做了一個API安全閘道器,服務過央企,也服務過小創業公司,遇到很多技術挑戰,也申請了不少專利,遍嚐個中酸甜苦辣。

懂技術的讀者朋友可能會覺得,把金鑰隱藏在js程式碼裡,反覆編碼加密幾次,再混淆一下程式碼,不就安全了嗎?其實不是的,由於瀏覽器執行環境和JavaScript語法的特殊性,網頁端的JavaScript是解釋執行的,可被重寫覆蓋的,JavaScript藏不住真正的祕密。我只用了一行程式碼,幾秒鐘就找出淘寶的金鑰了,有了金鑰,我才發現居然就明文放在cookie裡。上面的兩張截圖可以看到,我把金鑰列印在控制檯或者警告了。

用kotlin開發的Android客戶端可能也有類似的風險,我還沒測試過,預計比網頁端破解難度大一些。

基於md5或者sha系列雜湊函式的簽名驗證機制,在網際網路使用得非常廣泛,這從各大開放平臺的簽名演算法文件就可以看出來。絕大多數的網頁版,都能用一行程式碼幾秒鐘破解出金鑰,無論你把金鑰藏得多深。

有鑑於此,我在2015年發明了一種可以真正防止網頁端HMAC金鑰被盜的方法,併成功運用在我公司的所有產品上。直到2022年,發現業界仍然沒有類似的技術,才申請了專利。這個專利的核心是保護金鑰安全,祕密在於以下幾點:

權利要求1:使用衰減後的金鑰

雜湊演算法都是摘要演算法,從輸入到輸出存在資訊衰減,無法逆推。平常大家下載一個幾百兆的軟體,用於驗證下載檔案完整性的hash(也叫check sum)只有16~32位元組,足見衰減係數有多大。

我們可以將明文的金鑰預先執行一部分衰減運算,再將衰減後的金鑰放在網頁端JavaScript程式碼中,在網頁端JavaScript程式碼中實現一個變種的hash函式,使其利用衰減後的金鑰計算出與標準hash函式相容的結果。這樣,攻擊者就不能從網頁端偷到真正的明文金鑰了,因為,你沒法偷走一個不存在的東西。

攻擊者拿到衰減後的金鑰,用標準的hash函式必然算不出正確的簽名,便無法破解HMAC安全機制。

這就是本專利的權利要求1(專利法規定,權利要求1是基石,權利要求2,3,4都是基於權利要求1的)。

這是篇科普文,我儘量講得通俗易懂些,詳細的技術細節不展開講,我在專利技術交底書裡寫了證明過程,大家有興趣看得話,評論裡告訴我,我後面貼上來。

權利要求2:保護變種hash函式

通過程式碼混淆,使混淆後的程式碼可讀性大大降低,大大提高攻擊者人肉閱讀變種hash函式原始碼的時間成本。

實際上,即使不混淆,寫得極其優雅的md5, sha256函式原始碼也非常複雜,我感覺因爬蟲被判刑的技術員,讀得懂md5原始碼的屈指可數。

此外,還可以將混淆後的hash函式程式碼編譯成web assembly二進位制產物,攻擊者只能反編譯再閱讀,難度又提升了一個數量級。

權利要求3:定期自動更換

寫一個自動化程式,定期執行,更換金鑰,以及變種hash函式的演算法,更換的時間間隔遠遠小於攻擊者破解的時間,就算他們破解出來也沒用了。

5. 擺下迷魂陣,請君入甕來

在能檢測到爬蟲行為或者攻擊行為的前提下,第一時間用攻防技術硬扛不一定是最佳選擇。兵者,詭道也,業內還有這麼一些請君入甕的方法:

蜜罐

檢測到攻擊行為後,並不提示錯誤碼和警告訊息,而是故意賣給破綻,用一些假的商業價值不大的資料餵養攻擊者,令其樂不思蜀,不再精進技術去攻擊真正敏感的地方。

毒丸

若是公開的介面被抓取,為保證正常使用者服務不受影響,識別出非法爬蟲後,在資料裡埋設毒丸:給爬蟲返回真假參半的資料,令其被領導或者黑產買家責難資料質量差,生意難以為繼。

養豬

若對方變現模式是非法外掛,剛檢測出來時,可不打草驚蛇,待對方小有所成發展了一定數量收費客戶後,一舉封殺,退款糾紛將僅使其焦頭爛額。

釣魚

若對方變現模式是售賣抓取的資料,第一時間不封禁其抓取通道,而是收集證據,夠刑事立案標準再訴諸法律。


如果大家喜歡這篇文章,除了轉發之外,還可以掃描下方二維碼關注我們的微信公眾號:程式碼狗說程式碼

我的同事會在那裡和我一起寫文章,都是資訊保安/軟體技術/智慧硬體領域的一些科普,通俗易懂,也有技術含量,歡迎大家來交流。

程式碼狗微信公眾號

相關文章