張亞暉, 趙 敏, 李 劍, 韓 歡
(1.陸軍工程大學(xué) 通信士官學(xué)校,重慶 400035;2.陸軍工程大學(xué) 指揮控制工程學(xué)院,江蘇 南京 210007)
信息系統(tǒng)(information system,IS)是以處理信息流為目的的人機(jī)一體化系統(tǒng),在人類(lèi)的社會(huì)生活、生產(chǎn)實(shí)踐、政治生態(tài)、軍事斗爭(zhēng)和人文學(xué)術(shù)等領(lǐng)域扮演著越來(lái)越重要的角色。但隨著計(jì)算機(jī)軟硬件的飛速發(fā)展,越來(lái)越多的信息系統(tǒng)成為遺留系統(tǒng)。長(zhǎng)期運(yùn)行的遺留信息系統(tǒng)通常承載著某些關(guān)鍵復(fù)雜業(yè)務(wù),并具有以下特征:(1)系統(tǒng)架構(gòu)陳舊、維護(hù)困難;(2)開(kāi)發(fā)維護(hù)人員流動(dòng)大、代碼和文檔缺失;(3)業(yè)務(wù)功能獨(dú)立,沒(méi)有集成;(4)安全防護(hù)問(wèn)題突出。
遺留信息系統(tǒng)雖然存在較多問(wèn)題,但因?yàn)殚L(zhǎng)期運(yùn)行,通常包含大量的業(yè)務(wù)數(shù)據(jù),是企業(yè)非常重要的資源。大部分企業(yè)在處理遺留信息系統(tǒng)時(shí)通常有兩種方式:(1)完全拋棄遺留信息系統(tǒng),進(jìn)行重新開(kāi)發(fā);(2)對(duì)遺留信息系統(tǒng)進(jìn)行性能和安全優(yōu)化。重新開(kāi)發(fā)的信息系統(tǒng)可以采用較新的軟硬件和開(kāi)發(fā)技術(shù),但通常需要對(duì)原有的數(shù)據(jù)進(jìn)行適配轉(zhuǎn)換,在此過(guò)程中,還需要繼續(xù)使用遺留系統(tǒng)。因此,可以先對(duì)遺留信息系統(tǒng)進(jìn)行性能和安全優(yōu)化,再根據(jù)需求進(jìn)行信息系統(tǒng)的重新開(kāi)發(fā)。目前雖然有關(guān)于遺留信息系統(tǒng)工程方面的文獻(xiàn)[1-2],但關(guān)于安全方面的研究相對(duì)較少,特別是目前遺留信息系統(tǒng)主要運(yùn)行于基于Intel處理器的商用Windows平臺(tái),操作系統(tǒng)和信息系統(tǒng)本身都可能存在漏洞,易受攻擊。雖然一些遺留信息系統(tǒng)具有身份認(rèn)證、殺毒、加密等傳統(tǒng)安防手段,但仍面臨較大的安全風(fēng)險(xiǎn),如無(wú)法解決運(yùn)行態(tài)內(nèi)存中的數(shù)據(jù)安全問(wèn)題。
針對(duì)上述不足,本文以A公司在Windows上運(yùn)行的無(wú)源代碼無(wú)文檔的遺留人力資源管理信息系統(tǒng)為例,提出采用SGX可信計(jì)算技術(shù)為該遺留信息系統(tǒng)中的敏感信息提供機(jī)密性和完整性保護(hù),最大程度減少敏感信息的泄露問(wèn)題。
本文的貢獻(xiàn)主要有:(1) 設(shè)計(jì)了Windows場(chǎng)景中基于SGX技術(shù)保護(hù)遺留信息系統(tǒng)的架構(gòu),解決了該場(chǎng)景中信息系統(tǒng)的敏感信息保護(hù)問(wèn)題,推廣了SGX的典型應(yīng)用場(chǎng)景。(2) 提出了基于Hook技術(shù)調(diào)用SGX的方法,解決了Windows遺留信息系統(tǒng)無(wú)法直接使用SGX的問(wèn)題,豐富了遺留信息系統(tǒng)安全防護(hù)的技術(shù)手段。
微軟Detours庫(kù)[3]可以在程序運(yùn)行過(guò)程中動(dòng)態(tài)攔截函數(shù)調(diào)用。它的工作原理是將目標(biāo)函數(shù)前幾個(gè)指令替換為一個(gè)無(wú)條件的跳轉(zhuǎn),跳轉(zhuǎn)到用戶定義的Detour函數(shù)。而被攔截的函數(shù)保存在一個(gè)名為T(mén)rampoline的函數(shù)中。Trampoline函數(shù)保存了目標(biāo)函數(shù)移除的指令和一個(gè)無(wú)條件跳轉(zhuǎn),可以使執(zhí)行流重新跳轉(zhuǎn)回目標(biāo)函數(shù)的執(zhí)行體部分(即未被移除的部分)。當(dāng)執(zhí)行到目標(biāo)函數(shù)的時(shí)候,可以根據(jù)用戶指令直接跳轉(zhuǎn)到用戶提供的Detours函數(shù),Detours函數(shù)開(kāi)始執(zhí)行自己的函數(shù)代碼,執(zhí)行完畢后可以直接返回或調(diào)用Trampoline函數(shù)將執(zhí)行流程跳轉(zhuǎn)到原目標(biāo)函數(shù)前。當(dāng)目標(biāo)函數(shù)執(zhí)行完以后,再將控制權(quán)交給Detour函數(shù),Detour函數(shù)執(zhí)行適當(dāng)?shù)拇a返回。
SGX是Intel公司提出的一種芯片級(jí)信息隔離安全防護(hù)新技術(shù),是對(duì)Intel體系(intel architecture)新的擴(kuò)展,用于增強(qiáng)軟件的安全性[4],Intel公司在Skylake系列CPU中開(kāi)始加入了對(duì)SGX技術(shù)的支持。SGX通過(guò)在硬件級(jí)別上為應(yīng)用程序?qū)崿F(xiàn)一個(gè)被隔離的內(nèi)存空間來(lái)保證運(yùn)行代碼和數(shù)據(jù)的機(jī)密性與完整性,被隔離的空間稱(chēng)為飛地(enclave)。不同于以往的識(shí)別和隔離平臺(tái)上的惡意軟件,SGX是將用戶代碼和數(shù)據(jù)以明文形式封裝在Enclave中,而Enclave外的代碼和數(shù)據(jù)則需要加密存儲(chǔ),因此對(duì)于非Enclave訪問(wèn),外部存儲(chǔ)器讀取的和總線監(jiān)聽(tīng)的都是加密后的數(shù)據(jù)。
另外,在x86架構(gòu)中,Intel CPU的運(yùn)行級(jí)別分為Ring 0、Ring 1、Ring 2和Ring 3四級(jí)。其中Ring 0權(quán)限級(jí)別最高,Ring 3最低,權(quán)限級(jí)別高的可以修改查看與它同級(jí)或較低級(jí)別的數(shù)據(jù)和代碼,但反過(guò)來(lái)則經(jīng)常被認(rèn)為是非法操作而不被允許。在不支持SGX技術(shù)的硬件設(shè)備中,一些惡意攻擊者可以通過(guò)獲取Ring 0權(quán)限級(jí)別,對(duì)Ring 3權(quán)限級(jí)別的用戶代碼和數(shù)據(jù)實(shí)施竊取和破壞。但在SGX技術(shù)中,雖然SGX運(yùn)行于Ring 3權(quán)限級(jí)別,但操作系統(tǒng)等均不被SGX信任,可以防止更高權(quán)限的攻擊者對(duì)Enclave內(nèi)代碼和數(shù)據(jù)的攻擊。
與當(dāng)前流行的可信平臺(tái)模塊TPM[5]和ARM TrustZone[6]兩種硬件安全隔離技術(shù)相比,SGX還具有較小的可信計(jì)算基TCB(trusted computing base),僅包括CPU和Enclave本身,避免了基于軟件的TCB的漏洞與威脅。同時(shí)SGX可保障軟件運(yùn)行時(shí)的安全,惡意軟件無(wú)法訪問(wèn)和篡改Enclave中運(yùn)行時(shí)的內(nèi)容;SGX基于指令集的擴(kuò)展與獨(dú)立的認(rèn)證方式,使應(yīng)用程序可以靈活調(diào)用SGX的安全功能并進(jìn)行驗(yàn)證。
自SGX技術(shù)提出以來(lái),學(xué)術(shù)界和工業(yè)界對(duì)基于SGX的網(wǎng)絡(luò)應(yīng)用和針對(duì)SGX攻擊與防御等[7-19]進(jìn)行了大量研究與驗(yàn)證。其中,基于SGX技術(shù)構(gòu)建可信的系統(tǒng)調(diào)用庫(kù)LibOS可以提高安全應(yīng)用的開(kāi)發(fā)效率,為遺留系統(tǒng)提供安全增強(qiáng)保護(hù),因而成為研究熱點(diǎn)。
文獻(xiàn)[7,8,11,12,17]基于SGX技術(shù)分別提出了Haven、SCONE、Panoply、Graphene-SGX和Occlum等LibOS方案。但遺憾的是,SCONE、Panoply、Graphene-SGX和Occlum只適用于Linux環(huán)境,且SCONE、Panoply和Occlum是利用交叉編譯器實(shí)現(xiàn)的源代碼級(jí)別兼容,即雖然可以不修改應(yīng)用的源代碼但必須要對(duì)源代碼進(jìn)行重新編譯;而Graphene-SGX是二進(jìn)制級(jí)別兼容,解決了大部分應(yīng)用在無(wú)源代碼情況下的隔離保護(hù),已經(jīng)成為非常受歡迎的LibOS,但其存在性能和數(shù)據(jù)同步一致性的問(wèn)題。Haven是Windows環(huán)境中的LibOS方案,但它需要在Enclave中重新封裝系統(tǒng)調(diào)用及其他的Shield模塊等,使得其可信計(jì)算基過(guò)大,且因其閉源而導(dǎo)致Windows環(huán)境中基于SGX可用的遺留系統(tǒng)安全增強(qiáng)方案幾乎空白。
A公司的遺留人力資源管理信息系統(tǒng),主要用于存儲(chǔ)公司的人力資源信息。因該系統(tǒng)開(kāi)發(fā)時(shí)間較早,開(kāi)發(fā)人員、文檔和源代碼等均已缺失,已成為無(wú)源代碼無(wú)文檔的遺留信息系統(tǒng)。經(jīng)安裝使用、逆向工程分析,其系統(tǒng)架構(gòu)如圖1所示。
圖1 某遺留人力資源管理信息系統(tǒng)架構(gòu)
該遺留信息系統(tǒng)是基于MFC開(kāi)發(fā)的32位應(yīng)用程序,并通過(guò)DLL動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)對(duì)SQL Server數(shù)據(jù)庫(kù)的訪問(wèn)。系統(tǒng)中的敏感信息是人員數(shù)據(jù),特別是用戶口令、薪酬數(shù)據(jù)等。且用戶口令和薪酬數(shù)據(jù)等敏感信息以明文的形式,分別存儲(chǔ)在數(shù)據(jù)庫(kù)表UsersLogin和WagesInfo中。
為該遺留人力資源管理信息系統(tǒng)的相關(guān)操作提供一個(gè)安全可信的執(zhí)行環(huán)境,并有效保護(hù)系統(tǒng)中的數(shù)據(jù)是亟待解決的問(wèn)題?;诖耍疚募僭O(shè)系統(tǒng)的處理器是可信的,即Enclave安全容器及容器中的代碼和數(shù)據(jù)都是可信的。而Enclave外部是不可信的,即BIOS、操作系統(tǒng)及遺留信息系統(tǒng)自身是不可信的。攻擊者可以利用系統(tǒng)或軟件漏洞攻擊BIOS、操作系統(tǒng)或遺留信息系統(tǒng)等,獲得Ring 0級(jí)別特權(quán),進(jìn)而可以修改系統(tǒng)配置,植入惡意代碼、病毒,從而竊取、偽造或破壞遺留信息系統(tǒng)中的敏感信息。
該遺留人力資源管理信息系統(tǒng)是32位的應(yīng)用程序,運(yùn)行于基于Intel處理器的商用Windows平臺(tái)。而Intel SGX可信技術(shù)對(duì)硬件的要求是6代Skylake CPU及以上,對(duì)操作系統(tǒng)的要求是64位的Windows 7及以上,目前主流的64位操作系統(tǒng)是Windows 10、Windows Server 2012和Windows Server 2016等,可以兼容運(yùn)行32位的應(yīng)用程序,這為A公司的遺留信息系統(tǒng)使用SGX可信計(jì)算技術(shù)提供了硬件和軟件支持。
安全增強(qiáng)方案的目的是保護(hù)該遺留人力資源管理信息系統(tǒng)中的敏感信息。方案的基本思路是:
(1) 通過(guò)逆向工程、靜態(tài)分析等方法找到Windows無(wú)源代碼遺留信息系統(tǒng)的注入點(diǎn);
(2) 編寫(xiě)Hook邏輯改變遺留信息系統(tǒng)中的數(shù)據(jù)庫(kù)操作函數(shù)執(zhí)行流程,使新的執(zhí)行流程調(diào)用SGX不可信組件的接口函數(shù);
(3) 使用不可信組件的接口函數(shù)將遺留信息系統(tǒng)的明文敏感信息傳入可信Enclave安全容器;
(4) 在可信Enclave中對(duì)明文敏感信息進(jìn)行加密處理并將相關(guān)的密鑰等隱私數(shù)據(jù)綁定至Enclave;
(5) 將加密后的敏感信息返回給原數(shù)據(jù)庫(kù)操作函數(shù),并將相關(guān)的密文存儲(chǔ)到數(shù)據(jù)庫(kù)中。
基于SGX和Enclave是安全可信的,即使操作系統(tǒng)或遺留信息系統(tǒng)內(nèi)部被攻擊或篡改,仍可以保證Enclave安全容器中代碼和數(shù)據(jù)的安全可信,防止敏感信息被竊取,架構(gòu)示意圖如圖2所示。
圖2 基于SGX的遺留信息系統(tǒng)安全增強(qiáng)方案框架
基于上述思路,開(kāi)發(fā)人員不需要對(duì)原遺留信息系統(tǒng)進(jìn)行任何修改,只需要:
(1) 改變?cè)瓟?shù)據(jù)庫(kù)操作函數(shù)的執(zhí)行流程。
(2) 開(kāi)發(fā)Hook函數(shù)與SGX不可信組件交互的接口函數(shù)。
(3) 開(kāi)發(fā)SGX組件,包括可信組件(方案命名為可信Enclave,TEnclave)和不可信組件(除去可信組件的其他部分,命名為UTBridge)。其中可信組件用于執(zhí)行密鑰生成、敏感信息加解密等安全相關(guān)的操作;不可信組件負(fù)責(zé)與Hook函數(shù)以及可信組件的交互。可信組件中的代碼和數(shù)據(jù)在可信內(nèi)存區(qū)域受到SGX可信計(jì)算技術(shù)保護(hù),而不可信組件的代碼和數(shù)據(jù)位于一般的內(nèi)存中。
3.2.1 方案的形式描述
重點(diǎn)對(duì)安全增強(qiáng)方案中敏感信息的加解密進(jìn)行描述。
定義安全增強(qiáng)方案SES={KSGX,NSGX,SSGX}。其中:KSGX={key1, key2,…, keyn}為飛地中密鑰的有限集;NSGX={nonce1,nonce2,…,noncen}為飛地中隨機(jī)數(shù)的有限集;SSGX={(KSGX,NSGX)}為飛地中密鑰和隨機(jī)數(shù)組合的有限復(fù)合集。
算法1對(duì)明文敏感信息的加密算法(SGX_encrypt)
輸入:明文敏感信息Plaintext
輸出:密文敏感信息Ciphertext
a) 輸入Plaintext;
b)RSGX=Random(SSGX),從SSGX中隨機(jī)選取一組密鑰和隨機(jī)數(shù)的組合;
c) rv=Encrypt(Plaintext,Ciphertext,RSGX),在飛地中加密敏感信息;
d )if rv!=SGX_SUCCESS,轉(zhuǎn)f);
else轉(zhuǎn)e);
e) 輸出Ciphertext;
f) 結(jié)束。
算法2對(duì)密文敏感信息的解密算法(SGX_decrypt)
輸入:密文敏感信息Ciphertext
輸出:明文敏感信息Plaintext
a) 輸入Ciphertext;
b) 循環(huán):fori=1;i≤n;i++
rv=Decrypt(Ciphertext, Plaintext,SSGXi)
if rv!= SGX_SUCCESS continue;
else break;
c) if rv!=SGX_SUCCESS,轉(zhuǎn)e);
else轉(zhuǎn)d);
d ) 輸出Plaintext;
e) 結(jié)束。
3.2.2 改變?cè)瓟?shù)據(jù)庫(kù)操作函數(shù)執(zhí)行流程
改變函數(shù)執(zhí)行流程的方法有很多,最簡(jiǎn)單的方式是修改函數(shù)的源碼,但對(duì)于無(wú)源代碼的遺留信息系統(tǒng),則可以通過(guò)Hook技術(shù)更改函數(shù)的執(zhí)行流程。方案使用逆向工程、靜態(tài)分析等方式分析獲取原遺留信息系統(tǒng)的注入點(diǎn),使用微軟Detours庫(kù)實(shí)現(xiàn)Hook函數(shù)的注入。
通過(guò)對(duì)原遺留信息系統(tǒng)進(jìn)行逆向工程分析,其數(shù)據(jù)訪問(wèn)層的DLL動(dòng)態(tài)鏈接庫(kù)中主要有兩個(gè)與數(shù)據(jù)庫(kù)操作相關(guān)的函數(shù),分別是Dboperafunc和Dbselectfunc。經(jīng)分析驗(yàn)證,其中Dboperafunc主要用于更改數(shù)據(jù)庫(kù),即將人員信息寫(xiě)入數(shù)據(jù)庫(kù);而Dbselectfunc主要用于查詢數(shù)據(jù)庫(kù),即查詢?nèi)藛T信息從而顯示到MFC應(yīng)用中。
根據(jù)Detours庫(kù)的使用規(guī)則,安全增強(qiáng)方案需要定義4個(gè)函數(shù)實(shí)現(xiàn)Hook邏輯,包括2個(gè)Trampoline函數(shù)和2個(gè)Detour函數(shù)。定義的Trampoline函數(shù)為Real_dbopera和Real_dbselect,分別用于保存Dboperafunc和Dbselectfunc的移除指令和無(wú)條件跳轉(zhuǎn),以及分別用于還原恢復(fù)Dboperafunc和Dbselectfunc函數(shù)的執(zhí)行流程。定義的Detour函數(shù)為Hook_dbopera和Hook_dbselect,分別用于改變Dboperafunc和Dbselectfunc的執(zhí)行流程,以便在更改后的執(zhí)行流程中使用SGX可信計(jì)算技術(shù)對(duì)敏感信息進(jìn)行加密和解密操作。注意設(shè)計(jì)的Trampoline和Detour函數(shù)的參數(shù)列表、類(lèi)型及函數(shù)返回值等均應(yīng)與原函數(shù)相同,否則函數(shù)跳轉(zhuǎn)將失敗。更改前后的執(zhí)行流程分別如圖3、圖4所示。
圖3 函數(shù)正常的執(zhí)行流程
圖4 hook注入后的函數(shù)執(zhí)行流程
所需函數(shù)定義完成后,可以使用DetourAttach攔截目標(biāo)函數(shù)。DetourAttach需要2個(gè)參數(shù):目標(biāo)函數(shù)指針地址和Detour函數(shù)地址,但目標(biāo)函數(shù)不能直接作為參數(shù)傳入,而需要傳入目標(biāo)指針。DetourAttach為調(diào)用目標(biāo)函數(shù)分配并準(zhǔn)備好一個(gè)Trampoline函數(shù)。Detour運(yùn)行以后,目標(biāo)函數(shù)和Trampoline會(huì)被重寫(xiě),目標(biāo)指針被更新,指向Trampoline函數(shù)。一旦目標(biāo)函數(shù)被攔截,目標(biāo)函數(shù)的調(diào)用會(huì)被轉(zhuǎn)到Detour函數(shù)。目標(biāo)函數(shù)通過(guò)Trampoline被執(zhí)行的時(shí)候,Detour函數(shù)將參數(shù)復(fù)制過(guò)來(lái)。要想移除攔截,可以調(diào)用DetourDetach。與DetourAttach類(lèi)似,DetourDetach也需要2個(gè)參數(shù):目標(biāo)函數(shù)指針地址和Detour函數(shù)地址。DetourDetach執(zhí)行后,目標(biāo)函數(shù)被重寫(xiě)為其原來(lái)的狀態(tài)。Trampoline函數(shù)被刪除,目標(biāo)函數(shù)指針恢復(fù)為原來(lái)的目標(biāo)函數(shù)。
在安全增強(qiáng)方案中,因?yàn)橐獢r截的程序沒(méi)有源代碼,所以需要將Trampoline函數(shù)Real_dbXXfunc和Detour函數(shù)Hook_dbXXfunc封裝在HookHrMis.dll中,并在遺留信息系統(tǒng)啟動(dòng)時(shí),使用DetourCreateProcessWithDllEx將HookHrMis.dll注入遺留信息系統(tǒng)進(jìn)程中。
3.2.3 安全操作與敏感信息的隔離保護(hù)
遺留信息系統(tǒng)的數(shù)據(jù)庫(kù)操作函數(shù)執(zhí)行流程被更改后,需使新的執(zhí)行流程調(diào)用SGX不可信組件的接口函數(shù),通過(guò)接口函數(shù)將系統(tǒng)中的明文敏感信息由不可信組件傳入可信Enclave安全容器,并在Enclave中對(duì)明文敏感信息進(jìn)行加密處理。
SGX組件由可信組件和不可信組件組成,其中本方案的可信組件命名為T(mén)Enclave,不可信組件為除TEnclave以外的部分,命名為UTBridge??尚沤M件TEnclave與不可信組件UTBridge會(huì)進(jìn)行交互,其交互規(guī)則要按照SGX規(guī)范編寫(xiě)Enclave定義語(yǔ)言(enclave definition language, EDL)文件[20]。在安全增強(qiáng)方案中,編寫(xiě)TEnclave.edl文件對(duì)方案的可信組件與不可信組件進(jìn)行明確的劃分與定義,SGX可以使用該EDL文件自動(dòng)完成可信組件和不可信組件相關(guān)文件的生成,并為可信容器TEnclave創(chuàng)建相關(guān)的OCALL和ECALL例程。自動(dòng)生成的可信組件文件包括TEnclave_t.h、TEnclave_t.c,不可信組件文件包括TEnclave_u.h、TEnclave_u.c。ECALL和OCALL主要完成可信組件TEnclave與不可信組件UTBridge的交互,ECALL是不可信部分調(diào)用可信部分的方式,函數(shù)的執(zhí)行將從不可信組件UTBridge轉(zhuǎn)到可信組件TEnclave,而OCALL則是可信部分調(diào)用不可信部分的方式,函數(shù)執(zhí)行將從可信組件TEnclave轉(zhuǎn)到不可信組件UTBridge。
可信組件TEnclave和不可信組件UTBridge均被封裝為單獨(dú)的dll,從HookHrMis到TEnclave的函數(shù)調(diào)用將遵循圖5所示流程。
圖5 安全增強(qiáng)方案函數(shù)調(diào)用示意圖
3.2.4 敏感信息增強(qiáng)保護(hù)示例
下面以對(duì)遺留人力資源管理信息系統(tǒng)中的人員薪酬數(shù)據(jù)進(jìn)行增強(qiáng)保護(hù)為例,說(shuō)明如何改變?cè)瓟?shù)據(jù)庫(kù)操作函數(shù)執(zhí)行流程,以及如何對(duì)安全操作與敏感信息進(jìn)行隔離保護(hù),其流程如圖6所示。
圖6 敏感信息增強(qiáng)保護(hù)示例流程圖
第1階段為改變函數(shù)流程。通過(guò)逆向工程、靜態(tài)分析等手段獲取原數(shù)據(jù)庫(kù)操作函數(shù),主要包括Dboperafunc和Dbselectfunc,分別設(shè)計(jì)相應(yīng)的Trampoline函數(shù)和Detour函數(shù)。
(1) Trampoline函數(shù),用于保存原數(shù)據(jù)庫(kù)操作函數(shù)的移除指令和無(wú)條件跳轉(zhuǎn),以便還原執(zhí)行流和實(shí)現(xiàn)原始的函數(shù)調(diào)用,有Real_dbopera和Real_dbselect。
(2) Detour函數(shù),用于攔截原數(shù)據(jù)庫(kù)的操作函數(shù),以實(shí)現(xiàn)對(duì)人員薪酬數(shù)據(jù)的加解密,有Hook_dbopera和Hook_dbselect。Hook_dbopera函數(shù)用于更改原數(shù)據(jù)庫(kù)操作函數(shù)Dboperafunc的執(zhí)行流程,通過(guò)分析得知原函數(shù)的參數(shù)為要執(zhí)行的SQL語(yǔ)句。通過(guò)使用SQL Server數(shù)據(jù)庫(kù)管理員賬號(hào)查看該人力資源管理信息系統(tǒng)數(shù)據(jù)庫(kù)的表結(jié)構(gòu),人員薪酬數(shù)據(jù)表為WagesInfo,其中的薪酬列名為Wage。分析函數(shù)Dboperafunc的參數(shù)SQL語(yǔ)句中是否存在表名“WagesInfo”以及是否存在“Insert”或“Update”等詞句,若存在這些詞句,則需要對(duì)該語(yǔ)句進(jìn)行解析重寫(xiě),否則應(yīng)直接調(diào)用Real_dbopera還原執(zhí)行流。
第2階段為隔離保護(hù)安全操作與敏感信息。提取SQL語(yǔ)句中的薪酬Wage字段,調(diào)用UTBridge.dll中的封裝函數(shù)Ew_X,再由Ew_X函數(shù)進(jìn)行ECALL調(diào)用進(jìn)入可信組件TEnclave。
(1) 啟動(dòng)Enclave安全區(qū),使用Enclave前必須啟動(dòng)Enclave并將生成的Enclave ID提供給ECALL例程。這對(duì)于其他函數(shù)應(yīng)該是透明的,安全增強(qiáng)方案通過(guò)使用一個(gè)全局變量保存該ID信息,但這會(huì)導(dǎo)致在安全區(qū)內(nèi)一次只能存在一個(gè)線程。對(duì)于安全應(yīng)用來(lái)說(shuō)這是一個(gè)合理的解決方案,因?yàn)檩^少的線程意味著較小的可信計(jì)算基和攻擊面。為了解決透明性問(wèn)題,UTBridge.dll中的函數(shù)應(yīng)首先檢查安全區(qū)是否已啟動(dòng),如果Enclave已啟動(dòng),則直接使用,否則先進(jìn)行Enclave安全區(qū)的創(chuàng)建和啟動(dòng)。通過(guò)檢查ECALL例程的返回值,除SGX_SUCCESS以外的任何結(jié)果都表明函數(shù)未成功進(jìn)入Enclave安全區(qū),并且所請(qǐng)求的功能未成功執(zhí)行。
(2) 定義可信組件與不可信組件的交互接口。安全增強(qiáng)方案的交互接口通過(guò)EDL文件進(jìn)行定義,以實(shí)現(xiàn)對(duì)人員薪酬數(shù)據(jù)的加解密。因?yàn)樾匠陻?shù)據(jù)的明文和密文處于Enclave內(nèi)外不同的地址空間,因此要將其從不可信部分封送到受Enclave保護(hù)的內(nèi)存空間中。SGX可信部分與不可信部分之間的參數(shù)傳遞與傳統(tǒng)函數(shù)不同,需要明確:① 數(shù)據(jù)復(fù)制方向,對(duì)于加密過(guò)程,薪酬數(shù)據(jù)的明文先封送到可信Enclave中,加密完成后將密文返回給不可信部分。對(duì)于解密過(guò)程,薪酬數(shù)據(jù)的密文先封送到可信Enclave中,解密完成后將明文返回給不可信部分。SGX為了指明指針數(shù)據(jù)復(fù)制的方向,需要在函數(shù)的指針參數(shù)前指定方向,方向類(lèi)型有[in]、[out]、[in, out],含義如表1所列;② 指針引用的數(shù)據(jù)緩沖區(qū)大小,SGX要求對(duì)于數(shù)組、Char和Wchar_t字符串等類(lèi)型,如果要復(fù)制的數(shù)據(jù)緩沖區(qū)的長(zhǎng)度超過(guò)一個(gè)元素,就必須指定緩沖區(qū)中的元素?cái)?shù),否則將僅復(fù)制一個(gè)元素。安全增強(qiáng)方案需要在傳遞指針數(shù)據(jù)前,正確獲取要傳遞的元素個(gè)數(shù)或數(shù)組的長(zhǎng)度,并將其作為函數(shù)的一個(gè)參數(shù)。
表1 ECALL和OCALL中的指針?lè)较騾?shù)及其含義
(3) 選擇加解密函數(shù)。SGX的可信內(nèi)存空間不能依賴第三方庫(kù),因此Enclave中的加解密函數(shù)只能自己編寫(xiě)或者選擇SGX所提供的加解密算法。SGX的密碼庫(kù)中自帶了一些常用的加解密方法和HASH函數(shù),方案分別選擇了SGX可信加密庫(kù)函數(shù)SGX_aes_ctr_encrypt和SGX_aes_ctr_decrypt進(jìn)行薪酬數(shù)據(jù)的加解密操作,二者執(zhí)行的是CTR(計(jì)數(shù)器)模式下的AES加解密操作,可支持128位的密鑰。
至此,對(duì)薪酬數(shù)據(jù)明文加密完成后,將該密文字段傳回Hook_dbopera函數(shù),并重寫(xiě)原SQL語(yǔ)句,利用DetourDetach還原數(shù)據(jù)庫(kù)操作函數(shù)執(zhí)行流程,使其執(zhí)行重寫(xiě)后的SQL語(yǔ)句,將加密后的薪酬數(shù)據(jù)保存至數(shù)據(jù)庫(kù)。
實(shí)驗(yàn)所選主機(jī)為T(mén)hinkpad E490筆記本電腦,CPU為支持SGX功能的i7-8565U,內(nèi)存16 GB。SGX開(kāi)發(fā)環(huán)境搭建步驟為:在BIOS中啟用主機(jī)的SGX功能;安裝Windows 10操作系統(tǒng),版本為1809;安裝Intel管理引擎驅(qū)動(dòng)程序,版本為1909.12.0.1236;安裝Visual Studio 2017;安裝Intel Windows SGX SDK 2.7,SGX PSW 2.7。
在該遺留人力資源管理信息系統(tǒng)中注入HookHrMis.dll,對(duì)人員的口令、薪酬數(shù)據(jù)等敏感信息重新錄入后,查看數(shù)據(jù)庫(kù)中人員口令表UsersLogin中的口令字段和薪酬表WagesInfo中的薪酬字段已全部為密文,但在應(yīng)用中可以查看到正確的明文信息。
結(jié)果表明,基于SGX的無(wú)源碼遺留信息系統(tǒng)安全增強(qiáng)方案正確實(shí)現(xiàn)了對(duì)人員口令和薪酬數(shù)據(jù)等敏感信息的加解密。惡意的數(shù)據(jù)庫(kù)攻擊者在沒(méi)有正確使用遺留人力資源管理信息系統(tǒng)的前提下,即使獲取到該數(shù)據(jù)庫(kù),也無(wú)法獲取其中的敏感信息,實(shí)現(xiàn)了對(duì)敏感信息的增強(qiáng)保護(hù)。
安全增強(qiáng)方案使用SGX可信計(jì)算技術(shù),對(duì)原遺留信息系統(tǒng)的性能會(huì)帶來(lái)一定的損耗。通過(guò)運(yùn)行不同次數(shù)的安全增強(qiáng)方案測(cè)試程序,分別測(cè)試了在遺留信息系統(tǒng)中注入HookHrMis.dll前后插入人員信息和更新人員信息所耗費(fèi)的時(shí)間,測(cè)試結(jié)果分別如圖7、圖8所示。
圖7 注入HookHrMis.dll前后插入人員信息所需時(shí)間
圖8 注入HookHrMis.dll前后更新人員信息所需時(shí)間
從測(cè)試結(jié)果可以看出,在原遺留信息系統(tǒng)中注入HookHrMis.dll后插入人員信息和更新人員信息相比注入前分別帶來(lái)了3.3%和4.37%的額外性能損耗。
分析性能損耗的原因主要在于Enclave安全容器的創(chuàng)建與銷(xiāo)毀、ECALL/OCALL調(diào)用過(guò)程中的數(shù)據(jù)傳遞以及敏感信息在Enclave安全容器中的加密和解密。但在應(yīng)用的實(shí)際運(yùn)行過(guò)程中,可以通過(guò)調(diào)整Enclave的創(chuàng)建與銷(xiāo)毀策略,如在應(yīng)用的運(yùn)行期間只創(chuàng)建一次Enclave,并只在應(yīng)用退出時(shí)才銷(xiāo)毀該Enclave,這樣可以將Enclave創(chuàng)建與銷(xiāo)毀所帶來(lái)的開(kāi)銷(xiāo)降至最低。因此,安全增強(qiáng)方案所帶來(lái)的額外性能開(kāi)銷(xiāo)在可接受的范圍內(nèi)。
因?yàn)樗蠩nclave可信內(nèi)存都在EPC(enclave page cache)內(nèi)存區(qū)域中實(shí)例化,但EPC是內(nèi)存中的共享資源,即系統(tǒng)中所有正在運(yùn)行的Enclave都必須位于其中。在系統(tǒng)中, EPC的大小可以在BIOS中設(shè)定,通常為64 MB或128 MB。由于此限制,應(yīng)將Enclave的大小調(diào)整為適合其實(shí)際內(nèi)存的使用量,并且分配給Enclave的內(nèi)存不應(yīng)超過(guò)其使用量,同時(shí)還應(yīng)注意在使用完Enclave后及時(shí)釋放以避免可能的內(nèi)存泄露。分配給Enclave的內(nèi)存量是在Enclave配置文件中設(shè)置的,默認(rèn)為每個(gè)線程分配256 kB??臻g和1 MB全局堆空間。
可以使用SGX提供的EMMT工具來(lái)測(cè)量運(yùn)行安全增強(qiáng)方案的Enclave大小,運(yùn)行安全增強(qiáng)方案測(cè)試程序1、100和1 000次的Enclave大小測(cè)量結(jié)果如圖9所示。
圖9 Enclave內(nèi)存占用
測(cè)量結(jié)果表明,該安全增強(qiáng)方案在執(zhí)行期間Enclave安全區(qū)共使用了2 kB的棧空間和4 kB的堆空間,沒(méi)有發(fā)生內(nèi)存泄露問(wèn)題。
首先對(duì)相關(guān)背景知識(shí)進(jìn)行研究,Intel的硬件可信計(jì)算技術(shù)SGX在越來(lái)越多的安全工程領(lǐng)域得到應(yīng)用,然后針對(duì)當(dāng)前Windows遺留信息系統(tǒng)中的敏感信息保護(hù)問(wèn)題,提出了基于SGX技術(shù)的安全增強(qiáng)方案,方案不需要對(duì)原遺留信息系統(tǒng)進(jìn)行任何修改,與數(shù)據(jù)庫(kù)系統(tǒng)弱相關(guān)。并以某無(wú)源代碼無(wú)文檔的遺留人力資源管理信息系統(tǒng)為例設(shè)計(jì)實(shí)現(xiàn)了該安全增強(qiáng)方案,對(duì)其中的隱私信息實(shí)現(xiàn)了安全保護(hù)。實(shí)測(cè)結(jié)果表明基于SGX技術(shù)的安全增強(qiáng)方案所帶來(lái)的額外性能開(kāi)銷(xiāo)在可接受的范圍,并驗(yàn)證了方案的正確性。本文主要針對(duì)Windows的無(wú)源代碼無(wú)文檔遺留信息系統(tǒng)進(jìn)行增強(qiáng)保護(hù),下一步將考慮Linux的無(wú)源代碼無(wú)文檔的遺留信息系統(tǒng)安全增強(qiáng)及Web信息系統(tǒng)安全增強(qiáng)等。