趙曉華 趙天耳 劉京京
摘? 要:嵌入式設(shè)備應用廣泛,具有存儲容量低、實時性要求高等特點??紤]在滿足嵌入式設(shè)備速度、尺寸和功耗等方面要求的同時,保證重要文件內(nèi)容不被泄露是值得探究的問題。針對該問題提出一種點虛擬化技術(shù)實現(xiàn)文件保護的方法,實現(xiàn)重要文件的保護,防止非法用戶靜態(tài)分析、防動態(tài)調(diào)試、防進程的內(nèi)存拷貝,提高設(shè)備安全性,對系統(tǒng)性能影響不高。
關(guān)鍵詞:嵌入式設(shè)備;點虛擬化技術(shù);文件保護;內(nèi)存拷貝
中圖分類號:TP309 ? ? ?文獻標識碼:A 文章編號: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)近幾年來已成為研究熱點,目前正在開發(fā)的嵌入式系統(tǒng)中有近50%的系統(tǒng)選用Linux作為嵌入式操作系統(tǒng)。目前在Linux平臺上并沒有很好的工具保證數(shù)據(jù)的安全性。筆者參與系統(tǒng)內(nèi)核安全研究,研究嵌入式系統(tǒng)中如何在不影響系統(tǒng)性能的情況下實現(xiàn)文件保護。目前常用的方法為加密,重要文件在發(fā)布前進行加密,運行時進行解密,運行結(jié)束后刪除文件。但在程序加載時磁盤上為明文數(shù)據(jù),容易被入侵者捕獲。本文提出一種基于點虛擬化技術(shù)實現(xiàn)的安全保護策略,自定義實現(xiàn)Linux系統(tǒng)的內(nèi)核模塊機制,可以實現(xiàn)防止非法用戶靜態(tài)分析、防動態(tài)調(diào)試、防進程的內(nèi)存拷貝,多方面保護文件的安全性。
嵌入式Linux是將Linux系統(tǒng)進行修改,使之能在嵌入式計算機系統(tǒng)上運行的一種操作系統(tǒng)[1]。嵌入式Linux內(nèi)核開源,可支持X86、PowerPC、ARM、XSCALE、MIPS、SH、68K、Alpha、SPARC等多種體系結(jié)構(gòu),并且可以移植到多種硬件平臺上,在嵌入式設(shè)備中,占用資源更少、運行更穩(wěn)定、速度更快[2]。
Linux具有獨特的內(nèi)核模塊機制,可以根據(jù)用戶需要實時添加或移除某些模塊,為嵌入式設(shè)備的功能補充完善提供了便利。但是Linux的高可用性、實時性對修改提出了更高要求[3]。為了實現(xiàn)嵌入式Linux系統(tǒng)重要文件的保護,本文提出基于虛擬化技術(shù),在實現(xiàn)重要文件保護的同時,又不影響系統(tǒng)性能。
1? 相關(guān)技術(shù)概述
1.1? 密碼算法
對稱密碼算法(Symmetric Cryptographic Algorithm)又稱傳統(tǒng)密碼算法(Conventional Cryptographic Algorithm),加密密鑰和解密密鑰相同。
非對稱密碼算法(Asymmetric Cryptographic Algorithm),加密密鑰和解密密鑰不同,從一個密鑰很難推斷出另一個密鑰。非對稱密碼算法又稱為公開密鑰算法(Public Key Algrorithm)。公開密鑰算法用一個密鑰進行加密,而用另一個進行解密。加密密鑰可以公開,又稱公鑰,解密秘鑰必須保密,又稱私鑰[4]。
本文對加解密算法不做詳細探究,選用對稱密碼算法。
1.2? 虛擬化技術(shù)
虛擬化技術(shù)通常是指計算機在虛擬環(huán)境工作,可以有效解決資源緊張問題,在資源有限的情況下,根據(jù)不同用戶需求制定合理的使用方案,可大大提升系統(tǒng)的靈活性,可用性,提高系統(tǒng)安全性。虛擬化技術(shù)按照領(lǐng)域不同的應用進行劃分,可以分為服務器虛擬化、展現(xiàn)層虛擬化、桌面虛擬化和應用程序虛擬化。按照虛擬化程度的不同,可劃分為全虛擬化(Full Virtualization)、部分虛擬化(Partial Virtualization)、半虛擬化(Para-Virtualization)。按照層次不同,虛擬化包含硬件虛擬化和操作系統(tǒng)虛擬化。
1.2.1? 全虛擬化
全虛擬化下把虛擬平臺當作物理平臺,工作在虛擬平臺上的操作系統(tǒng)和運行在真實硬件之上是一樣的。用戶不需要通過虛擬機[5]就可以實現(xiàn)平臺共享,但是缺乏靈活性。
1.2.2? 部分虛擬化
部分虛擬化僅僅提供關(guān)鍵性計算組件或者指令集的模擬。操作系統(tǒng)需要做某些修改才能運行在部分虛擬化環(huán)境中[6]。
1.2.3? 半虛擬化
半虛擬化不對硬件進行模擬,虛擬機擁有獨立的運行環(huán)境,通過虛擬機管理程序共享底層的硬件資源。操作系統(tǒng)需要修改才能運行在半虛擬化環(huán)境中[7]。這種模式下,系統(tǒng)從不必要的工作中解放出來,最大限度的減少處理開銷,實現(xiàn)性能提升。
2? 文件保護的實現(xiàn)過程
2.1? 點虛擬化技術(shù)
Linux具有獨特的內(nèi)核模塊機制,可以利用內(nèi)核模塊添加系統(tǒng)調(diào)用。內(nèi)核模塊雖然是內(nèi)核的一部分,但是它是獨立于內(nèi)核存在的。內(nèi)核模塊至少包含init_module和cleanup_module兩個函數(shù),分別為初始化函數(shù)和卸載函數(shù)。在內(nèi)核模塊中添加系統(tǒng)調(diào)用步驟如下:
(1)Linux在2.4.8版本以后的內(nèi)核不再導出符號sys_call_table,可通過兩個文件vmlinuz和system.map獲得sys_call_table的地址。在模塊初始化函數(shù)init_module中通過grepsys_call_table /boot/System.map獲得sys_call_table的地址,在cleanup_module模塊恢復原有的系統(tǒng)調(diào)用指針。
(2)在/fs/file.c和file.h中定義一個導出函數(shù)以實現(xiàn)交互,使用*sys_out = (unsigned long)sys_call_table;獨立模塊從內(nèi)核獲取系統(tǒng)函數(shù)指針表。
(3)通過dh_guard_ptr = (void**)ko_in;將獨立內(nèi)核模塊的函數(shù)的功能函數(shù)指針表傳遞給內(nèi)核。
(4)定義struct _SAX_OPERATOR結(jié)構(gòu)體描述進程,包括進程操作的文件fname,授權(quán)操作的程序文件名op,進程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)體描述被加載的文件,受保護的文件打開后的文件指針*exe和表示該文件是否需要解密的標識字段noCrypt。struct_MY_FILE_INFO結(jié)構(gòu)體為:
typedefstruct _MY_FILE_INFO
{
struct file *exe;
charnoCrypt;
}MY_FILE_INFO;
(5)當某一進程對文件進行操作時,MY_FILE_INFO判斷文件是否需要解密,如果文件需要解密,則設(shè)置文件指針*exe。在fs/exec.c的do_execve方法中使用filename->name和our_process=current->pid獲取進程名和進程id,若是授權(quán)進程,將進程操作的文件fname,授權(quán)操作的程序文件名op,進程id記錄到SAX_OPERATOR中,并返回加密文件對應文件的屬性或解密后的明文數(shù)據(jù)。
上述步驟中,文件的解密和信息讀取等操作由獨立內(nèi)核模塊實現(xiàn),虛擬文件操作步驟。也稱為點虛擬化技術(shù)。
文件保護借助于點虛擬化技術(shù),通過內(nèi)核獨立模塊程序讀取文件,可以防止非法用戶靜態(tài)反編譯、防止動態(tài)調(diào)試獲取信息、隱藏進程實現(xiàn)防止進程的內(nèi)存拷貝,在提高安全性的同時,不影響系統(tǒng)性能。
2.2? 獨立模塊讀取文件
Linux內(nèi)核模塊文件(Kernal Object)的意義在于將內(nèi)核的功能移到內(nèi)核外邊,需要的時候插入內(nèi)核,不需要時卸載即可。這樣的好處在于縮小內(nèi)核體積,同時不用開源獨立模塊代碼。在點虛擬化的基礎(chǔ)上,不影響系統(tǒng)性能的前提下,進程訪問文件的流程如圖1所示。
在獨立模塊中實現(xiàn)文件保護流程主要包括文件發(fā)布前的加密,訪問過程中的權(quán)限判定,以下為具體內(nèi)容:
(1)重要文件在發(fā)布前,采用對稱密碼算法對文件進行加密,并在其文件描述符中增加重要文件標識。
(2)啟動系統(tǒng)加載獨立的內(nèi)核模塊,獨立內(nèi)核模塊從內(nèi)核獲取解密密鑰和加密文件路徑。
(3)當進程對文件進行操作時,由內(nèi)核跳轉(zhuǎn)到獨立內(nèi)核模塊進行分析。若是授權(quán)進程,且為重要文件,則獨立內(nèi)存模塊會返回重要文件的屬性查詢信息及解密后的明文數(shù)據(jù)。其中,授權(quán)進程采用配置表方式進行配置。
經(jīng)過測試,這種方法幾乎不影響系統(tǒng)性能,同時可以實現(xiàn)文件保護。
2.3? 防止靜態(tài)反編譯
目前常用的防止靜態(tài)反編譯的方法,通常包括代碼混淆、代碼加密、智能壓縮等策略。簡單的靜態(tài)反編譯策略是對程序加殼,但是加殼程序的運行依賴于自身的解密,容易被逆向破解,安全性不高。本文中將待發(fā)布的文件加密,然后為加密文件配置授權(quán)進程,只有授權(quán)進程訪問時才會返回文件的屬性和解密之后的明文數(shù)據(jù),防止數(shù)據(jù)被靜態(tài)反編譯。
2.4? 防動態(tài)調(diào)試
首先通過vm_mmap獲取受保護程序的進程id到受保護進程數(shù)組,然后在do_filp_open函數(shù)中,函數(shù)原型為structfile*do_filp_open(intdfd,constchar*pathname,intopen_flag,intmode,intacc_mode),該函數(shù)會進行一系列flag和mode標志位的檢查,之后調(diào)用path_init()函數(shù)進行后續(xù)操作的初始化工作。在函數(shù)path_init內(nèi)部,判斷*pathname是否為保護進程id的路徑,如果是,在kernal/exit.c中do_exit函數(shù)完成進程終止的任務,并置regs->regs[0] = 0。
2.5? 防進程的內(nèi)存拷貝
眾所周知,進程是在內(nèi)存中運行的,而內(nèi)存中的數(shù)據(jù)又都寫入到/proc/*目錄下,可以通過隱藏/proc目錄中的文件實現(xiàn)防止進程的內(nèi)存拷貝。為了防止進程的內(nèi)存被拷貝,在fs/exec.c的do_execve方法中使用filename->name和our_process=current->pid獲取進程名和進程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實現(xiàn)進程的隱藏。通過這種方式,在/proc目錄下無法查看進程路徑,也就無法拷貝內(nèi)存數(shù)據(jù)。
3? 結(jié)? 論
本文采用點虛擬化技術(shù),并從防止靜態(tài)反編譯、防動態(tài)調(diào)試、防進程的內(nèi)存拷貝等多角度、多層次實現(xiàn)文件保護,防止重要文件信息泄露。該方法專門針對嵌入式設(shè)備開發(fā),滿足嵌入式特點需求,兼容性好,對系統(tǒng)性能影響不大。本文選用的加密算法為常用的對稱加密算法,沒有對加密算法進行深層研究,在今后的實際研究工作中可以使用更為復雜的加密算法,進一步保護文件的安全。
參考文獻:
[1] 張同光.嵌入式系統(tǒng)實用教程 [M].北京:電子工業(yè)出版社,2009.
[2] 孫瓊.嵌入式Linux應用程序開發(fā)詳解 [M].北京:人民郵電出版社,2006.
[3] 彭艦,陳良銀.嵌入式系統(tǒng)設(shè)計 [M].重慶:重慶大學出版社,2008.
[4] 崔愛國.電子商務安全與支付 [M].北京:電子工業(yè)出版社,2010.
[5] sunny725216.Linux操作系統(tǒng)及平臺虛擬化技術(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.【虛擬機】虛擬化技術(shù)以及KVM、QEMU與libvirt介紹 [EB/OL].(2013-08-30).https://blog.csdn.net/zwan 0518/article/details/10613481.
作者簡介:趙曉華(1990—),女,漢族,河南濮陽人,講師,碩士,研究方向:智能信息處理,軟件開發(fā);趙天耳(1996—),女,漢族,河南鄭州人,工程師,本科,研究方向:操作系統(tǒng)安全;劉京京(1990—),女,漢族,河南開封人,助教,碩士,研究方向:圖像加密。