馬軍,王效武,朱永川,王海兮
1.深圳市網(wǎng)聯(lián)安瑞網(wǎng)絡(luò)科技有限公司,廣東 深圳 518000 2.中國(guó)電子科技集團(tuán)公司第三十研究所,四川 成都 610041
近年來(lái),互聯(lián)網(wǎng)信息呈現(xiàn)出指數(shù)級(jí)增長(zhǎng)的趨勢(shì),而數(shù)據(jù)對(duì)于商家則至關(guān)重要。通過(guò)海量互聯(lián)網(wǎng)數(shù)據(jù)分析,不僅能降低企業(yè)的運(yùn)營(yíng)成本,還能提前預(yù)估產(chǎn)品的需求,進(jìn)而降低生產(chǎn)和庫(kù)存成本。然而,用戶對(duì)海量互聯(lián)網(wǎng)數(shù)據(jù)的采集,使得互聯(lián)網(wǎng)服務(wù)器承受巨大的壓力;尤其是大量網(wǎng)絡(luò)爬蟲(chóng)機(jī)器人的存在,造成數(shù)據(jù)采集的頻次和速度超過(guò)人類(lèi)的瀏覽速度,影響網(wǎng)絡(luò)服務(wù)器的正常運(yùn)行[1]。因此,大量網(wǎng)站都采用了多種反爬蟲(chóng)的機(jī)制,驗(yàn)證碼識(shí)別則是眾多反爬機(jī)制中的一種[2]。
對(duì)于普通的驗(yàn)證碼,部分人工智能的技術(shù)能自動(dòng)識(shí)別驗(yàn)證碼,突破驗(yàn)證碼識(shí)別機(jī)制,并配合網(wǎng)絡(luò)爬蟲(chóng)實(shí)現(xiàn)全自動(dòng)化的信息采集。但人工智能技術(shù)不是無(wú)懈可擊,其自身也存在潛在的漏洞[3-5]。為了確保驗(yàn)證碼圖片不被基于智能算法的機(jī)器人識(shí)別,利用人工智能技術(shù)的弱點(diǎn),構(gòu)造出基于圖像擾動(dòng)技術(shù)的擾動(dòng)樣本,這些樣本能有效降低機(jī)器人的識(shí)別準(zhǔn)確度,使網(wǎng)絡(luò)機(jī)器人自動(dòng)識(shí)別驗(yàn)證碼的功能失效,從而提高系統(tǒng)安全性。
對(duì)抗樣本可作為機(jī)器學(xué)習(xí)或深度學(xué)習(xí)模型的輸入,最終導(dǎo)致模型得出錯(cuò)誤的分類(lèi)結(jié)果[6-7]。其設(shè)計(jì)的基本思想是攻擊者在原始圖片中添加較小的擾動(dòng),就能使模型結(jié)果產(chǎn)生截然不同的錯(cuò)誤判斷,這些擾動(dòng)被稱為對(duì)抗樣本。例如,在原版大熊貓圖片中加入肉眼難以發(fā)現(xiàn)的干擾,生成對(duì)抗樣本,最終導(dǎo)致神經(jīng)網(wǎng)絡(luò)誤認(rèn)為大熊貓圖片是長(zhǎng)臂猿,其置信度在99.3%[6]。除此之外,Szegedy等[4]還發(fā)現(xiàn),對(duì)抗樣本具有一定的跨模型和跨數(shù)據(jù)集泛化性;前者指大部分對(duì)抗樣本會(huì)被具有不同參數(shù)(模型層數(shù)、正則化、權(quán)重等)的網(wǎng)絡(luò)模型誤分類(lèi),后者指大部分對(duì)抗樣本會(huì)被在不同訓(xùn)練集上被誤分類(lèi)。
因此,本文擬通過(guò)向文本驗(yàn)證碼添加較小的像素?cái)_動(dòng)進(jìn)而生成對(duì)抗驗(yàn)證碼,從而使得這些對(duì)抗驗(yàn)證碼不容易被以深度神經(jīng)網(wǎng)絡(luò)算法為核心的智能機(jī)器人正確識(shí)別,進(jìn)而提高系統(tǒng)的安全性。
目前,驗(yàn)證碼可分成3 種類(lèi)型:第1 種是基于文本的驗(yàn)證碼,通常由字母和數(shù)字組成,其經(jīng)過(guò)復(fù)雜的圖像扭曲技術(shù)處理,不能被自動(dòng)識(shí)別技術(shù)所識(shí)別,但是肉眼能正常識(shí)別;第2 種是基于圖像的驗(yàn)證碼,通常要求用戶在一組候選圖片中選擇一張或多張具有特定語(yǔ)義的圖片;第3 種是基于語(yǔ)音的驗(yàn)證碼,通常要求用戶完成語(yǔ)音識(shí)別任務(wù),并常與文本驗(yàn)證碼一起使用。
本文主要基于文本的驗(yàn)證碼進(jìn)行研究,原因如下:1)基于文本的驗(yàn)證碼是最廣泛使用的一種驗(yàn)證碼類(lèi)型,許多主流網(wǎng)站都在使用,比如Google、Baidu、Yahoo;2)文本驗(yàn)證碼由來(lái)已久且已被廣泛使用,相關(guān)的攻擊手段層出不窮,且攻擊技術(shù)也相對(duì)成熟,因此文本驗(yàn)證碼系統(tǒng)的安全性常受到較大威脅;3)文本驗(yàn)證碼作為最基礎(chǔ)的形式,其相關(guān)研究能較容易應(yīng)用到其他類(lèi)型的驗(yàn)證碼中。
文本驗(yàn)證碼的來(lái)源存在爭(zhēng)議,2 個(gè)研究團(tuán)隊(duì)都聲稱發(fā)明了當(dāng)今互聯(lián)網(wǎng)廣泛使用的驗(yàn)證碼。以M.D.Lillibridge 為首的研究團(tuán)隊(duì)人員聲稱1997 年在AltaVista 上使用驗(yàn)證碼,防止機(jī)器人在其網(wǎng)絡(luò)搜索引擎中添加統(tǒng)一資源定位器(uniform resource locators,URLs)[8]。卡內(nèi)基梅隆大學(xué)的一個(gè)研究團(tuán)隊(duì)在2003 年發(fā)布的一篇論文也提出驗(yàn)證碼這一概念,隨后被學(xué)術(shù)界和工業(yè)界廣泛使用,并成為追捧的研究熱點(diǎn)[9]。Chellapilla 等[9]研究了早期文本驗(yàn)證碼的安全性,并且設(shè)計(jì)出了一種基于機(jī)器學(xué)習(xí)能破解驗(yàn)證碼的方法。為了增強(qiáng)文本驗(yàn)證碼的安全性,Yan 等[10]建議將驗(yàn)證碼字符擠在一起,由此提出了一種名為字符粘連(crowding characters together,CCT)的驗(yàn)證碼生成機(jī)制。除此之外,還有一些技術(shù)用于增強(qiáng)文本驗(yàn)證碼的安全性,比如噪聲弧、扭曲、旋轉(zhuǎn)、重疊、兩層結(jié)構(gòu)等。然而這些安全機(jī)制并不絕對(duì)安全,較容易被攻破[11-12]。文本驗(yàn)證碼的攻防就像矛與盾的問(wèn)題,針對(duì)文本驗(yàn)證碼的攻擊層出不窮,因此關(guān)于提升文本驗(yàn)證碼魯棒性的研究還在不斷深入。
驗(yàn)證碼數(shù)據(jù)采集系統(tǒng)針對(duì)特定互聯(lián)網(wǎng)目標(biāo)網(wǎng)站進(jìn)行采集,采集數(shù)據(jù)經(jīng)過(guò)預(yù)處理后入庫(kù),用以訓(xùn)練驗(yàn)證碼。
本系統(tǒng)采用典型的瀏覽器/服務(wù)器模式(browser/server,B/S)架構(gòu)來(lái)實(shí)現(xiàn),不同的客戶端程序通過(guò)IE/Chrome 瀏覽器共同訪問(wèn)Web 服務(wù)器的前端頁(yè)面,訪問(wèn)Redis 數(shù)據(jù)庫(kù)、MongoDB 數(shù)據(jù)庫(kù)、Mysql 數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行數(shù)據(jù)存取。系統(tǒng)結(jié)構(gòu)如圖1 所示。
圖1 系統(tǒng)結(jié)構(gòu)(B/S)
系統(tǒng)設(shè)計(jì)說(shuō)明如下:
1)每個(gè)客戶終端計(jì)算機(jī)都不需要額外安裝客戶程序,但是需要有瀏覽器支持。
2) Web 服務(wù)器訪問(wèn)各個(gè)數(shù)據(jù)庫(kù)集群,數(shù)據(jù)庫(kù)對(duì)外部不可見(jiàn)。
3)數(shù)據(jù)采集服務(wù)器訪問(wèn)各個(gè)目標(biāo)網(wǎng)站,獲取數(shù)據(jù)并寫(xiě)入Redis 和MongoDB 數(shù)據(jù)庫(kù)服務(wù)器,數(shù)據(jù)庫(kù)對(duì)外不可見(jiàn)。
4) MySQL 服務(wù)器用于存儲(chǔ)相對(duì)繁瑣仔細(xì)的業(yè)務(wù)代碼部分,數(shù)據(jù)庫(kù)對(duì)外不可見(jiàn)。MySQL 服務(wù)器在足夠硬件環(huán)境的支持下能夠適用,并且相對(duì)合理。
5)多用戶并發(fā)訪問(wèn)和處理、數(shù)據(jù)鎖和事務(wù)協(xié)調(diào)由數(shù)據(jù)庫(kù)和后端共同來(lái)完成,不設(shè)計(jì)單獨(dú)的事務(wù)處理服務(wù)器。
應(yīng)用程序的開(kāi)發(fā)設(shè)計(jì)采用Java 進(jìn)行實(shí)現(xiàn),前端通過(guò)JavaScript 設(shè)計(jì)并實(shí)現(xiàn),數(shù)據(jù)采集部分采用Python 實(shí)現(xiàn),所有的邏輯實(shí)現(xiàn)、算法和腳本在服務(wù)器端編譯開(kāi)發(fā)或解釋。系統(tǒng)規(guī)劃的結(jié)果如圖2 所示。
圖2 系統(tǒng)邏輯結(jié)構(gòu)
系統(tǒng)運(yùn)行控制將嚴(yán)格按照各模塊間函數(shù)調(diào)用關(guān)系來(lái)實(shí)現(xiàn)。在各事務(wù)中心模塊中,需對(duì)運(yùn)行控制進(jìn)行正確的判斷,選擇正確的運(yùn)行控制路徑。在網(wǎng)絡(luò)傳輸方面,客戶機(jī)在發(fā)送數(shù)據(jù)后,將等待服務(wù)器的確認(rèn)收到信號(hào),收到后,再次等待服務(wù)器發(fā)送回答數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行確認(rèn)。服務(wù)器在接到數(shù)據(jù)后發(fā)送確認(rèn)信號(hào),在對(duì)數(shù)據(jù)處理、訪問(wèn)數(shù)據(jù)庫(kù)后,將返回信息送回客戶機(jī),并等待確認(rèn)。運(yùn)行控制方法的具體模塊包括:
1)登錄模塊:前端模塊接收到賬號(hào)密碼登錄請(qǐng)求,對(duì)賬號(hào)密碼進(jìn)行加密,通過(guò)時(shí)間戳以及加鹽等方式進(jìn)行加密,傳輸?shù)胶蠖?,后端從redis 中獲取到相應(yīng)的隨機(jī)字串,進(jìn)行加密驗(yàn)證,若相同,則進(jìn)行允許登錄跳轉(zhuǎn)。
2)采集模塊:Java 后端守護(hù)進(jìn)程模塊告知Python 后端守護(hù)進(jìn)程模塊開(kāi)始進(jìn)行爬蟲(chóng),Python守護(hù)進(jìn)程調(diào)用Scrapy 模塊根據(jù)要求進(jìn)行爬蟲(chóng),并將數(shù)據(jù)寫(xiě)入MongoDB 和Redis 數(shù)據(jù)庫(kù)。
3)用戶信息管理模塊:前端模塊接受到用戶信息的修改要求,并把修改后的信息發(fā)送給Java 后端,Java 后端修改Mysql 數(shù)據(jù)庫(kù)中的用戶信息。
4)關(guān)鍵詞管理:前端模塊展示關(guān)鍵詞庫(kù)變更過(guò)程,Java 后端管理模塊通過(guò)調(diào)用Mysql 數(shù)據(jù)庫(kù)模塊從而獲取數(shù)據(jù)傳送給前端。
5)信息添加:前端模塊傳輸添加信息的內(nèi)容到Java 后端管理模塊,后端模塊通過(guò)json 拼接將數(shù)據(jù)寫(xiě)入MongoDB 數(shù)據(jù)庫(kù)模塊。
6)信息刪除:前端模塊傳輸相應(yīng)信息的關(guān)鍵密鑰到Java 后端管理模塊,控制MongoDB 數(shù)據(jù)庫(kù)模塊刪除相關(guān)信息。
7)信息修改:前端模塊傳輸修改后的信息到Java 后端管理模塊,控制MongoDB 數(shù)據(jù)庫(kù)模塊修改相關(guān)信息,并將更改后的信息通過(guò)后端返回給前端。
8)信息排序:前端模塊傳輸排序請(qǐng)求到Java 后端管理模塊,控制MongoDB 數(shù)據(jù)庫(kù)模塊修改相關(guān)信息,并將更改后的信息通過(guò)后端返回給前端。
9)采集開(kāi)關(guān):Java 后端守護(hù)進(jìn)程模塊作為客戶端,Python 后端守護(hù)進(jìn)程模塊作為服務(wù)端,通過(guò)多線程的方法創(chuàng)建多個(gè)客戶端實(shí)例,同時(shí)向多個(gè)Python 服務(wù)端發(fā)送請(qǐng)求。
對(duì)抗樣本源于計(jì)算機(jī)視覺(jué)領(lǐng)域,其主要的目的是產(chǎn)生圖像擾動(dòng)。最初由Kurakin 等[6]提出,并就擾動(dòng)的原理進(jìn)行了詳細(xì)的闡述。
根據(jù)攻擊者所能獲取的信息,攻擊可分為白盒攻擊和黑盒攻擊。在白盒攻擊情境中,攻擊者能獲取目標(biāo)神經(jīng)網(wǎng)絡(luò)的所有信息,包括網(wǎng)絡(luò)的參數(shù)和架構(gòu)、梯度以及數(shù)據(jù)集等;攻擊者利用這些先驗(yàn)信息構(gòu)造對(duì)抗樣本[3,6-7,13]。在黑盒攻擊的情境中,攻擊者無(wú)法獲取神經(jīng)網(wǎng)絡(luò)模型的內(nèi)部信息以及訓(xùn)練集的分布,只能啟用替代模型,這個(gè)替代模型首先隨機(jī)生成樣本輸入到判別模型中,獲取對(duì)應(yīng)的輸出,并觀察輸入和輸出的關(guān)系,試圖讓替代模型找到與判別模型幾乎一樣的決策邊界,并通過(guò)不斷地迭代合成對(duì)抗樣本,最終成功地讓深度神經(jīng)網(wǎng)絡(luò)(deep neural networks,DNN)分類(lèi)器錯(cuò)分了84.24%的對(duì)抗樣本,讓Logistic 回歸分類(lèi)器錯(cuò)分了96.19%的對(duì)抗樣本[14]。
由于白盒攻擊獲得的先驗(yàn)信息較多,這意味著攻擊者能獲取到明確的目標(biāo)函數(shù),生成模型能更加高效地制造出對(duì)抗樣本。而黑盒攻擊過(guò)程中,最初只能隨機(jī)生成樣本,輸入到判別模型中,此時(shí)的判別模型基本上是個(gè)黑匣子,攻擊者只能構(gòu)造一個(gè)替代模型,通過(guò)觀察輸入和輸出的關(guān)系,試圖讓替代模型的決策邊界無(wú)限接近判別模型的決策邊界,由此合成出對(duì)抗樣本。因此,綜上所述,白盒攻擊的成功率自然會(huì)比黑盒攻擊高。
本文旨在實(shí)現(xiàn)針對(duì)文本驗(yàn)證碼生成對(duì)抗樣本。由于白盒攻擊的成功率較高,因此選取了2 種經(jīng)典的白盒攻擊算法作為基準(zhǔn)測(cè)試組,包括快速梯度符號(hào)法(fast gradient sign method,F(xiàn)GSM)和基礎(chǔ)迭代法(basic iterative method,BIM),并將以上2 種經(jīng)典方法與空間轉(zhuǎn)換(spatially transformed Adversarial,stAdv)算法進(jìn)行對(duì)比。
Kurakin 等[6]提出了一種名為FGSM 的生成對(duì)抗樣本的方法,這種方法簡(jiǎn)單易行,只需要攻擊一次就可達(dá)成無(wú)目標(biāo)攻擊的效果。該方法能很自然地遷移到文本對(duì)抗驗(yàn)證碼生成的任務(wù)中,公式為
式中:參數(shù) ε為擾動(dòng)的程度,LF,label(x)為用來(lái)訓(xùn)練模型的損失函數(shù)。除此之外,式(1)隱含滿足以下條件:xadv與x之間的距離 ε應(yīng)該設(shè)置比較小的數(shù)值,否則對(duì)圖像的擾動(dòng)就很容易被識(shí)破。
Kurakin 等[6]提出了基于FSGM 提出多次迭代的FSGM 的改良方法(即BIM),這種方法的思想是將FGSM 算法以較小的步長(zhǎng)運(yùn)行多次,并且在每步之后對(duì)像素值的中間結(jié)果進(jìn)行裁剪,以確保它們?cè)谠紙D像的 ε值域內(nèi)。其核心公式為
式(2)與式(1)最大的區(qū)別在于,前者較后者增加了Clip 函數(shù),該函數(shù)是像素值裁剪函數(shù),確保擾動(dòng)后的像素值在-1~1。
在實(shí)際部署時(shí),我們對(duì)原有代碼做了如下修改,以適應(yīng)文本驗(yàn)證碼的圖片。x(h,w,c)函數(shù)確保擾動(dòng)后的像素值x′(h,w,c)在[x(h,w,c)-ε,x(h,w,c)+ε],同時(shí)不能超過(guò)上界+1 或下界-1。其中,x(h,w,c)表示驗(yàn)證碼圖片x在通道c位置(h,w)處的像素值,x′(h,w,c)表示在此處擾動(dòng)后的像素值;步長(zhǎng) η通常設(shè)置為一個(gè)較小的值(η ≤ε),通過(guò)將最大迭代次數(shù)i設(shè)置為一個(gè)合理的值,使得擾動(dòng)后的像素值能抵達(dá)擾動(dòng)邊界x(h,w,c)-ε 和x(h,w,c)+ε之間。
基準(zhǔn)測(cè)試中生成對(duì)抗文本驗(yàn)證碼的算法都采用直接修改原始圖片像素值的方式,因此較容易受到圖片預(yù)處理技術(shù)的影響[7]。因此,本文試圖找到一種不易受到預(yù)處理技術(shù)影響的生成對(duì)抗樣本的算法。通過(guò)文獻(xiàn)[7]發(fā)現(xiàn),spatially transformed的優(yōu)化方法較適合我們的應(yīng)用場(chǎng)景。因此我們基于spatially transformed 的優(yōu)化方法(StAdv)進(jìn)行改進(jìn),并稱其為改進(jìn)型StAdv,從而能一定程度上緩解以上提及的預(yù)處理的影響問(wèn)題。
基于傳統(tǒng)StAdv 優(yōu)化方法做了如下2 點(diǎn)改進(jìn):1)引入了一個(gè)整數(shù)型變量T作為衡量干擾程度的變量,其取值在0~n-1,其值越小干擾程度越大。若T被設(shè)置為0,則驗(yàn)證碼圖像經(jīng)過(guò)空間變換后,將被分類(lèi)器預(yù)測(cè)為最不可能的結(jié)果,圖像的前后變化差異也會(huì)較大;若T被設(shè)置為n-1,則不會(huì)對(duì)分類(lèi)器造成任何干擾。2)為了優(yōu)化生成算法的速度以適應(yīng)本文的應(yīng)用場(chǎng)景,我們并沒(méi)有使用原文的L-BFGS 優(yōu)化器,而使用Adam 優(yōu)化器最小化目標(biāo)函數(shù)。改進(jìn)型StAdv 生成算法的偽代碼如下。
代碼中,x為原始的文本驗(yàn)證碼圖像;C為預(yù)先訓(xùn)練的CNN 分類(lèi)模型;Z為模型最后一層的輸出;ytrue為驗(yàn)證碼圖像的真實(shí)標(biāo)簽;i為最大迭代次數(shù);τ為平衡系數(shù),用以平衡Ladv和Lflow;k為驗(yàn)證碼圖像被誤分類(lèi)為其他類(lèi)別的置信度;lr和T分別是學(xué)習(xí)率和干擾程度。
為比較不同圖像加擾算法的效果,使用LeNet、ResNet、DenseNet、Wide ResNet 等4 種典型的卷積神經(jīng)網(wǎng)絡(luò)模型作為入侵學(xué)習(xí)模型,構(gòu)造用戶身份驗(yàn)證圖像[15]。此外,使用FGSM、BIM、DeepFool、JSMA 等4 種圖像擾動(dòng)算法作為本文所提改進(jìn)StAdv算法的對(duì)比算法,對(duì)上述圖像擾動(dòng)算法的反入侵能力進(jìn)行比較。仿真實(shí)驗(yàn)采用常用目標(biāo)網(wǎng)站的驗(yàn)證碼圖像數(shù)據(jù)集(詳見(jiàn)圖3),隨機(jī)選擇100 000 張圖像作為訓(xùn)練集,20 000 張圖像作為測(cè)試驗(yàn)證集,實(shí)驗(yàn)完成基于該數(shù)據(jù)集的圖像識(shí)別任務(wù)。
圖3 驗(yàn)證碼圖像集
如圖4 所示,在無(wú)圖像干擾時(shí),非法入侵者通過(guò)使用LeNet、ResNet、DenseNet、Wide ResNet 等典型模型構(gòu)造驗(yàn)證圖像時(shí),系統(tǒng)認(rèn)證的通過(guò)率分別可達(dá)到87.3%、90.2%、91.1%和90.1%。
圖4 不同圖像加擾算法對(duì)應(yīng)的干擾效果
作為本文所提改進(jìn)StAdv 算法的對(duì)比算法,實(shí)驗(yàn)中考慮使用FGSM、BIM、DeepFool、JSMA等圖像擾動(dòng)算法。對(duì)比結(jié)果顯示,F(xiàn)GSM 算法可以將入侵模型所偽造圖像的認(rèn)證通過(guò)率降低至30%~40%;BIM、DeepFool、JSMA 等算法在防御入侵模型時(shí)不太穩(wěn)定,構(gòu)造圖像的認(rèn)證通過(guò)率在20%~70%浮動(dòng);本文所提StAdv 算法可以將入侵模型構(gòu)造圖像的認(rèn)證通過(guò)率下降至20%以下。因此,基于StAdv 圖像擾動(dòng)算法的入侵防御模型,其干擾效果和健壯性明顯優(yōu)于其他4 種擾動(dòng)算法。
本文研究基于文本驗(yàn)證碼圖片的對(duì)抗擾動(dòng)方法,以提升反爬模型的健壯性和可用性。為比較不同圖像加擾算法的效果,使用LeNet、ResNet、DenseNet、Wide ResNet 等4 種典型的卷積神經(jīng)網(wǎng)絡(luò)模型作為入侵學(xué)習(xí)模型,構(gòu)造用戶身份驗(yàn)證圖像。此外,使用FGSM、BIM、DeepFool、JSMA 等4 種圖像擾動(dòng)算法作為所提改進(jìn)StAdv 算法的對(duì)比算法,對(duì)上述圖像擾動(dòng)算法的反入侵能力進(jìn)行比較。結(jié)果表明,基于StAdv 圖像擾動(dòng)算法的入侵防御模型,其干擾效果和健壯性明顯優(yōu)于其他4 種擾動(dòng)算法。