利用機器學習突破基於文本的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訓練模型大約需要一個小時。但結果仍然不是很樂觀,在經過給數據打標的繁瑣過程和一整天的反覆試驗之後,我們決定停止訓練並運行驗證數據看看結果。
在訓練模型時,它會對解決方案的準確度和置信度進行評估。有趣的是,對該指標的分析表明我們在初始數據集中出現了數據打標的錯誤。在四個樣本實例中,我們將「M」標記為了「N」,並且這個錯誤是由訓練的模型檢測到的。
我們開始懷疑這個結果的統計意義,很顯然,我們需要更大的樣本量。因此,我們將模型的CAPTCHA樣本提升至1500個:1000個用於訓練,500個用於驗證。同樣,我們得到了100%的準確率。
訓練過程
有關創建自己的CAPTCHA破解器的過程和腳本的詳細操作指南,請參閱此Github倉庫(https://github.com/mwrlabs/captcha_cracking)。
為了訓練學習模型,你必須準備一組重要的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解決方案的門檻的降低,自動枚舉和其他暴力攻擊將變得更加可行,這些應該被納入安全防禦的緩解策略中。
※滲透技巧——Windows下NTFS文件的USN Journal
※WordPress Simple Social Buttons插件安全漏洞
TAG:嘶吼RoarTalk |