趙琳娜,倪 明,喻衛(wèi)東
(華東計算技術(shù)研究所,上海 201808)
隨著組織機構(gòu)開展的互聯(lián)網(wǎng)業(yè)務(wù)日益增多,由于大量已知和未知的漏洞及后門的存在,面臨的安全隱患不容小覷.數(shù)據(jù)庫作為Web 應(yīng)用的核心組成部分,存有網(wǎng)站動態(tài)資源和用戶信息,最易受到攻擊.當數(shù)據(jù)庫被惡意攻擊成功后,會導(dǎo)致用戶信息泄露、內(nèi)容被篡改等不良后果.除此之外,攻擊者利用漏洞完成一次數(shù)據(jù)攻擊所需要的時間極短,給管理員及時發(fā)現(xiàn)數(shù)據(jù)庫入侵并補救的工作帶來了極大困難.
傳統(tǒng)數(shù)據(jù)庫的防御手段是基于威脅特征感知的精確防御,需要攻擊行為的特征等先驗知識才能有效實施防御,具有靜態(tài)、透明、缺乏多樣性等缺陷.擬態(tài)防御動態(tài)異構(gòu)冗余架構(gòu)利用漏洞的平臺相關(guān)性,在期望功能等價條件下,擬態(tài)界內(nèi)的執(zhí)行體具有處理結(jié)構(gòu)的相異性和冗余性,對“已知的未知”風險或“未知的未知”威脅具有內(nèi)生防御效果[1].
本文依托擬態(tài)防御的動態(tài)異構(gòu)冗余原理,提出擬態(tài)數(shù)據(jù)庫模型,通過保留字擬態(tài)化模塊、指紋過濾模塊和擬態(tài)化中間件模塊分別實現(xiàn)注入指令的異構(gòu)化、去指紋化和基于相似性判決的選擇性執(zhí)行,具有內(nèi)生安全性.
根據(jù)世界著名的Web 安全與數(shù)據(jù)庫安全研究組織OWASP 發(fā)布的十大最關(guān)鍵的Web 應(yīng)用安全風險(OWASP Top 10),與數(shù)據(jù)庫安全密切相關(guān)的SQL 注入攻擊(SQL Injection)在2013年和2017年均被列為威脅最嚴重的攻擊方式[2].攻擊者通過利用客戶端任何能夠提交信息與數(shù)據(jù)庫進行交互的地方作為注入點,提交重構(gòu)的SQL 命令,欺騙數(shù)據(jù)庫執(zhí)行,并針對服務(wù)器端返回的結(jié)果進行分析,竊取數(shù)據(jù)庫內(nèi)的關(guān)鍵信息、惡意篡改數(shù)據(jù)和控制服務(wù)器.
基于SQL 注入攻擊的原理,當前防御方法大多從代碼層面和平臺層面入手[3],代碼層面的防御方法主要是在需要提交數(shù)據(jù)的頁面設(shè)置規(guī)范的SQL 語句格式,對用戶提交的信息進行過濾,保證用戶提交的信息不會對SQL 查詢語句造成歧義,如參數(shù)化查詢、參數(shù)過濾、存儲過程等;平臺層面的防御方法主要是利用URL 重置技術(shù),將含有注入點的網(wǎng)址屏蔽起來,如URL 重定向技術(shù)等.除此以外,還配合使用設(shè)置有限的訪問權(quán)限、預(yù)編譯、加強日常監(jiān)督與檢測等手段.
參數(shù)化查詢(parameterized query)指在設(shè)計與數(shù)據(jù)庫鏈接并訪問數(shù)據(jù)時,在需要填入數(shù)值或數(shù)據(jù)的地方,采用參數(shù)傳遞值,避免直接賦值.數(shù)據(jù)庫系統(tǒng)把參數(shù)值應(yīng)用到查詢計劃中,執(zhí)行查詢結(jié)果,若改變參數(shù)值再執(zhí)行,則得到不同的查詢結(jié)果,但SQL 語句不需要重構(gòu)提交,也不需要再次生成查詢計劃,參數(shù)值的變化影響不了查詢計劃[4].
使用參數(shù)化查詢技術(shù),數(shù)據(jù)庫服務(wù)器不會將參數(shù)的內(nèi)容視為SQL 指令的組成部分來處理,在一定程度上避免了數(shù)據(jù)庫編譯運行參數(shù)中含有惡意指令的情況.
參數(shù)過濾分為對參數(shù)類型或長度的限制和對危險字符的過濾/轉(zhuǎn)義.
針對特定的、功能單一的參數(shù)提交接口,盡可能詳細地限制允許用戶輸入的參數(shù)類型及長度.當參數(shù)類型必須包含字符或長度無法直接控制時,通過在后臺代碼中設(shè)置黑/白名單等過濾規(guī)則,將參數(shù)中的非法字符轉(zhuǎn)義為合法字符提交或不予執(zhí)行,對參數(shù)中的敏感信息進行檢測及過濾/轉(zhuǎn)義,避免非法字符被系統(tǒng)重構(gòu)為查詢語句導(dǎo)致SQL 注入.
存儲過程存儲在數(shù)據(jù)庫系統(tǒng)內(nèi)部,是一組完成特定功能的SQL 語句集.Web 應(yīng)用程序通過調(diào)用存儲過程事先構(gòu)建好的SQL 查詢語句代碼來執(zhí)行相應(yīng)操作.
存儲過程在使用時起到3 點安全作用:首先,存儲過程在執(zhí)行前要進行預(yù)編譯,編譯出錯不予執(zhí)行;其次,對于數(shù)據(jù)的授權(quán)訪問是基于存儲過程而不是直接訪問基本表,攻擊者無法探測到Select 語句;最后,存儲過程可以指定和驗證用戶提交的參數(shù)類型[5].
URL 重置是將提交至服務(wù)器的Web 程序截取下來,自動將請求重新定位到其他URL 地址的過程.目前可以通過兩種方式實現(xiàn)URL 重置(以ISAPI 篩選器為例)[3]:
1)使用ISAPI 篩選器在IIS Web 服務(wù)器級別實現(xiàn)URL 重寫;
2)使用HTTP 模塊或HTTP 處理程序在ASP.NET環(huán)境實現(xiàn)URL 重寫.
微軟的IIS 中包含有ISAPI_Rwrite 的URL 重定向組件,提供基于正則表達式的網(wǎng)址重寫引擎,對并不存在的URL 請求重寫[6].通過對Rewrite 組件的應(yīng)用,實現(xiàn)對含有非法參數(shù)的URL 進行重定向.
在已知現(xiàn)有SQL 注入攻擊方法的特征下進行針對性防御的傳統(tǒng)防御手段仍然存在缺陷,如參數(shù)化查詢及參數(shù)過濾在某些情況下應(yīng)用場景單一,并且在過濾規(guī)則設(shè)置不完善的情況下仍可以被攻擊者繞過進而成功實現(xiàn)SQL 注入;存儲過程并不支持所有的數(shù)據(jù)庫平臺,如果存儲過程中執(zhí)行的命令是拼接字符串,則仍然存在被注入攻擊的隱患;URL 重置技術(shù)在利用ISAPI 篩選器實現(xiàn)時對平臺有一定的局限性,只適用于Windows 系列操作系統(tǒng)的服務(wù)器.
現(xiàn)有數(shù)據(jù)庫防御手段是在已知攻擊特征等先驗知識的前提條件下才能實施有效防御,但在安全領(lǐng)域仍然存在大量未知風險.針對現(xiàn)有數(shù)據(jù)庫防御手段的靜態(tài)性和確定性,本文基于擬態(tài)防御的動態(tài)異構(gòu)冗余原理,提出具有內(nèi)生安全性的擬態(tài)數(shù)據(jù)庫模型.該模型通過保留字擬態(tài)化模塊完成SQL 保留字指紋特征的差異化描述,調(diào)用指紋過濾模塊對SQL 注入指令進行去指紋處理,使用擬態(tài)化中間件對來自不同執(zhí)行體的SQL 注入指令進行在線相似性判決.
擬態(tài)數(shù)據(jù)庫模型在傳統(tǒng)數(shù)據(jù)庫系統(tǒng)的基礎(chǔ)上,新增保留字擬態(tài)化模塊、指紋過濾模塊和擬態(tài)化中間件模塊對客戶端輸入的合法或非法的SQL 指令進行判決及處理.結(jié)構(gòu)如圖1所示.
圖1 擬態(tài)數(shù)據(jù)庫模型結(jié)構(gòu)
由圖1可知,在擬態(tài)數(shù)據(jù)庫模型中,保留字擬態(tài)化模塊先對運行在各執(zhí)行體上的Web 應(yīng)用源碼進行SQL保留字的指紋差異化描述;當用戶從網(wǎng)站客戶端發(fā)起合法的SQL 任務(wù)時,SQL 保留字經(jīng)過指紋過濾模塊的去指紋化處理后傳入擬態(tài)化中間件模塊進行表決,底層數(shù)據(jù)庫執(zhí)行經(jīng)過表決的SQL 語句后返回執(zhí)行結(jié)果;當用戶從網(wǎng)站客戶端發(fā)起惡意SQL 任務(wù)時,由于未經(jīng)過保留字擬態(tài)化模塊的指紋差異化描述,所以傳入的未帶有指紋特征的SQL 指令不會被執(zhí)行;若攻擊者獲取到少數(shù)執(zhí)行體的中保留字的指紋特征,偽造經(jīng)過指紋化處理的SQL 指令,發(fā)起惡意SQL 任務(wù),此時不管是從網(wǎng)站客戶端還是從受攻擊的執(zhí)行體上傳SQL 任務(wù),在經(jīng)過擬態(tài)化中間件時,由于和其他執(zhí)行體上的SQL 保留字的指紋特征不同,因此偽造的SQL 指令只會加入到受攻擊執(zhí)行體的對應(yīng)判決隊列,而此時其他執(zhí)行體的對應(yīng)判決隊列為空,根據(jù)少數(shù)服從多數(shù)的判決原則,偽造的惡意SQL 語句并不會通過相似性判決繼續(xù)向下執(zhí)行.
保留字是有特定語義的單詞或字符串,是數(shù)據(jù)庫識別指令的方法,在客戶端通過SQL 語言操作數(shù)據(jù)庫時,所使用的SQL 指令即屬于SQL 保留字.
在未使用保留字擬態(tài)化模塊時,運行在各執(zhí)行體上Web 應(yīng)用中的數(shù)據(jù)庫訪問SQL 保留字是同構(gòu)的.保留字擬態(tài)化模塊基于擬態(tài)防御中各執(zhí)行體異構(gòu)冗余的原理,通過對運行在各執(zhí)行體上Web 應(yīng)用中的SQL 保留字進行指紋特征差異化描述,實現(xiàn)Web 應(yīng)用在各擬態(tài)執(zhí)行體上SQL 保留字異構(gòu)化,防止惡意注入的SQL 保留字被后續(xù)模塊執(zhí)行.SQL 保留字擬態(tài)化模塊的工作原理如圖2所示.
圖2 保留字擬態(tài)化模塊工作原理
保留字擬態(tài)化模塊輸出的來自不同執(zhí)行體的數(shù)據(jù)庫訪問SQL 保留字帶有不同的指紋特征,并不是可以被正常識別并執(zhí)行的SQL 指令,為保證指令能夠在后續(xù)擬態(tài)化模塊中的可用性,引入指紋過濾模塊.
指紋過濾模塊在擬態(tài)化中間件對來自各執(zhí)行體的SQL 指令進行相似性判決前被調(diào)用,將經(jīng)過指紋差異化處理的Web 應(yīng)用的數(shù)據(jù)庫訪問SQL 保留字進行去指紋化,使異構(gòu)化的SQL 保留字可被后續(xù)擬態(tài)化模塊識別并進一步執(zhí)行.指紋過濾模塊的工作原理如圖3所示.
圖3 指紋過濾模塊工作原理
數(shù)據(jù)庫中間件[7]處于數(shù)據(jù)庫和用戶應(yīng)用之間,用于屏蔽異構(gòu)數(shù)據(jù)庫的底層細節(jié)問題.當用戶向Web 服務(wù)器發(fā)出SQL 請求時,通過數(shù)據(jù)庫中間件對SQL 請求進行特定的分析,根據(jù)分析結(jié)果連接數(shù)據(jù)庫,將SQL 請求轉(zhuǎn)發(fā)給數(shù)據(jù)庫服務(wù)器.數(shù)據(jù)庫服務(wù)器執(zhí)行SQL 語句后,將查詢結(jié)果通過數(shù)據(jù)庫中間件,傳回給用戶.以MyCAT 為例,傳統(tǒng)數(shù)據(jù)庫中間件結(jié)構(gòu)[8]如圖4所示.
圖4 傳統(tǒng)數(shù)據(jù)庫中間件結(jié)構(gòu)
根據(jù)圖4可知傳統(tǒng)數(shù)據(jù)庫中間件的核心由監(jiān)管模塊、執(zhí)行模塊組成,執(zhí)行模塊包括Web 應(yīng)用端及數(shù)據(jù)庫端的通信協(xié)議、連接池以及SQL 處理部分,其中SQL 處理部分包括SQL 解析組件、SQL 優(yōu)化組件、SQL 路由組件和SQL 執(zhí)行組件.
當Web 應(yīng)用通過通信協(xié)議向數(shù)據(jù)庫端發(fā)起SQL任務(wù)時,在監(jiān)管模塊的協(xié)調(diào)下,SQL 解析組件首先對SQL 語句進行語法分析,SQL 優(yōu)化組件將SQL 語句轉(zhuǎn)譯為底層數(shù)據(jù)庫可識別的語言,SQL 路由組件確定對應(yīng)的數(shù)據(jù)庫,最后由SQL 執(zhí)行組件生成執(zhí)行計劃,保證分發(fā)到底層數(shù)據(jù)庫的SQL 語句能正確執(zhí)行[9].數(shù)據(jù)庫中間件對數(shù)據(jù)庫返回的執(zhí)行結(jié)果進行排序、合并等處理后,將最終結(jié)果返回給Web 應(yīng)用.
擬態(tài)化中間件模塊在傳統(tǒng)數(shù)據(jù)庫中間件的基礎(chǔ)上,增加了在線擬態(tài)判決器和同步機制.
在線擬態(tài)判決器是對已經(jīng)過指紋過濾的來自不同執(zhí)行體的SQL 指令根據(jù)少數(shù)服從多數(shù)的原則進行相似性判決,選擇相似程度最高的SQL 指令進行執(zhí)行;同步機制[10]通過交換每個成員中所有已更新的記錄和對象,實現(xiàn)副本集成員的同步;用于維護分布式環(huán)境下各個節(jié)點數(shù)據(jù)庫數(shù)據(jù)的一致性.擬態(tài)判決器的結(jié)構(gòu)如圖5所示.
圖5 擬態(tài)化中間件結(jié)構(gòu)
由圖5知,當部署在擬態(tài)執(zhí)行體上的Web 應(yīng)用發(fā)起SQL 任務(wù)時,擬態(tài)化中間件根據(jù)各執(zhí)行體的連接信息,在監(jiān)管模塊的協(xié)調(diào)下,調(diào)用對應(yīng)的指紋過濾模塊對異構(gòu)的SQL 保留字進行去指紋化;隨后將來自不同執(zhí)行體的SQL 指令加入對應(yīng)的判決隊列中,并使用擬態(tài)判決器在線進行相似性判決;若判決來自不同執(zhí)行體的SQL 指令一致,則該SQL 指令將生成執(zhí)行計劃發(fā)送到底層數(shù)據(jù)庫進行執(zhí)行;若判決來自不同執(zhí)行體的SQL 指令不完全一致,則按照少數(shù)服從多數(shù)的原則,執(zhí)行多數(shù)執(zhí)行體相同的SQL 指令;若判決來自不同執(zhí)行體的SQL 指令完全不一致,則均不執(zhí)行且返回報錯信息.在成功執(zhí)行SQL 指令后,將各執(zhí)行體SQL 指令保存在對應(yīng)緩沖區(qū)中的執(zhí)行結(jié)果進行完整性驗證,在同步機制的作用下對出現(xiàn)故障的數(shù)據(jù)表信息進行恢復(fù),最終返回驗證合法的結(jié)果.
擬態(tài)防御動態(tài)異構(gòu)冗余(Dynamic Heterogeneous Redundancy,DHR)架構(gòu)的抗攻擊性分析[11]中,若擬態(tài)界的執(zhí)行體集中有n(n=2k+1,k=0,1,2···)個異構(gòu)執(zhí)行體,針對特定漏洞的攻擊成功率如下:
針對隨機選擇的漏洞子集組合攻擊成功率如下:
其中,qvuli是 攻擊者利用漏洞vuli對含vuli的執(zhí)行體進行攻擊的成功率,與攻擊者能力密切相關(guān),是漏洞vul的k階輸出一致率,即對漏洞vul,在N次攻擊中有N′次 其k個輸出相同且與正常輸出不一致,αi是攻擊者利用漏洞vuli攻擊時的選擇權(quán)重,為系統(tǒng)動態(tài)變化周期T和攻擊時間tvul的綜合考慮參數(shù).由于在擬態(tài)防御環(huán)境下,系統(tǒng)動態(tài)變化周期T較短,使得的I(vul)=0概率增大;系統(tǒng)內(nèi)各執(zhí)行體異構(gòu)性高,因此k階輸出一致率εk(vul)低,且指紋特征在Web 應(yīng)用源代碼中的SQL 保留字中,大大增加了攻擊者獲取到個執(zhí)行體中指紋特征的難度,因此攻擊者難以獲得足夠多的指紋特征偽造惡意指令繞過擬態(tài)化中間件中的相似性判決.
SQL 注入攻擊作為主流的數(shù)據(jù)庫攻擊方式,主要集中在利用網(wǎng)站服務(wù)端口接收用戶輸入的功能[12],將構(gòu)造的SQL 語句傳入數(shù)據(jù)庫服務(wù)器,欺騙其執(zhí)行開發(fā)者規(guī)定外的惡意任務(wù).
DVWA 是一款內(nèi)置不同安全級別漏洞模塊的滲透測試演練系統(tǒng),安全級別越低,漏洞利用成功率也越高.現(xiàn)使用其SQL 注入模塊來測試擬態(tài)數(shù)據(jù)庫模型的基本防御功能.
為單獨測試擬態(tài)數(shù)據(jù)庫模型的基本防御功能,簡化測試模型,準備一組由3 個同構(gòu)執(zhí)行體組成的Web 服務(wù)器和一臺數(shù)據(jù)庫服務(wù)器,安裝相同的版本的DVWA;在使用擬態(tài)數(shù)據(jù)庫的情況下,對部署在三臺Web 服務(wù)器上DVWA 中的SQL 保留字進行指紋異構(gòu)化處理,在數(shù)據(jù)庫服務(wù)器中使用指紋過濾模塊和擬態(tài)化中間件模塊.
測試過程如下:
(1) 在使用傳統(tǒng)數(shù)據(jù)庫的情況下,先后用sqlmap、pangolin 等SQL 注入測試工具分別對DVWA 中低安全級別的SQL 注入測試模塊和高安全級別的SQL 注入測試模塊實施SQL 注入測試;
(2) 在使用擬態(tài)數(shù)據(jù)庫模型的情況下,使用注入DVWA 低安全級別的傳統(tǒng)數(shù)據(jù)庫使用的SQL 注入方法(后文稱低級SQL 注入),針對DVWA 低安全級別的SQL 注入測試模塊實施注入;
(3) 若注入失敗,則使用注入DVWA 高安全級別的傳統(tǒng)數(shù)據(jù)庫使用的SQL 注入方法(后文稱高級SQL 注入),針對使用擬態(tài)數(shù)據(jù)庫模型的DVWA 低安全級別的SQL 注入測試模塊實施注入;
(4) 在傳統(tǒng)SQL 注入方法失敗的情況下,構(gòu)造含有某一執(zhí)行體指紋特征的SQL 注入語句,再次進行SQL 注入測試.
以使用sqlmap 為例,測試結(jié)果及說明如下:
(1) 使用傳統(tǒng)數(shù)據(jù)庫時對DVWA 低安全級別SQL 注入模塊進行SQL 注入的結(jié)果.
如圖6所示,在不使用擬態(tài)數(shù)據(jù)庫模型的情況下,當Web 應(yīng)用的安全性較差時,攻擊者可以輕松實現(xiàn)SQL 注入.
(2) 使用傳統(tǒng)數(shù)據(jù)庫時對DVWA 高安全級別SQL 注入模塊進行SQL 注入的結(jié)果.
圖6 DVWA 低安全級別數(shù)據(jù)庫SQL 注入結(jié)果
如圖7所示,在不使用擬態(tài)數(shù)據(jù)庫模型的情況下,盡管Web 應(yīng)用的安全性較高,但攻擊者也可以通過各種繞過手段,使用sqlmap 等工具成功實施SQL 注入攻擊.
圖7 DVWA 高安全級別數(shù)據(jù)庫SQL 注入結(jié)果
(3) 使用擬態(tài)數(shù)據(jù)庫模型時對DVWA 低安全級別的SQL 注入測試模塊進行低級SQL 注入的結(jié)果.
如圖8所示,在使用擬態(tài)數(shù)據(jù)庫模型的情況下,對DVWA 低安全級別的SQL 注入測試模塊進行低級SQL 注入,由于低級SQL 注入手段通過構(gòu)造SQL 語句進行注入,并未帶有執(zhí)行體指紋信息,擬態(tài)數(shù)據(jù)庫模型并不會將其當做SQL 指令進行執(zhí)行,因此擬態(tài)數(shù)據(jù)庫模型可以防御低級SQL 注入.
圖8 低級SQL 注入結(jié)果
(4) 使用擬態(tài)數(shù)據(jù)庫模型時對DVWA 低安全級別的SQL 注入測試模塊進行高級SQL 注入的結(jié)果.
如圖9所示,在使用擬態(tài)數(shù)據(jù)庫模型的情況下,對DVWA 低安全級別的SQL 注入測試模塊進行高級SQL 注入,盡管高級SQL 注入可通過繞過手段成功將SQL 指令注入傳統(tǒng)數(shù)據(jù)庫欺騙其執(zhí)行,但由于最終擬態(tài)數(shù)據(jù)庫模型接收到的SQL 語句中并未帶有指紋特征,因此并不會將SQL 注入語句作為指令進行執(zhí)行,說明擬態(tài)數(shù)據(jù)庫模型可以防御高級SQL 注入.
圖9 高級SQL 注入結(jié)果
(5) 構(gòu)造含某一執(zhí)行體指紋特征的SQL 注入語句進行SQL 注入的結(jié)果
如圖10所示,在使用擬態(tài)數(shù)據(jù)庫模型的情況下,使用含某一執(zhí)行體指紋特征的SQL 注入語句對DVWA 低安全級別的SQL 注入測試模塊進行SQL 注入失敗,因為擬態(tài)數(shù)據(jù)庫模型只接收到了帶有一個執(zhí)行體指紋特征的SQL 指令,在擬態(tài)化中間件模塊進行SQL 指令的相似性判決時,另外兩個執(zhí)行體對應(yīng)的判決隊列為空,SQL 指令不會繼續(xù)向下執(zhí)行.因此在少量指紋泄露的情況下,擬態(tài)數(shù)據(jù)庫模型可以防御構(gòu)造指紋特征的SQL 注入.
圖10 含指紋特征的SQL 語句注入結(jié)果
針對傳統(tǒng)數(shù)據(jù)庫防御手段的靜態(tài)性和確定性,本文基于擬態(tài)防御的動態(tài)異構(gòu)冗余原理提出應(yīng)用于擬態(tài)系統(tǒng)中的擬態(tài)數(shù)據(jù)庫模型.模型的安全性測試結(jié)果證明該模型在執(zhí)行體同構(gòu)環(huán)境下的可用性和安全性,若應(yīng)用于執(zhí)行體異構(gòu)的擬態(tài)系統(tǒng)中,則系統(tǒng)數(shù)據(jù)庫的安全性更會大大增加.但在測試過程中發(fā)現(xiàn),引入擬態(tài)數(shù)據(jù)庫模型,由于存在去指紋化處理及相似性判決步驟,模型的時間性能有所降低,影響了數(shù)據(jù)庫查詢的效率.
今后將進一步探索能有效提高擬態(tài)數(shù)據(jù)庫模型判決速率切實可行的實現(xiàn)方法,并在現(xiàn)有擬態(tài)數(shù)據(jù)庫模型的基礎(chǔ)上,對保留字指紋特征的短期內(nèi)動態(tài)變化以及注入攻擊觸發(fā)指紋特征變化的可能性進行更深一步的研究.