趙曉華 趙天耳 劉京京
摘? 要:嵌入式設(shè)備應(yīng)用廣泛,具有存儲(chǔ)容量低、實(shí)時(shí)性要求高等特點(diǎn)。考慮在滿足嵌入式設(shè)備速度、尺寸和功耗等方面要求的同時(shí),保證重要文件內(nèi)容不被泄露是值得探究的問(wèn)題。針對(duì)該問(wèn)題提出一種點(diǎn)虛擬化技術(shù)實(shí)現(xiàn)文件保護(hù)的方法,實(shí)現(xiàn)重要文件的保護(hù),防止非法用戶靜態(tài)分析、防動(dòng)態(tài)調(diào)試、防進(jìn)程的內(nèi)存拷貝,提高設(shè)備安全性,對(duì)系統(tǒng)性能影響不高。
關(guān)鍵詞:嵌入式設(shè)備;點(diǎn)虛擬化技術(shù);文件保護(hù);內(nèi)存拷貝
中圖分類號(hào):TP309 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2021)01-0146-03
Application of Point Virtualization Technology in Embedded Device to
Realize File Protection
ZHAO Xiaohua1,ZHAO Tianer2,LIU Jingjing3
(1.Henan University Minsheng College,Kaifeng? 475001,China;2.Hangzhou Shuanxiang Software Co.,Ltd.,Hangzhou? 311100,China;3.Kaifeng Vocational College of Culture and Arts,Kaifeng? 475001,China)
Abstract:Embedded devices are widely used,with low storage capacity and high real-time requirements. While meeting the requirements of speed,size and power consumption of embedded devices,it is worth exploring to ensure that the contents of important files are not leaked. To solve the problem,proposes a method of file protection based on point virtualization technology,which can protect important files,prevent illegal users from static analysis,dynamic debugging,memory copy of process,and improve device security,and the impact on system performance is not high.
Keywords:embedded device;point virtualization technology;file protection;memory copy
0? 引? 言
嵌入式Linux系統(tǒng)近幾年來(lái)已成為研究熱點(diǎn),目前正在開發(fā)的嵌入式系統(tǒng)中有近50%的系統(tǒng)選用Linux作為嵌入式操作系統(tǒng)。目前在Linux平臺(tái)上并沒有很好的工具保證數(shù)據(jù)的安全性。筆者參與系統(tǒng)內(nèi)核安全研究,研究嵌入式系統(tǒng)中如何在不影響系統(tǒng)性能的情況下實(shí)現(xiàn)文件保護(hù)。目前常用的方法為加密,重要文件在發(fā)布前進(jìn)行加密,運(yùn)行時(shí)進(jìn)行解密,運(yùn)行結(jié)束后刪除文件。但在程序加載時(shí)磁盤上為明文數(shù)據(jù),容易被入侵者捕獲。本文提出一種基于點(diǎn)虛擬化技術(shù)實(shí)現(xiàn)的安全保護(hù)策略,自定義實(shí)現(xiàn)Linux系統(tǒng)的內(nèi)核模塊機(jī)制,可以實(shí)現(xiàn)防止非法用戶靜態(tài)分析、防動(dòng)態(tài)調(diào)試、防進(jìn)程的內(nèi)存拷貝,多方面保護(hù)文件的安全性。
嵌入式Linux是將Linux系統(tǒng)進(jìn)行修改,使之能在嵌入式計(jì)算機(jī)系統(tǒng)上運(yùn)行的一種操作系統(tǒng)[1]。嵌入式Linux內(nèi)核開源,可支持X86、PowerPC、ARM、XSCALE、MIPS、SH、68K、Alpha、SPARC等多種體系結(jié)構(gòu),并且可以移植到多種硬件平臺(tái)上,在嵌入式設(shè)備中,占用資源更少、運(yùn)行更穩(wěn)定、速度更快[2]。
Linux具有獨(dú)特的內(nèi)核模塊機(jī)制,可以根據(jù)用戶需要實(shí)時(shí)添加或移除某些模塊,為嵌入式設(shè)備的功能補(bǔ)充完善提供了便利。但是Linux的高可用性、實(shí)時(shí)性對(duì)修改提出了更高要求[3]。為了實(shí)現(xiàn)嵌入式Linux系統(tǒng)重要文件的保護(hù),本文提出基于虛擬化技術(shù),在實(shí)現(xiàn)重要文件保護(hù)的同時(shí),又不影響系統(tǒng)性能。
1? 相關(guān)技術(shù)概述
1.1? 密碼算法
對(duì)稱密碼算法(Symmetric Cryptographic Algorithm)又稱傳統(tǒng)密碼算法(Conventional Cryptographic Algorithm),加密密鑰和解密密鑰相同。
非對(duì)稱密碼算法(Asymmetric Cryptographic Algorithm),加密密鑰和解密密鑰不同,從一個(gè)密鑰很難推斷出另一個(gè)密鑰。非對(duì)稱密碼算法又稱為公開密鑰算法(Public Key Algrorithm)。公開密鑰算法用一個(gè)密鑰進(jìn)行加密,而用另一個(gè)進(jìn)行解密。加密密鑰可以公開,又稱公鑰,解密秘鑰必須保密,又稱私鑰[4]。
本文對(duì)加解密算法不做詳細(xì)探究,選用對(duì)稱密碼算法。
1.2? 虛擬化技術(shù)
虛擬化技術(shù)通常是指計(jì)算機(jī)在虛擬環(huán)境工作,可以有效解決資源緊張問(wèn)題,在資源有限的情況下,根據(jù)不同用戶需求制定合理的使用方案,可大大提升系統(tǒng)的靈活性,可用性,提高系統(tǒng)安全性。虛擬化技術(shù)按照領(lǐng)域不同的應(yīng)用進(jìn)行劃分,可以分為服務(wù)器虛擬化、展現(xiàn)層虛擬化、桌面虛擬化和應(yīng)用程序虛擬化。按照虛擬化程度的不同,可劃分為全虛擬化(Full Virtualization)、部分虛擬化(Partial Virtualization)、半虛擬化(Para-Virtualization)。按照層次不同,虛擬化包含硬件虛擬化和操作系統(tǒng)虛擬化。
1.2.1? 全虛擬化
全虛擬化下把虛擬平臺(tái)當(dāng)作物理平臺(tái),工作在虛擬平臺(tái)上的操作系統(tǒng)和運(yùn)行在真實(shí)硬件之上是一樣的。用戶不需要通過(guò)虛擬機(jī)[5]就可以實(shí)現(xiàn)平臺(tái)共享,但是缺乏靈活性。
1.2.2? 部分虛擬化
部分虛擬化僅僅提供關(guān)鍵性計(jì)算組件或者指令集的模擬。操作系統(tǒng)需要做某些修改才能運(yùn)行在部分虛擬化環(huán)境中[6]。
1.2.3? 半虛擬化
半虛擬化不對(duì)硬件進(jìn)行模擬,虛擬機(jī)擁有獨(dú)立的運(yùn)行環(huán)境,通過(guò)虛擬機(jī)管理程序共享底層的硬件資源。操作系統(tǒng)需要修改才能運(yùn)行在半虛擬化環(huán)境中[7]。這種模式下,系統(tǒng)從不必要的工作中解放出來(lái),最大限度的減少處理開銷,實(shí)現(xiàn)性能提升。
2? 文件保護(hù)的實(shí)現(xiàn)過(guò)程
2.1? 點(diǎn)虛擬化技術(shù)
Linux具有獨(dú)特的內(nèi)核模塊機(jī)制,可以利用內(nèi)核模塊添加系統(tǒng)調(diào)用。內(nèi)核模塊雖然是內(nèi)核的一部分,但是它是獨(dú)立于內(nèi)核存在的。內(nèi)核模塊至少包含init_module和cleanup_module兩個(gè)函數(shù),分別為初始化函數(shù)和卸載函數(shù)。在內(nèi)核模塊中添加系統(tǒng)調(diào)用步驟如下:
(1)Linux在2.4.8版本以后的內(nèi)核不再導(dǎo)出符號(hào)sys_call_table,可通過(guò)兩個(gè)文件vmlinuz和system.map獲得sys_call_table的地址。在模塊初始化函數(shù)init_module中通過(guò)grepsys_call_table /boot/System.map獲得sys_call_table的地址,在cleanup_module模塊恢復(fù)原有的系統(tǒng)調(diào)用指針。
(2)在/fs/file.c和file.h中定義一個(gè)導(dǎo)出函數(shù)以實(shí)現(xiàn)交互,使用*sys_out = (unsigned long)sys_call_table;獨(dú)立模塊從內(nèi)核獲取系統(tǒng)函數(shù)指針表。
(3)通過(guò)dh_guard_ptr = (void**)ko_in;將獨(dú)立內(nèi)核模塊的函數(shù)的功能函數(shù)指針表傳遞給內(nèi)核。
(4)定義struct _SAX_OPERATOR結(jié)構(gòu)體描述進(jìn)程,包括進(jìn)程操作的文件fname,授權(quán)操作的程序文件名op,進(jìn)程id。struct _SAX_OPERATOR結(jié)構(gòu)體為:
typedefstruct _SAX_OPERATOR
{
charfname[256];
char op[256];
PID? id;
}SAX_OPERATOR, *PSAX_OPERATOR;
定義結(jié)構(gòu)體struct _MY_FILE_INFO結(jié)構(gòu)體描述被加載的文件,受保護(hù)的文件打開后的文件指針*exe和表示該文件是否需要解密的標(biāo)識(shí)字段noCrypt。struct_MY_FILE_INFO結(jié)構(gòu)體為:
typedefstruct _MY_FILE_INFO
{
struct file *exe;
charnoCrypt;
}MY_FILE_INFO;
(5)當(dāng)某一進(jìn)程對(duì)文件進(jìn)行操作時(shí),MY_FILE_INFO判斷文件是否需要解密,如果文件需要解密,則設(shè)置文件指針*exe。在fs/exec.c的do_execve方法中使用filename->name和our_process=current->pid獲取進(jìn)程名和進(jìn)程id,若是授權(quán)進(jìn)程,將進(jìn)程操作的文件fname,授權(quán)操作的程序文件名op,進(jìn)程id記錄到SAX_OPERATOR中,并返回加密文件對(duì)應(yīng)文件的屬性或解密后的明文數(shù)據(jù)。
上述步驟中,文件的解密和信息讀取等操作由獨(dú)立內(nèi)核模塊實(shí)現(xiàn),虛擬文件操作步驟。也稱為點(diǎn)虛擬化技術(shù)。
文件保護(hù)借助于點(diǎn)虛擬化技術(shù),通過(guò)內(nèi)核獨(dú)立模塊程序讀取文件,可以防止非法用戶靜態(tài)反編譯、防止動(dòng)態(tài)調(diào)試獲取信息、隱藏進(jìn)程實(shí)現(xiàn)防止進(jìn)程的內(nèi)存拷貝,在提高安全性的同時(shí),不影響系統(tǒng)性能。
2.2? 獨(dú)立模塊讀取文件
Linux內(nèi)核模塊文件(Kernal Object)的意義在于將內(nèi)核的功能移到內(nèi)核外邊,需要的時(shí)候插入內(nèi)核,不需要時(shí)卸載即可。這樣的好處在于縮小內(nèi)核體積,同時(shí)不用開源獨(dú)立模塊代碼。在點(diǎn)虛擬化的基礎(chǔ)上,不影響系統(tǒng)性能的前提下,進(jìn)程訪問(wèn)文件的流程如圖1所示。
在獨(dú)立模塊中實(shí)現(xiàn)文件保護(hù)流程主要包括文件發(fā)布前的加密,訪問(wèn)過(guò)程中的權(quán)限判定,以下為具體內(nèi)容:
(1)重要文件在發(fā)布前,采用對(duì)稱密碼算法對(duì)文件進(jìn)行加密,并在其文件描述符中增加重要文件標(biāo)識(shí)。
(2)啟動(dòng)系統(tǒng)加載獨(dú)立的內(nèi)核模塊,獨(dú)立內(nèi)核模塊從內(nèi)核獲取解密密鑰和加密文件路徑。
(3)當(dāng)進(jìn)程對(duì)文件進(jìn)行操作時(shí),由內(nèi)核跳轉(zhuǎn)到獨(dú)立內(nèi)核模塊進(jìn)行分析。若是授權(quán)進(jìn)程,且為重要文件,則獨(dú)立內(nèi)存模塊會(huì)返回重要文件的屬性查詢信息及解密后的明文數(shù)據(jù)。其中,授權(quán)進(jìn)程采用配置表方式進(jìn)行配置。
經(jīng)過(guò)測(cè)試,這種方法幾乎不影響系統(tǒng)性能,同時(shí)可以實(shí)現(xiàn)文件保護(hù)。
2.3? 防止靜態(tài)反編譯
目前常用的防止靜態(tài)反編譯的方法,通常包括代碼混淆、代碼加密、智能壓縮等策略。簡(jiǎn)單的靜態(tài)反編譯策略是對(duì)程序加殼,但是加殼程序的運(yùn)行依賴于自身的解密,容易被逆向破解,安全性不高。本文中將待發(fā)布的文件加密,然后為加密文件配置授權(quán)進(jìn)程,只有授權(quán)進(jìn)程訪問(wèn)時(shí)才會(huì)返回文件的屬性和解密之后的明文數(shù)據(jù),防止數(shù)據(jù)被靜態(tài)反編譯。
2.4? 防動(dòng)態(tài)調(diào)試
首先通過(guò)vm_mmap獲取受保護(hù)程序的進(jìn)程id到受保護(hù)進(jìn)程數(shù)組,然后在do_filp_open函數(shù)中,函數(shù)原型為structfile*do_filp_open(intdfd,constchar*pathname,intopen_flag,intmode,intacc_mode),該函數(shù)會(huì)進(jìn)行一系列flag和mode標(biāo)志位的檢查,之后調(diào)用path_init()函數(shù)進(jìn)行后續(xù)操作的初始化工作。在函數(shù)path_init內(nèi)部,判斷*pathname是否為保護(hù)進(jìn)程id的路徑,如果是,在kernal/exit.c中do_exit函數(shù)完成進(jìn)程終止的任務(wù),并置regs->regs[0] = 0。
2.5? 防進(jìn)程的內(nèi)存拷貝
眾所周知,進(jìn)程是在內(nèi)存中運(yùn)行的,而內(nèi)存中的數(shù)據(jù)又都寫入到/proc/*目錄下,可以通過(guò)隱藏/proc目錄中的文件實(shí)現(xiàn)防止進(jìn)程的內(nèi)存拷貝。為了防止進(jìn)程的內(nèi)存被拷貝,在fs/exec.c的do_execve方法中使用filename->name和our_process=current->pid獲取進(jìn)程名和進(jìn)程id,do_execve方法為:
int do_execve(struct filename *filename,
const char __user *const __user *__argv,
const char __user *const __user *__envp)
{
struct user_arg_ptr argv = { .ptr.native = __argv };
struct user_arg_ptr envp = { .ptr.native = __envp };
int ret = 0;
{
static char test[] = "/share/zserver";
char pname[300] = {0};
char param[300] = {0};
if((!filename->name) || (strlen(filename->name) > 256))
return do_execve_common(filename, argv, envp);
if(filename->name[0] == '.')
{
if(get_current_dir(pname))
return do_execve_common(filename, argv, envp);
strcat(pname, filename->name+1);
}
else
memcpy(pname, filename->name, strlen(filename ->name));
if(strlen(pname) == strlen(test) && strstr(pname, test))
{
our_process = current->pid;
sprintf(param, "id=%06d uid=%d\n", current->pid, current->parent->pid);
writeDahuaLog("(1)", pname, param);
}
}
ret = do_execve_common(filename, argv, envp);
return ret;
}
然后在/src/fs/proc/base.cexternintour_process實(shí)現(xiàn)進(jìn)程的隱藏。通過(guò)這種方式,在/proc目錄下無(wú)法查看進(jìn)程路徑,也就無(wú)法拷貝內(nèi)存數(shù)據(jù)。
3? 結(jié)? 論
本文采用點(diǎn)虛擬化技術(shù),并從防止靜態(tài)反編譯、防動(dòng)態(tài)調(diào)試、防進(jìn)程的內(nèi)存拷貝等多角度、多層次實(shí)現(xiàn)文件保護(hù),防止重要文件信息泄露。該方法專門針對(duì)嵌入式設(shè)備開發(fā),滿足嵌入式特點(diǎn)需求,兼容性好,對(duì)系統(tǒng)性能影響不大。本文選用的加密算法為常用的對(duì)稱加密算法,沒有對(duì)加密算法進(jìn)行深層研究,在今后的實(shí)際研究工作中可以使用更為復(fù)雜的加密算法,進(jìn)一步保護(hù)文件的安全。
參考文獻(xiàn):
[1] 張同光.嵌入式系統(tǒng)實(shí)用教程 [M].北京:電子工業(yè)出版社,2009.
[2] 孫瓊.嵌入式Linux應(yīng)用程序開發(fā)詳解 [M].北京:人民郵電出版社,2006.
[3] 彭艦,陳良銀.嵌入式系統(tǒng)設(shè)計(jì) [M].重慶:重慶大學(xué)出版社,2008.
[4] 崔愛國(guó).電子商務(wù)安全與支付 [M].北京:電子工業(yè)出版社,2010.
[5] sunny725216.Linux操作系統(tǒng)及平臺(tái)虛擬化技術(shù)漫談 [EB/OL].(2011-12-25).https://blog.csdn.net/weixin_33859665/article/details/92113157.
[6] likaiwalkman_Victor. Linux vm [EB/OL].(2015-01-19).https://blog.csdn.net/likaiwalkman/article/details/42874353.
[7] zwan0518.【虛擬機(jī)】虛擬化技術(shù)以及KVM、QEMU與libvirt介紹 [EB/OL].(2013-08-30).https://blog.csdn.net/zwan 0518/article/details/10613481.
作者簡(jiǎn)介:趙曉華(1990—),女,漢族,河南濮陽(yáng)人,講師,碩士,研究方向:智能信息處理,軟件開發(fā);趙天耳(1996—),女,漢族,河南鄭州人,工程師,本科,研究方向:操作系統(tǒng)安全;劉京京(1990—),女,漢族,河南開封人,助教,碩士,研究方向:圖像加密。