驗證碼對抗之路及現有驗證機制介紹
yahoo郵箱在九幾年的時候,業務深受各種郵箱機器人的困擾,存在著大量的垃圾郵件,于是他們找到了當時仍在讀大學的路易斯·馮·安(Luis von Ahn),并設計了經典的圖形驗證碼,即通過簡單的扭曲圖形文字進行機器的識別。

通過這個簡單的圖形,他們很快的控制住了垃圾郵件的數量,并將大量的機器人據之門外。
但是即使驗證碼解決了垃圾郵件的問題,我們仍要提出一個問句:
驗證碼是必要的嗎?
阿里有句簡單的話:不忘初心,方得始終。
驗證碼不是一個功能性的需求,他并不能帶來業務的提升,也不能帶來任何價值。
驗證碼只是為了解決機器問題才誕生的。在設計和驗證碼演化的過程中,必須同時考慮安全性和體驗。

讓我們老考慮驗證碼的最簡化模型,關鍵點在于:生成的問題能夠由人來解答,并且機器難于解答。
于是傳統的圖形驗證碼的重點就放在了如何生成讓機器難于解答的圖片上來。

從上圖看來,相應的各種方法已經有了相當成熟的一些對抗辦法,更不用說現在已經廣泛泛濫的打碼平臺了。
結合我們安全性和體驗兩方面來講,傳統驗證碼在兩方面來說都已經不能滿足要求了。
樹林里分開了兩條路
現在隨著攻防的升級和對抗的不斷加強,驗證碼的面前針對安全性和體驗這兩個關鍵點分出了兩條路:
- 從體驗上來:基于人類用戶的行為
- 從安全性上來:基于人類認知問題的答案
基于人類認知問題的答案,我們已經碰見過很多種了,這里簡單貼兩個:


當然也存在這類:

簡要分析,優點明顯:機器沒有這個認知能力(廢話,好多我都做不出來)
存在的問題有:
1.題庫維護的難題。如果題庫被遍歷完成,那么其安全性無法保證。
12306為什么后面把問題變成了圖片呢? 因為有攻擊者將每次的答案與出現的可選問題進行了多次重復遍歷,當這個遍歷到達一定次數后,會發現某個答案與某張圖常常會關聯出現(因為問題必定會有正確答案),通過這個出現概率即可得到答案。于是,12306才把文字變成了現在扭曲的圖片。 并且還有研究人發現,12306的圖片可能大量來自某百科,通過逆向使用該公司的圖像識別服務,可以得到該圖片的部分標簽。
2.體驗差
過年的時候,正常人平均都要答3、4次才能答對答案。而且部分圖片因為分辨率不高、再加上縮小圖片以后,會更加的看不清了。
基于人類用戶的行為,具體點就是用戶在進行相應操作時,會產生的操作記錄和環境信息(詳見設備指紋一文)等。
基于人類用戶行為這條路是基于以下基礎的:
- 機器人的環境有別于正常用戶
- 機器人的動作或頻率等有別于正常用戶
- 機器人的在相應關鍵業務點的行為邏輯有別于正常用戶
但是這個基礎在技術對抗上有個更關鍵的點,在于如何構建一個安全的信道,將這些數據回傳回來。如果這個信道的采集機制、加密機制和傳輸機制被攻擊者所探知,那么以上采集的信息將沒有秘密可言。(換句話說,攻擊者會偽裝成正常用戶的行為發送數據)

阿里所采用的前端采集和加密機制,利用自動化混淆、加密函數隨機選擇、線上自動迭代等能力將web前端打造為了一個可信的端,并將數據回傳。(詳見驗證碼的前世今生系列)
該類方法的優點:
收回了對用戶的強打擾將基于知識和問題的對抗轉變為前端加解密采集等機制的對抗如果攻擊者無法攻破這一層堡壘,即使打碼平臺存在也無法攻擊成功
缺點:
加解密機制需要做到足夠強,并且需要擁有攻擊感知能力、線上的自我變更能力和自動化測試等能力
我們選擇了同時走兩條
基于上述思考,阿里滑動驗證綜合考慮兩種類型的方法,結合并推出了滑動驗證的體系:

通過基于用戶行為的第一道防御將對正常用戶的打擾降低,使得正常用戶可以以極小的代駕通過滑動驗證,而同時對不確定的用戶實施知識型問題的驗證,在攔截機器人的同時,保障業務的正常平穩運行。
再看看google先階段的norecaptcha:

