朱理奧, 曹天杰
(中國礦業(yè)大學 計算機科學與技術學院,江蘇 徐州 221116)
隨著網(wǎng)絡商店、論壇等平臺的普及,攻擊者可以通過運行腳本進行批量注冊,之后通過操縱這一批虛假用戶來進行諸如惡意差評、惡意轉發(fā)、惡意發(fā)送郵件等行為,既破壞了平臺用戶的使用體驗,也給人們生活帶來不便。同時,由于越來越多的商家會在網(wǎng)絡平臺進行搶購促銷,腳本刷票的行為也將為攻擊者帶來不正當?shù)睦?。此?反復進行的暴力窮舉攻擊也會對于系統(tǒng)安全產(chǎn)生較大威脅。為了應對這一系列威脅,驗證碼的概念被人們所提出。驗證碼,全稱為完全自動地區(qū)分人類與機器的公共圖靈測試(completely automated public turing test to tell computers and humans apart, CAPTCHA)[1],是一種可以有效區(qū)分人類用戶和機器的測試。
驗證碼對于用戶身份究竟是人類還是計算機程序進行區(qū)分,可以迫使意圖進行惡意行為的攻擊者放棄計算機自動化批量操作而進行人工手動操作,從而加大了攻擊者進行大量重復操作時的時間成本,它被視為網(wǎng)絡系統(tǒng)安全的一個不可或缺的部分。
目前由于機器學習技術和圖像處理技術的不斷進步,針對驗證碼的破解與識別技術也在不斷加強。原本被認為有效的驗證碼,如今正在面臨挑戰(zhàn)。因此有必要研究和修改驗證碼,以便提高安全性。本文針對利用特征點匹配來攻破滑塊式拼圖驗證碼的攻擊方法進行研究,提出一種能夠抵抗這一攻擊方式的驗證碼設計方法。
驗證碼這一概念最早由文獻[2]提出,主要是針對當時Yahoo郵箱的垃圾郵件問題。之后學者們進行了很多驗證碼相關的研究工作。
最初,驗證碼主要是基于文本和基于圖像的驗證碼,但是由于機器學習技術和圖像處理技術的進步,攻破這一類驗證碼已不再具有難度,目前已經(jīng)有相當數(shù)量的攻擊方法被提出[3-6]。
因此,人們對于新的驗證碼類型進行了探索,提出了諸如互動式游戲(dynamic cognitive game, DCG)、隱形驗證碼[7]、眼動驗證碼[8]、動態(tài)物體識別驗證碼[9]等新的驗證碼類型。其中,運用最廣泛的,便是DCG驗證碼。這是由于相比于其他類型的驗證碼,它更為簡單,用戶在實際使用過程中也更為方便,并且與那些依賴用戶生物信息進行的驗證相比,不需要專門的硬件支持,同時相比于谷歌推出的noCAPTCHA,一個通過利用用戶操作行為進行區(qū)分的人機識別機制,不需要收集用戶隱私數(shù)據(jù)。
目前應用最為廣泛的一種DCG驗證碼,是通過讓用戶完成一個拼圖來進行驗證的滑塊式拼圖驗證碼。這種驗證碼會將圖像中的一部分作為由滑塊控制的拼圖塊,將其位置的原有圖像進行暗化處理,得到背景圖片,要求人類用戶能夠察覺出顏色異常的位置,進而明白應當操作滑塊將拼圖塊移動至指定位置。而計算機解決察覺所謂“顏色異?!辈糠值膯栴}比較困難,因此可以進行人機區(qū)分。
對于這一類驗證碼的攻擊,主要是利用驗證碼認證協(xié)議上的漏洞來繞過驗證碼,而并非識別和攻破驗證碼本身?;谠搯栴}文獻[10-11]提出了通過將目標網(wǎng)站的驗證碼偽裝成正常訪問時所需要的驗證碼,轉發(fā)給其他普通人類用戶來完成的攻擊方法;文獻[12]提出了利用驗證碼在客戶端驗證的特點,偽造已經(jīng)通過的結果來避免解答驗證碼,并提出了利用驗證碼在客戶端生成的特性,獲取未經(jīng)處理的原始背景圖片,從而計算出目標位置,進而完成驗證;文獻[13]提出了利用驗證碼生成時可能會使用同一張圖片來生成多個不同驗證碼的情形,通過使用同一圖片的不同驗證碼來還原出原始圖片,進而獲取目標位置。對于驗證碼本身進行攻破,即能模擬人類行為解決這一類驗證碼的攻擊方法,目前只有文獻[14]中所提出的基于特征點匹配的方法以及暴力窮舉法。
文獻[14]中提出了一種攻破滑塊式拼圖驗證碼的方法,具體步驟如下:
(1) 通過特征點(指圖像中與周圍像素點存在顯著差異的像素點)匹配獲取目標位置。
(2) 利用機器學習的方法模擬人類移動滑塊的鼠標軌跡進行移動,完成驗證。
在步驟(1)中,通過利用滑塊式拼圖驗證碼在給用戶發(fā)布任務時,具有將目標位置的圖像完整保留,只進行暗化處理的特點,使用Canny算子獲得拼圖塊的特征點模板和背景圖片的特征點分布之后,進行目標位置匹配。其中,Canny算子[15]的主要工作流程如下。
(1) 將圖片轉化為灰度圖,具體的轉化公式如下:
Values=0.299R+0.587G+0.114B,
其中,Values為轉化后相應像素點的像素值;R、G、B分別為轉化前該像素點在紅、綠、藍3個通道的值。
(2) 使用如下公式對圖片進行高斯濾波,去除噪聲,即
其中,(x,y)為像素點的坐標;σ為高斯分布的標準差。
(3) 使用如下2個公式計算X和Y方向的偏導數(shù),以便進行梯度幅值和方向角的計算,即
梯度幅度和方向角的計算公式分別為:
(4) 進行非極大值抑制。
(5) 利用滯后閾值法(即一高一低2個閾值),對像素點進行提取和連接,獲得邊緣。
由此可以看出,Canny算子是進行邊緣檢測,即所謂的“特征點”實質上是圖片之中的邊緣中心。
因為滑塊式拼圖驗證碼本身保留了目標位置的圖像信息,而拼圖塊本身便是目標區(qū)域的圖像,所以在提取出邊緣之后,只需要研究每一個位置的圖像與拼圖塊邊緣的重合程度,即匹配分值(原文定義為模板圖案與目標圖案在相同位置上具有的特征點數(shù)量占總特征點數(shù)的比例),便能找到目標位置。因此,使滑塊式拼圖驗證碼能夠對抗特征點匹配的關鍵,便在于干擾Canny算子的邊緣檢測。
由于Canny算子本身具有的高魯棒性特點,增加干擾像素的效果可能事倍功半。本文將采用刪除特征點的方法,降低目標位置與拼圖塊在特征點分布上的重合度,從而避免被尋找到目標位置。不過需要注意的是,為了能讓人類用戶通過驗證,應當保留一部分圖像信息,以便讓人類用戶能夠定位目標位置。
文獻[14]中同樣也提到,因為滑塊式拼圖驗證碼只有一個水平滑塊,即拼圖塊必定與目標位置擁有相同的縱坐標,針對每一個可能位置計算匹配分值是可能并且開銷較小的。因此,本文的方法將會擴展目標位置的可能性,從一維擴展至二維,來提高遍歷搜索的成本。這一行為理論上也能提高暴力窮舉攻擊的成本。
本方案不將整個目標位置的圖像信息刪除,而僅僅是進行部分刪除。具體而言,是對目標位置內的像素點選擇一部分更改為同一像素值,使得目標位置特征點的匹配分值M滿足:
M≤Maverage,
其中,Maverage為目標位置所在行除目標位置本身以外的各位置的匹配分值平均值。
因為匹配分值本身被定義為匹配的特征點占總特征點的比例,所以僅僅需要至少修改(1-Maverage)N個特征點即可,其中N為目標位置的特征點總數(shù)。
因為Canny算子本身會過濾非特征點,對于非特征點的改動不會影響Canny算子對于特征點的提取,所以出于方便考慮,可以將一個包括至少(1-Maverage)N個特征點的圓形區(qū)域內的所有像素點都更改為同一個像素值V,即可實現(xiàn)對目標位置圖像信息的部分刪除。
根據(jù)以上的思路,可以得到如下驗證碼生成方案。本方案中用到的參數(shù)如下:m為目標位置區(qū)域的長度;n為目標位置區(qū)域的寬度;V為抹除特征點時所更改到的像素值;D為驗證時的允許誤差;W為最大允許嘗試次數(shù)。這些參數(shù)的具體取值根據(jù)實際需要確定。
(1) 在一張圖片A中隨機選擇一個位置作為目標位置L,大小為m×n,將目標位置原有圖像復制下來保存,作為拼圖塊P。
(2) 將L所在行設置為感興趣帶Z,利用Canny算子對P進行特征點提取,并且對Z中除了L以外的位置進行特征點匹配,計算每個位置的匹配分值Mi,取其平均數(shù)Maverage,即
(3) 對A的L使用Canny算子進行特征點提取,得到Lm,并且統(tǒng)計其中的特征點總數(shù)N。
(4) 隨機地選取Lm的特征點中的(1-Maverage)N個,做一個可以包括所有這些特征點的幾何圓S,將S內的所有像素點的像素值設置為一個特定值V,得到更改后的圖像B,作為驗證碼的背景圖像。
(5) 將背景圖片B和拼圖塊P展示給用戶。B的展示方式與現(xiàn)有的滑塊式拼圖驗證碼的背景圖片展示方式相同。為了便于用戶找到P,P的初始位置應在B之外,或對其進行用戶界面上的提示與指引。
在步驟(4)中,為獲取S,使用k-means聚類算法對于選取的要修改的特征點進行聚類,求得聚類中心C坐標為(xC,yC)。之后以C到距離C最遠的特征點之間的距離dmax作為半徑r,做如下方程:
(x-xC)2+(y-yC)2=r2,
只要L中的像素點的坐標(xi,yi)滿足:
(x-xC)2+(y-yC)2≤r2,
即可判定該像素點在圓之內。此處特征點與C之間的距離di定義為:
考慮到實際應用過程中用戶很難精確地移動拼圖塊到選定的位置,因此還需要增加一個允許誤差D。同時額外多增加一個最大允許嘗試次數(shù)W。只有用戶將拼圖塊移動到L的D范圍內并且嘗試次數(shù)不多于W,才可算通過驗證。
需要注意拼圖塊的起始位置應當隨機,不局限于與目標位置處于同一行。同時出于易用性考量,取消水平滑動條,改為要求用戶操縱鼠標拖動拼圖塊來完成驗證。
目前已有的滑塊式拼圖驗證碼除檢驗目標位置之外,還會進行鼠標軌跡的人機區(qū)分。由于本方案已經(jīng)能夠在理論上保證針對文獻[14]的攻擊方法以及窮舉攻擊的抵抗性(理由詳見第4節(jié)),這一檢驗環(huán)節(jié)可以選擇進行保留,以便進一步提高安全性。
由于現(xiàn)有的研究均基于一維情形,并且現(xiàn)有數(shù)據(jù)集也針對的是一維滑塊的驗證碼,在進行相關研究時存在一些困難。一個思路是將文獻[15]中的特征加權的樸素貝葉斯模型[16]推廣至二維情形,利用一個合適的數(shù)據(jù)集進行訓練之后獲得一個分類器,用于對鼠標軌跡進行分類,劃分為人類軌跡和機器軌跡兩類。這將在未來的研究中進行,本文暫不展開描述。
本文方案可以使用python語言進行編寫,使用Pillow庫進行圖像處理,效果示例如圖1所示,示例取m=n=32,V=0。從圖1可以看出,本文所提出的部分抹除特征點方案使目標位置內部像素點的像素值不再變化。此時使用Canny算子將無法有效識別出目標區(qū)域內部的邊緣特征。本文方案由此抹除了目標位置內部圖像的邊緣特征信息,降低了目標位置的匹配分值,但保留了區(qū)域邊緣的特征,防止攻擊者通過尋找匹配分值最低值的方式來獲取目標位置。
圖1 圖像處理效果
本文方案適用于各種需要驗證碼的環(huán)節(jié),諸如用戶注冊、用戶登錄、論壇用戶留言等等。
以用戶留言為例。服務器應當事先保留有大量已經(jīng)生成的驗證碼的背景圖片和拼圖塊圖片。當用戶編寫完留言內容后,點擊發(fā)送留言。此時服務器接收到用戶的留言請求之后,將隨機選擇一組背景圖片和拼圖塊發(fā)送給用戶進行驗證。用戶使用鼠標完成驗證之后,將拼圖塊在背景圖片上的相對坐標以及用戶的鼠標軌跡數(shù)據(jù)傳回服務器,在服務器端進行驗證和分析。通過驗證則允許用戶留言,未能通過便拒絕用戶的留言請求。
本文方法確保了目標位置的匹配分值必定不會大于所在的一整行的平均值,則有:
M≤Maverage。
若攻擊時設置的匹配分值閾值T滿足:
T≥Maverage。
則導致目標位置并不包含在所尋找出來的位置之中。若匹配分值閾值T過小,則有:
T 這雖然可以搜索到目標位置,但是也將會包括大量非目標位置。這將強制要求攻擊者針對每一個背景圖片進行調參操作,以便選取效果最好的閾值。在規(guī)定允許最大的嘗試次數(shù)W的情況下,避免了驗證碼被攻破。 原本由于滑塊式驗證碼的拼圖塊僅僅是進行水平方向的滑動,導致目標位置的取值可能性有限。針對一個分辨率為M×N的圖片,時間復雜度為θ(M)。在本文方案中,由于拼圖塊改為了需要進行水平和垂直2個方向的移動,從一維變成了二維,因此大大增加了窮舉攻擊的時間(時間復雜度變?yōu)棣?MN))。 因為目標位置存在隨機性以及該方案并未對所用來生成驗證碼的圖片作任何要求,并且同一張圖可以生成多張驗證碼,窮舉驗證碼知識庫的攻擊,所以只要知識庫容量足夠大,也將需要耗費大量時間。 由于最近幾年利用深度學習的方法進行的驗證碼攻擊研究主要應用于針對文本驗證碼的識別[17-19],而并非是本文所研究的滑塊式拼圖驗證碼,本文在此僅進行理論分析。 深度學習的攻擊方法是通過提取拼圖塊的圖像信息后與背景圖片進行匹配,以便找出目標區(qū)域,利用的是背景圖片中目標區(qū)域的圖象紋理信息被完全保留的特點。 本文方案中目標位置的信息并不是完整保留的。要刪除的特征點占比大小與目標位置所在行的平均匹配程度有關。如果目標位置所在行里沒有多個與目標位置相似的紋理,那么目標位置所有的特征點都會被刪除,此時目標位置不會包含拼圖塊的任何紋理信息,深度學習檢測方法會難以檢測;如果目標位置所在行里包含有多個與目標位置相似的紋理,那么特征點的刪除占比會減少,但是此時會檢測出多個位置存在拼圖塊的圖案,無法具體確定是哪一個位置。 由于拼圖塊在顯示給用戶時具有一定透明度,用戶在控制拼圖塊進行驗證時,可以通過拼圖塊與目標位置未被抹除的部分進行線條對齊,或是觀察移動完成后是否存在圖像連接偏差,從而定位目標位置,并且由于允許誤差D的存在,允許用戶在完成驗證時存在一定的偏差。 用戶雖然需要在一個二維平面上移動拼圖塊,但是仍然只是沿著斜方向的一條直線進行移動,這不會增加完成測試的用時。同時該方案并未對滑塊式驗證碼的圖片顯示部分進行修改,本質上依然只是讓人類用戶完成一個拼圖游戲,因此理論上依然保存了易用性。 使用python 3.7進行編程,圖形界面使用Qt 4.7.0進行實現(xiàn),CPU為i7-8750H,操作系統(tǒng)為Windows10,實驗圖片來自于顯著性目標檢測數(shù)據(jù)集。 單次的抵抗攻擊實驗步驟如下: (1) 對于一張圖片,利用本文方法生成新的驗證碼。 (2) 使用文獻[14]的方法進行攻擊(實驗中直接選取具有最高匹配分值的位置作為攻擊中識別出來的目標位置),判斷是否準確獲得了目標位置。 (3) 使用窮舉攻擊,記錄為獲取目標位置必須經(jīng)過的窮舉次數(shù)的平均值。 對每一張圖片進行抵抗攻擊實驗,計算文獻[13]的方法和窮舉方法對于目標位置的平均識別準確率,并且研究參數(shù)D對于識別準確率的影響。之后由人類進行驗證碼驗證測試,記錄通過率以及平均時間消耗。 由于拼圖塊一般比較小,實驗中選取V=0,m=n=32。 隨著參數(shù)D的變化,特征點匹配攻擊的平均識別準確率P、窮舉攻擊的平均嘗試次數(shù)U的變化情況見表1所列,如圖2所示。 表1 D與P、U的關系 可以看出,本文提出的方法在D≤2時,文獻[14]的識別算法對目標位置的識別準確率不足1%。但是由于D的增大提高了容錯率,導致識別率隨著D的增加而增大。無論D的取值如何,盡管D的增大同樣也會減少窮舉攻擊的嘗試次數(shù),窮舉攻擊方法依然都需要大量的嘗試才能找到目標位置。 圖2 D與P、U的關系 因此,本文方案對于文獻[14]中的識別算法具有抵抗性,對于窮舉攻擊也具有抵抗性。 人類實驗中,由2名志愿者進行實驗,每人進行20次驗證測試,實驗結果見表2所列。表2中,Pass為通過率;t為通過測試的平均用時。D與Pass、t的關系如圖3所示。 表2 人類實驗結果 顯然,人類測試通過率隨著D的增大而增大,并且在D=3時達到100%,這是由于D增大提高了驗證的容錯率引起的。人類測試的平均用時則隨著D的增大而減小,這是由于D的增大提高了容錯率,使得用戶在將拼圖塊拖拽至目標位置后的反復對齊的用時減少了。 一般現(xiàn)有的滑塊式拼圖驗證碼的人類完成時間在1~3 s之間,因此可以得出本文方法并未犧牲用戶的易用性。 綜上所述,本文方案在沒有犧牲用戶易用性的前提下,具有對特征點匹配攻擊的抵抗性。允許誤差D在提高用戶驗證效率的同時,也會帶來對于特征匹配攻擊的抵抗性的下降。這在實際使用時應當根據(jù)實際需要進行權衡取舍。 圖3 D與Pass、t的關系 本文針對文獻[14]中所提及的利用特征點匹配來繞過驗證碼的方法進行了分析,并針對性地提出了一個刪除目標位置部分特征點的驗證碼生成方案,使所生成的驗證碼具有對于此類攻擊的抵抗性。本文同時對滑塊式驗證碼進行了用戶操縱上的改進,取消了原有的滑動條,將拼圖塊作為滑塊,并且擴大了拼圖塊的坐標位移維度,以便抵抗窮舉攻擊。攻擊實驗和人類測試實驗證明,本文的方案在保證用戶易用性的情況下,對于基于特征點匹配的攻擊方法具有抵抗能力。 本文方法僅僅針對目標位置的選取和處理進行了改進。在實際應用中,可以進一步利用鼠標軌跡的時空特征區(qū)分機器與人,以便達到更高的安全性。此外,本文未能針對利用深度學習的攻擊方法進行分析,這都將在未來的研究中進行探討。4.2 針對窮舉攻擊
4.3 針對深度學習方法攻擊
5 易用性分析
6 實 驗
7 結 論