文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2015)05-0119-04
0 引言
RFID通過將體積較小的RFID標(biāo)簽置入物體中,從而實(shí)現(xiàn)目標(biāo)物體的自動識別。目前RFID已廣泛應(yīng)用于供應(yīng)鏈等系統(tǒng)中,改善了供應(yīng)鏈的時(shí)間效率與成本[1-2]。但隨著RFID在商業(yè)生產(chǎn)與物流中的廣泛使用,其安全性成為重要問題。目前有許多針對RFID系統(tǒng)安全問題的研究,其中RFID標(biāo)簽中軟件的漏洞問題是RFID系統(tǒng)與生俱來的安全問題,而SQL注入攻擊[3]是其中一個(gè)易受攻擊的關(guān)鍵點(diǎn)。
本文對此提出一種RFID系統(tǒng)中SQL注入攻擊(SQLIA)的檢測與防御方案。對RFID標(biāo)簽數(shù)據(jù)以及SQL請求進(jìn)行兩階段的檢查:(1)基本數(shù)據(jù)格式與內(nèi)容的檢查;(2)中間件中SQL請求的邏輯檢查。試驗(yàn)表明本方案取得了較好的SQLIA的防御效果,對多種主流攻擊形式均具有免疫能力,同時(shí),具有較高的計(jì)算效率及較好的實(shí)用價(jià)值。
1 RFID安全問題介紹
圖1所示為典型RFID系統(tǒng),其包含常見的后端組件(數(shù)據(jù)庫、中間件和具體應(yīng)用)與RFID前端組件(RFID標(biāo)簽與閱讀器)。當(dāng)前,大多數(shù)數(shù)據(jù)庫使用SQL語句操作數(shù)據(jù)庫,而對于RFID系統(tǒng),通常由中間件根據(jù)標(biāo)簽中的數(shù)據(jù)自動生成相應(yīng)的SQL語句。生成的SQL語句一般可直接操作數(shù)據(jù)庫的所有數(shù)據(jù),因此,具有較大的安全隱患。
圖1中的虛線部分為SQL注入攻擊的常見方法示意圖,SQL攻擊通常將惡意SQL請求代碼嵌入正常SQL請求來實(shí)現(xiàn)攻擊。RFID系統(tǒng)中,若存在攻擊者,攻擊者可將惡意數(shù)據(jù)存入RFID標(biāo)簽(可物理侵入或軟件侵入),更甚者,攻擊者直接模擬產(chǎn)生新的RFID攻擊標(biāo)簽(其中包含攻擊數(shù)據(jù)),并使該標(biāo)簽可被讀卡器識別并閱讀。中間件將惡意數(shù)據(jù)轉(zhuǎn)換成惡意SQL語句并轉(zhuǎn)發(fā)至數(shù)據(jù)庫,從而破壞數(shù)據(jù)庫。
2 SQL注入攻擊的檢測與防御方案
RFID網(wǎng)絡(luò)系統(tǒng)具有3個(gè)天然屬性:
(1)RFID標(biāo)簽中的數(shù)據(jù)具有嚴(yán)格的格式與結(jié)構(gòu),且整個(gè)系統(tǒng)中僅中間件模塊生成SQL語句。
(2)RFID網(wǎng)絡(luò)對SQL請求的格式進(jìn)行規(guī)范與限制。
(3)RFID標(biāo)簽采集數(shù)據(jù)的吞吐量較大。
圖2為SQL注入攻擊的檢測與防御方案總體結(jié)構(gòu)。該方案包含2個(gè)階段:(1)規(guī)則建立階段:該階段為不同應(yīng)用系統(tǒng)建立合適的數(shù)據(jù)檢查的規(guī)則;(2)檢測與防御階段:嚴(yán)格執(zhí)行第1階段建立的規(guī)則。
2.1 規(guī)則建立
SQLIA的根本原因是對輸入數(shù)據(jù)的驗(yàn)證不足,導(dǎo)致攻擊數(shù)據(jù)對數(shù)據(jù)庫進(jìn)行非法操作,因此,檢查RFID標(biāo)簽所采集的數(shù)據(jù)至關(guān)重要。其中,數(shù)據(jù)檢查包括數(shù)據(jù)的格式與內(nèi)容的雙重檢查。
2.1.1 數(shù)據(jù)格式與內(nèi)容檢查規(guī)則的建立
當(dāng)RFID標(biāo)簽存儲數(shù)據(jù)時(shí),建立數(shù)據(jù)格式與內(nèi)容檢查規(guī)則。本文假設(shè)SQL的關(guān)鍵字與操作符不會出現(xiàn)在正常RFID標(biāo)簽數(shù)據(jù)中。
格式驗(yàn)證與內(nèi)容檢查的規(guī)則創(chuàng)建方案如圖3所示。RFID標(biāo)簽中數(shù)據(jù)通常具有嚴(yán)格的結(jié)構(gòu),一般為一個(gè)連續(xù)的數(shù)據(jù)塊,將標(biāo)簽中數(shù)據(jù)的各數(shù)據(jù)域表示為集合形式F={F1,F(xiàn)2,…,F(xiàn)n}。在標(biāo)簽存儲數(shù)據(jù)時(shí),為每個(gè)數(shù)據(jù)域Fi∈F分配一個(gè)唯一的UID,并以一定的格式存儲相應(yīng)的數(shù)據(jù)區(qū)域內(nèi)容、區(qū)域特征和區(qū)域UID(標(biāo)記數(shù)據(jù)區(qū)域),并轉(zhuǎn)發(fā)至中間件。
之后,為每個(gè)數(shù)據(jù)域建立內(nèi)容檢查的規(guī)則。內(nèi)容檢查主要有2個(gè)要求:(1)數(shù)據(jù)必須無特殊字符(即SQL語句中缺省符號,如.,=,*,;);(2)無非法關(guān)鍵字、口令或函數(shù)名(此處的關(guān)鍵字和口令定義為數(shù)據(jù)庫管理系統(tǒng)或其他軟件中的關(guān)鍵字)。
2.1.2 SQL請求規(guī)則建立
該步驟位于動態(tài)建立SQL語句的程序中(中間件)。對于每個(gè)SQL語句,通過如下步驟對其結(jié)構(gòu)進(jìn)行識別:
(1)識別所有動態(tài)產(chǎn)生的SQL語句:對中間件創(chuàng)建的所有SQL請求均需進(jìn)行識別操作。
(2)對成功識別的SQL請求進(jìn)行標(biāo)記:對于成功識別的請求,為其分配給定的唯一標(biāo)示符。
(3)定義請求語法:為每個(gè)成功識別的請求抽象其語法結(jié)構(gòu),并將其語法加入合法請求列表中。
(4)存儲成功標(biāo)記的請求:若成功識別SQL請求,則標(biāo)記該請求。
與Web網(wǎng)絡(luò)系統(tǒng)相比,RFID系統(tǒng)的SQL請求相對簡單。
2.1.3 自動建立SQL請求與SQL語句的合法性檢查
檢查數(shù)據(jù)的格式與內(nèi)容是SQLIA最簡單有效的防御方案,但很多攻擊方式可避開以上數(shù)據(jù)檢查[4],例如通過使用替代編碼機(jī)制或較復(fù)雜的SQLIA,攻擊者可避開數(shù)據(jù)檢查機(jī)制。針對此類攻擊方案,本文提出相應(yīng)的增強(qiáng)方案,即檢查生成的SQL語句結(jié)構(gòu)。
將SQL語句分為不同部分,將用戶數(shù)據(jù)相關(guān)的部分刪除,僅保留SQL語句結(jié)構(gòu)的部分(SQL口令)。將SQL口令分為5種類型:關(guān)鍵字、操作符、標(biāo)示符、符號、注釋。
(1)關(guān)鍵字:DBMS中缺省使用的標(biāo)示符(“SELECT”、“FROM”、“AVG()”等)。
(2)操作符:DBMS中具有特殊意義的符號(+,=等)。
(3)標(biāo)示符:數(shù)據(jù)庫中出現(xiàn)的特殊名字(表名、列名或變量)。
(4)數(shù)據(jù):存入數(shù)據(jù)庫中出現(xiàn)相應(yīng)項(xiàng)的數(shù)據(jù)(如23.56、12/07/1988)。
(5)注釋:對數(shù)據(jù)庫無意義的內(nèi)容。
前3種口令對于SQL請求的邏輯與結(jié)構(gòu)至關(guān)重要。第3種口令為用戶輸入內(nèi)容,第5種則由編程者輸入。下面為一個(gè)SQL請求的示例:
INSERT INTO product(tag_id, product_name)
VALUES(‘tagid’,‘productname’);
其中,‘tagid’和‘productname’是從RFID標(biāo)簽中獲得的字串內(nèi)容。對該語句各部分的口令進(jìn)行分類:
“INSERT INTO”與“VALUES”為“關(guān)鍵字”;“product”、“tag_id”與“product_name”為“表示符”;“tagid”與“productname”為“數(shù)據(jù)”。將“數(shù)據(jù)”部分用“?”代替,可得:
INSERT INTO product(tag_id, product_name) VALUES(?,?);
本方案通過檢查SQL語句的前3種口令是否合法來保證SQL語句的合法性與安全性。
2.2 SQLIA檢測與防御階段(執(zhí)行)
系統(tǒng)運(yùn)行時(shí),首先讀取標(biāo)簽中數(shù)據(jù),然后對數(shù)據(jù)進(jìn)行格式與內(nèi)容的檢查。從RFID標(biāo)簽中獲得的數(shù)據(jù)為一連續(xù)數(shù)據(jù)塊。因此,首先中間件必須識別數(shù)據(jù)塊中每個(gè)獨(dú)立的域(表示為tdi,其中i=1,2,…,n);然后為每個(gè)數(shù)據(jù)域分配標(biāo)示符(i),后面利用該標(biāo)示符從已驗(yàn)證的數(shù)據(jù)中提取其驗(yàn)證數(shù)據(jù)(tdi FF);提取每個(gè)數(shù)據(jù)域的特征值(tdivj)(如最大長度、最小長度、數(shù)據(jù)類型等);最終,其特征值必須與驗(yàn)證數(shù)據(jù)(tdiffj)匹配,如果匹配則驗(yàn)證通過,反之,將該RFID標(biāo)簽標(biāo)記為危險(xiǎn)標(biāo)簽。
(1)算法1:采集數(shù)據(jù)的格式與內(nèi)容檢測
然后進(jìn)行數(shù)據(jù)內(nèi)容檢查,具體方法為:獲得已驗(yàn)證數(shù)據(jù)(tdiFF(i=1,2,…,n)),并獲得對應(yīng)合法關(guān)鍵字tdiK,然后分析tdi,觀察數(shù)據(jù)中是否包含非法內(nèi)容。如果無非法內(nèi)容,則檢查通過;反之,忽略該請求。
(2)算法2為SQL請求合法性檢測偽代碼。SQLIA向RFID標(biāo)簽注入附加的代碼,因此,成功的注入攻擊將導(dǎo)致SQL請求的總結(jié)構(gòu)與合法請求的結(jié)構(gòu)有所差異。本算法可動態(tài)產(chǎn)生請求,并同時(shí)防止非法請求的執(zhí)行。
算法2:請求結(jié)構(gòu)驗(yàn)證
該算法接收動態(tài)產(chǎn)生的SQL請求(GQ)和對應(yīng)的ID產(chǎn)生驗(yàn)證后的請求。當(dāng)收到請求時(shí),調(diào)用DBMS請求分析函數(shù)(QueryParser)對GQ進(jìn)行分析,使用GQp產(chǎn)生實(shí)際的請求結(jié)構(gòu)(QSa),然后利用ID來獲得相應(yīng)的合法請求結(jié)構(gòu)QSl,最終將QSl與QSa比較。如果兩者不匹配,則拒絕該請求,反之,則執(zhí)行該請求。
與其他SQL請求匹配技術(shù)相比本算法有以下優(yōu)勢:(1)本算法僅進(jìn)行字串的比較,其他算法有些比較XML等文檔內(nèi)容,因此本算法實(shí)現(xiàn)較簡單;(2)字串的比較計(jì)算開銷較低。對于RFID系統(tǒng),通常RFID標(biāo)簽數(shù)量眾多,而且采集的數(shù)據(jù)也極多,如果計(jì)算開銷較大將不適合實(shí)際應(yīng)用。
3 數(shù)值試驗(yàn)結(jié)果與分析
試驗(yàn)主要測試SQL請求識別的2個(gè)關(guān)鍵性能:
(1)未成功檢測的SQLIA的百分比;
(2)錯(cuò)誤檢測的SQLIA的百分比(將正確SQL檢測為SQLIA)。
試驗(yàn)中采用3種類型的SQL語句(RFID系統(tǒng)主要的請求類型):SELECT、UPDATE、INSERT。為此,分別選取大量不同的請求,且復(fù)雜程度均不同。
文獻(xiàn)[5]對不同數(shù)據(jù)庫(MySQL、Postgres、Oracles、SQL Server)均進(jìn)行了試驗(yàn),并獲得了較理想的效果。本試驗(yàn)采用文獻(xiàn)[5]的試驗(yàn)環(huán)境,對多個(gè)數(shù)據(jù)庫進(jìn)行試驗(yàn)。
3.1 攻擊請求檢測
試驗(yàn)共選取500個(gè)不同請求,對其中170個(gè)請求作處理將其變?yōu)楣粽埱?。?所示為170個(gè)正常請求:68個(gè)“select”型請求、61個(gè)“update”型請求、41個(gè)“insert”型請求。分別采用重言式攻擊、聯(lián)合查詢注入攻擊、后置貪心攻擊、編碼變換攻擊與注釋請求攻擊對上述3種請求進(jìn)行處理,獲得170個(gè)攻擊請求。分別設(shè)置攻擊請求所占百分比(5%、10%、15%…、35%)作分組試驗(yàn)(每組試驗(yàn)共執(zhí)行500次請求)。
試驗(yàn)結(jié)果如圖4所示,本算法成功識別所有攻擊請求。因本算法具有兩階段嚴(yán)格檢查,所以成功防御所有類型的注入攻擊。雖然其他部分算法也獲得了較高的成功率,但本算法的計(jì)算效率更高。
3.2 本算法的計(jì)算開銷
對于RFID的高吞吐量特性,安全檢測的效率是一個(gè)關(guān)鍵參數(shù)。將本算法與無安全檢測的方案進(jìn)行對比試驗(yàn),比較兩種算法的CPU執(zhí)行時(shí)間。試驗(yàn)中,兩個(gè)試驗(yàn)均執(zhí)行10 000個(gè)請求,每組試驗(yàn)運(yùn)行20次取平均值。
圖5所示為試驗(yàn)結(jié)果,可看出本算法的開銷極小,原因在于本算法僅對數(shù)據(jù)進(jìn)行檢查,計(jì)算復(fù)雜度極低。因此本算法適合RFID高吞吐量的應(yīng)用場景。
4 小結(jié)
隨著RFID系統(tǒng)的廣泛應(yīng)用,其安全性問題日益重要,本文對此提出一種基于兩階段的防御方案,即對采集數(shù)據(jù)的格式與內(nèi)容進(jìn)行檢查;對動態(tài)生成的SQL請求進(jìn)行格式與內(nèi)容的檢查。由于本方案均對數(shù)據(jù)(字符串)進(jìn)行處理,因此具有較好的計(jì)算效率,適用于大規(guī)模、高吞吐量的RFID系統(tǒng)。
參考文獻(xiàn)
[1] 蔣浩,高春華,張林,等.一種基于RFID的室內(nèi)車載監(jiān)控系統(tǒng)定位方法的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)科學(xué),2012,39(2):29-33.
[2] 陳宇錚,湯仲喆,倪云峰,等.基于RFID的冷鏈物流監(jiān)測系統(tǒng)的設(shè)計(jì)[J].計(jì)算機(jī)應(yīng)用與軟件,2013,30(2):263-265.
[3] 李雪,唐文,張華.一種新的Web應(yīng)用防火墻的自學(xué)習(xí)模型[J].小型微型計(jì)算機(jī)系統(tǒng),2014(3):.
[4] HALFOND W G J,ORSO A.AMNESIA:analysis and monitoring for NEutralizing SQL-injection attacks[C].Proceedings of the 20th IEEE/ACM international Conference on Automated Software Engineering.ACM,2005:174-183.
[5] RIEBACK M R,SIMPSON P N D,CRISPO B,et al.RFID malware:design principles and examples[J].Pervasive and Mobile Computing,2006,2(4):405-426.