利用機器學習突破基於文字的CAPTCHA驗證碼程式
概述
我想大家之前都有過下面這樣的想法。當你看到一個簡單的圖片驗證碼時,你會想,或許我可以攻破這個驗證碼。這個驗證碼可能是個帶有簡單的傾斜文字的圖片,並且在圖片上會有幾條橫線或者圖片上的文字會左右晃動。你沒時間使用OCR來突破驗證碼,但你有一種強烈的感覺,那就是通過現代的一些高階技術可以輕易的繞過這種驗證碼。
文字將闡述如何使用最少的預處理技術和標準的預先訓練的OCR模型來輕鬆的突破下面這種圖片驗證碼。
CAPTCHA(全自動區分計算機和人類的圖靈測試)是一個挑戰-響應問題。如果正確實現驗證碼程式,那麼這個問題將只能由人類解決。CAPTCHA自2003年被開發出來後,其使用量一直在穩步增長。它們主要用在需要或顯示敏感資訊的場景中,例如身份驗證或註冊過程。CAPTCHA的主要目標是防止垃圾郵件,使用者名稱列舉和密碼暴力等自動攻擊。如果只有人類可以解決這個挑戰問題,那麼攻擊者就不可能通過建立一個自動化指令碼來暴力攻擊驗證碼驗證機制或從頁面中列舉敏感資訊。
CAPTCHA有很多種形式,其範圍包括很多第三方的解決方案以及自定義實現。特別是 Google 的 reCAPTCHA 。這篇文章的重點是評估基於文字的CAPTCHA,它要求使用者輸入給定圖片中的文字。由於現有的CAPTCHA解決方案通常需要很大的成本,因此企業內部開發的基於文字的CAPTCHA很常見。與大多數安全控制一樣,重新發明輪子必然會帶來一系列問題。
你可以擁有最強大,最複雜的CAPTCHA程式,但如果你沒有正確的實現它,這就沒有任何意義。我們在現實的場景中經常看到的一些錯誤包括開發人員設定的硬編碼的繞過、在伺服器響應中洩露了CAPTCHA程式的驗證碼答案,甚至完全無法驗證CAPTCHA的情況(即CAPTCHA 失效)。
但是,如果你能夠在實現CAPTCHA時避免這些錯誤,並使用足夠複雜的基於文字的圖片作為驗證碼,那麼你可能會相信它可以阻止常見的自動化攻擊技術。
然而,隨著機器學習技術和計算能力的提高,即使是實現良好的基於文字的CAPTCHA也應該被認為是脆弱的。強大的字元識別技術不再侷限於學術界和谷歌。下面,我們將演示如何使用免費提供的開源軟體破解六個定製實現的基於測試的CAPTCHA。
如何破解CAPTCHA?
嘗試破解CAPTCHA可以看作是常見的Web應用程式安全測試方法的一部分。傳統的方法是使用影象預處理技術對CAPTCHA圖片進行“過濾”,然後嘗試使用現有的OCR模型來識別字符。但這可能需要大量的手動調整工作,並且由於驗證碼驗證過程通常具有嚴格的時間限制,以及應用程式通常具有比CAPTCHA更多的關鍵功能,因此開發有效的CAPTCHA破解器通常是不切實際的。
我們嘗試採用傳統的方法來對抗一些看似相當簡單的CAPTCHA。這個CAPTCHA中的影象具有相當小的噪聲,並且字元個數非常少。雖然字元是三維的,但是這種3D效果可以被濾除掉,因為顯示的3D效果與基本字元的輪廓具有不同的顏色。對於攻破這種CAPTCHA,我們感到非常自信,我們決定使用500個CAPTCHA樣本測試我們的理論方法。
我們嘗試了各種預處理技術對原始的圖片進行“過濾”處理,然後使用 Tesseract-OCR 模型識別字符。令我們沮喪的是,每次執行都會失敗。如果我們幸運的話,OCR會正確地識別出五個字元中的兩個。無論我們嘗試使用何種過濾技術,都沒能讓我們得到一個可能構成實際威脅的模型準確度。
在花了幾個小時後,我們決定從錯誤的角度看待這個問題。為什麼我們要嘗試對CAPTCHA圖片進行“過濾”讓圖片更適合已經訓練過的OCR模型處理?為什麼我們不能為這個特定的CAPTCHA訓練特定的模型呢?
在通過谷歌搜尋後,我們找到了理想的 Tensorflow 模型,可以針對OCR進行訓練: 基於注意力的OCR(AOCR) 。訓練模型需要訓練和驗證資料。我們花了兩個小時,手動標記了所有500個CAPTCHA樣本。其中450個 CAPTCHA樣本用於訓練模型,剩餘50個樣本用於驗證模型。使用膝上型電腦的CPU訓練模型大約需要一個小時。但結果仍然不是很樂觀,在經過給資料打標的繁瑣過程和一整天的反覆試驗之後,我們決定停止訓練並執行驗證資料看看結果。
我們不得不執行三次訓練過程 —— 我們真的不相信上圖中的結果。100%的準確率?這說明我們沒有犯過任何錯誤。
在訓練模型時,它會對解決方案的準確度和置信度進行評估。有趣的是,對該指標的分析表明我們在初始資料集中出現了資料打標的錯誤。在四個樣本例項中,我們將“M”標記為了“N”,並且這個錯誤是由訓練的模型檢測到的。
我們開始懷疑這個結果的統計意義,很顯然,我們需要更大的樣本量。因此,我們將模型的CAPTCHA樣本提升至1500個:1000個用於訓練,500個用於驗證。同樣,我們得到了100%的準確率。
訓練過程
有關建立自己的CAPTCHA破解器的過程和指令碼的詳細操作指南, 請參閱此Github倉庫 。
為了訓練學習模型,你必須準備一組重要的CAPTCHA樣本。收集資料集的過程可以自動化完成,並且可以在相對短的時間內檢索大量樣本集,例如通過有目的地提交不正確的使用者名稱並儲存新生成的CAPTCHA。
對於一些更簡單的CAPTCHA,我們發現使用500個標記的樣本資料足以得到很好的結果,而更復雜的CAPTCHA則要求樣本資料需要超過1000個。在我們努力進行手動分類過程的情況下,需要更多的樣本來提供準確的結果。
第二步是需要手動對資料集進行打標。根據CAPTCHA的複雜程度,此步驟的簡易性可能會有所不同。這一步的單調操作並非如此。
可以使用指令碼儘可能簡化打標過程。CAPTCHA一次只顯示一個字元來用於標記,可以使用 OpenCV ,之後以標籤作為檔名並儲存圖片。為了滿足所需的人力,每打標1000個CAPTCHA平均需要一個小時。
基於注意力的OCR(AOCR)模型可以用於分類。由 Qi Guo和 Yuntian Deng開發 的這種Tensorflow OCR模型使用了堆疊有長短期記憶(LSTM)單元的滑動卷積神經網路(CNN)進行分類。這些都是大而複雜的AI術語,我們不會在這裡討論。我們想要展示的是,通過谷歌搜尋和遵循Github README頁面的說明,幾乎每個具有基本開發技能的人都可以開始動手破解CAPTCHA。
為了進一步證明我們的想法,初始的訓練是在配有Core i7的工作站膝上型電腦上完成的,Tensorflow在CPU上執行。使用這種方式,每個訓練步驟平均耗時2.5秒。對於大多數示例,大約需要1000到2000個步驟。即使是最複雜的模型也可以在兩小時內訓練完成。
作為一項實驗,我們在Nvidia GTX 960上測試了支援GPU的Tensorflow構建。平均訓練步驟時間降至0.2秒。如前面所述,為更復雜的CAPTCHA訓練模型需要更多的訓練步驟和更長的訓練時間。如果步驟的複雜性和數量大幅增加,切換到GPU上的訓練可以顯著提升效率。
訓練結果
每個CAPTCHA及其各種複雜因素的描述包含在下表中:
每個CAPTCHA模型的準確度結果如下表所示:
雖然乍一看所有CAPTCHA的結果看起來不太令人滿意,但下一張表證明並非如此。如上所述,模型將輸出CAPTCHA預測以及預測正確的確定性評估。正確的猜測通常比不正確的猜測具有更高的確定性。因此可以指定一個最小確定性值或閾值。如果從伺服器接收到的CAPTCHA預測的確定性值沒有超過該閾值,則將請求新的CAPTCHA。這種方法將限制提交可能不正確的CAPTCHA值,但代價是需要丟棄一些CAPTCHA。閾值越高,丟棄的CAPTCHA越多。
確定性閾值與丟棄的CAPTCHA之間的權衡如下表所示。如果我們想要達到指定的接受率,每個CAPTCHA的值表示平均丟棄多少CAPTCHA然後提交一個CAPTCHA。
考慮C-2:如果我們想要向伺服器提交CAPTCHA,並且我們知道接近100%的所有提交都會是正確的,所以我們的過濾器只允許提交每250個CAPTCHA中的1個。如果我們調低了我們的接受率,接受大約10%的提交都是不正確的,那麼過濾器將允許提交每八個CAPTCHA中就會有一個。相反,對於C-1,由於在預測中沒有出現錯誤,因此不必丟棄CAPTCHA以實現任何接受率。
複雜性與使用者體驗
如上面的結果所示,要防止CAPTCHA被破解,很明顯的一個解決方案就是使基於文字的CAPTCHA更復雜,例如新增更多噪聲,群集文字,增加長度和可用字符集。下面的例子可以被視為一種基於文字的CAPTCHA驗證碼的更安全的實現:
當然,解決方案需要在可用性和人性友好之間進行權衡。如果經過訓練的模型在CAPTCHA上達到了50%的準確度,但人類也可以達到相同的結果,那麼這種情況下,模型真的有缺陷嗎?成功實現自動化解決方案的目標不一定是實現100%的成功率,而是達到類似人類的準確度。如果模型可以達到人類級別的準確性,則由不正確的CAPTCHA提交產生的噪聲將被遮蔽為正常的人為錯誤。
如前所述,AOCR訓練模型不僅提供了CAPTCHA的分類,還提供了預測準確的概率。這個概率值可用於在比較困難的情況下通過丟棄低於特定預測概率的分類結果,然後請求不同的CAPTCHA來確保高水平的預測準確性。
CAPTCHA破解的下一步是什麼?
這不是一個新問題。在2014年, 已經有人證明 可以通過自動化手段破解基於文字的CAPTCHA。我們只是展示了在這四年中如何大大減少突破這些系統所需的工作量。
雖然這篇文章旨在強調基於文字的CAPTCHA的不安全性,但存在不同型別的第三方CAPTCHA解決方案,這些第三方解決方案對於計算機來說可能更復雜,但仍可供人類使用。最受歡迎的CAPTCHA實現是Google的reCAPTCHA。reCAPTCHA是一個基於影象的CAPTCHA,要求使用者單擊與提供的描述所匹配的所有影象。雖然影象驗證挑戰本身被認為更加安全,但也有一些攻擊案例已經證明, 可以通過請求和自動解決音訊挑戰來繞過挑戰 。此外,與基於文字的解決方案非常相似,計算能力也使這種攻擊方法變得微不足道只是時間問題。
另一個不錯的解決方案是根據使用者的行為構建威脅模型。例如,人類將在非線性路徑中移動滑鼠,具有不一致的點選率並且將滾動滑鼠滾輪讀取內容。一個這樣的例子是 谷歌的reCAPTCHA v3 。目前,這仍然需要整合第三方元件,但它似乎確實是目前最好的解決方案。
使用第三方解決方案確實存在限制,因為企業可能並不總是願意將第三方軟體引入到敏感的應用程式中。就目前而言,不願加入Google革命組織的開發人員只能在等待更好的解決方案出現前嘗試使自己的CAPTCHA足夠複雜。
CAPTCHA的目標是通過要求人類使用者進行互動來阻止垃圾郵件和自動化。隨著人工智慧在能力和複雜程度上的增長,這將變得更加困難。這強調了深度防禦的重要性。如果CAPTCHA在登入功能中提供的防線被攻破,則可以通過帳戶鎖定策略,強密碼策略和雙因素身份驗證等功能進一步保護帳戶免受自動登入暴力嘗試的攻擊。隨著攻擊CAPTCHA解決方案的門檻的降低,自動列舉和其他暴力攻擊將變得更加可行,這些應該被納入安全防禦的緩解策略中。