可以看到,google的模式與阿里的模式有些類似,所不同的是google所使用的驗證碼模式是點擊,而阿里是滑動。
簡單分析下google,對于第一步的點擊驗證,google更多的是通過其基于虛擬機的強混淆器對整個數據采集過程進行了加密,并綜合了環境信息(如設備指紋、cookie、點擊頻率等信息)來進行判斷,而第二步的知識驗證也包括以下幾種(部分在之前的圖中沒有出現):
- 1.扭曲的圖形
- 2.圖形的分類
- 3.高級圖形分類(會不斷的出圖,點完一張又一張)
那這樣是否就是驗證碼問題的銀彈呢?
之前已經提到過,無論是google的norecaptcha還是我們的滑動驗證,其核心都在于其本身的風控引擎和相應的規則,對于攻擊者來說也有兩條路:
- 正面強行突破,破解前端的密文、然后模擬正常用戶行為,達到直接通過的目的
- 退而求其次,通過觸發二次驗證過程,然后通過ocr或者打碼等其他方法通過
rsa上針對googlenorecaptcha的破解
4月8日,BlackHat上公布了一篇來自哥倫比亞大學的論文,大致上講了他們是如何突破google的norecaptcha驗證碼的。
簡單說明下他們的破解過程:
1.攻擊者通過大量的模擬器及代理IP來偽造Browsing History及Browser Environment來Fuzz測試Google的風險分析系統。測試過程中發現包括Useragent、Canvas Fingerprint、屏幕分辨率、鼠標行為動作眾多因素均為風險判斷的因子,風險判斷決策返回結果隨機且有嚴格的次數限制;

比如,攻擊者發現,修改user agent、使用firefox而聲稱chrome等會導致norecaptcha出現回退,即出現普通的驗證碼。

2.在得出了這些參數與最終結果的關系后,也沒有正面突破,走到了第二個思路,經過fuzz嘗試后,發現google的容錯性較高,即即使圖中只有2個正確答案,你如果點擊了3個圖,包含兩個正確答案,也算正確。并且,根據基于次數的統計發現,norecaptcha中出現答案的比例較多的為2個答案(74%),因此,攻擊者很聰明的選擇了每次選擇3個圖像的方法,因為這樣做可以使得每次成功的概率提高(畢竟多選了一個可能正確的答案,即使選錯了也可以對)。
3.同時,在大量的fuzz面前,攻擊者們發現有些圖片會時不時的出現。出現次數最多的一個圖片出現了12次。他們開始意識到這些圖片并不是實時生成的,而是從一個已經生成好的池子中生成的。重復的利用,也就意味著大規模的可能性。
盡管google生成的圖每張的hash值不同,但是利用感知hash算法(Perceptual hash algorithm),攻擊者可以對每次稍微變換了hash的圖進行相似度比較,如果相似度較高,即可完成對已打標完成的圖的重定位。
重定位完成后,既可以對已經完成的答案進行重復利用,而這種重復利用在大規模的攻擊中是非常重要的,無限彈藥在游戲中的作用你懂的。
4.完成了以上動作以后通過用圖片搜索相應關鍵字(利用google自己的功能搞google)、其他圖片搜索引擎(Alchemy、GRIS、Clarifai、NeuralTalk)等對圖進行搜索,并利用這些數據得到了大量的圖片相關的子類標信息,越來越多的標簽信息意味著對圖片有了更多更高維度的刻畫。通過在各個網站收集相關標簽,即可得到一個對該圖片較為全面的描述。

5.利用機器學習的算法,其實就是利用Word2Vec,將兩個圖的對應關鍵字放在一個向量空間中,然后利用余弦相似性原理,找出相似度最高的幾張圖片。(與我們傳統的找兩個相似的文獻或同作者的思路類似)。
6.將之前的五步進行組裝。
- 看見未曾見過的圖,感知hash計算,如果是已有答案,直接給答案。
- 看見見過的圖,直接給答案。
- 如果是未曾見過的,也不在數據庫內,開啟圖形引擎獲得標簽信息,再扔進模型里面得到答案,將答案存入庫里。
- 循環以上步驟比如:同時出現紅酒、酒杯、酒這幾個標簽,那么對所有獲得的標簽進行相似性比對后,會取出帶有酒這個標簽的前幾個圖
阿里在實際的對抗中,我們也發現有攻擊者無法攻破第一層防御,即他們無法正常通過,但是卻知道如何觸發第二級驗證,并嘗試通過破解第二級驗證的問題通過。
如果想要真的做好在安全和體驗間的良好平衡,需要同時在兩個方面都下功夫,才能保證整體的安全水位。
前端可信端體系的建立、強大認知問題系統的建立需要持續不斷思考和提高。我們的每一次的變更,接入的客戶都將實時享受到更高安全等級的防護。
作者:目明@阿里巴巴安全部,更多技術文章,請訪問阿里聚安全博客
浙公網安備 33010602011771號