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