嵌入式设备中点虚拟化技术实现文件保护的应用

2021-06-28 00:42赵晓华赵天耳刘京京
现代信息科技 2021年1期

赵晓华 赵天耳 刘京京

摘  要:嵌入式设备应用广泛,具有存储容量低、实时性要求高等特点。考虑在满足嵌入式设备速度、尺寸和功耗等方面要求的同时,保证重要文件内容不被泄露是值得探究的问题。针对该问题提出一种点虚拟化技术实现文件保护的方法,实现重要文件的保护,防止非法用户静态分析、防动态调试、防进程的内存拷贝,提高设备安全性,对系统性能影响不高。

关键词:嵌入式设备;点虚拟化技术;文件保护;内存拷贝

中图分类号: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系統近几年来已成为研究热点,目前正在开发的嵌入式系统中有近50%的系统选用Linux作为嵌入式操作系统。目前在Linux平台上并没有很好的工具保证数据的安全性。笔者参与系统内核安全研究,研究嵌入式系统中如何在不影响系统性能的情况下实现文件保护。目前常用的方法为加密,重要文件在发布前进行加密,运行时进行解密,运行结束后删除文件。但在程序加载时磁盘上为明文数据,容易被入侵者捕获。本文提出一种基于点虚拟化技术实现的安全保护策略,自定义实现Linux系统的内核模块机制,可以实现防止非法用户静态分析、防动态调试、防进程的内存拷贝,多方面保护文件的安全性。

嵌入式Linux是将Linux系统进行修改,使之能在嵌入式计算机系统上运行的一种操作系统[1]。嵌入式Linux内核开源,可支持X86、PowerPC、ARM、XSCALE、MIPS、SH、68K、Alpha、SPARC等多种体系结构,并且可以移植到多种硬件平台上,在嵌入式设备中,占用资源更少、运行更稳定、速度更快[2]。

Linux具有独特的内核模块机制,可以根据用户需要实时添加或移除某些模块,为嵌入式设备的功能补充完善提供了便利。但是Linux的高可用性、实时性对修改提出了更高要求[3]。为了实现嵌入式Linux系统重要文件的保护,本文提出基于虚拟化技术,在实现重要文件保护的同时,又不影响系统性能。

1  相关技术概述

1.1  密码算法

对称密码算法(Symmetric Cryptographic Algorithm)又称传统密码算法(Conventional Cryptographic Algorithm),加密密钥和解密密钥相同。

非对称密码算法(Asymmetric Cryptographic Algorithm),加密密钥和解密密钥不同,从一个密钥很难推断出另一个密钥。非对称密码算法又称为公开密钥算法(Public Key Algrorithm)。公开密钥算法用一个密钥进行加密,而用另一个进行解密。加密密钥可以公开,又称公钥,解密秘钥必须保密,又称私钥[4]。

本文对加解密算法不做详细探究,选用对称密码算法。

1.2  虚拟化技术

虚拟化技术通常是指计算机在虚拟环境工作,可以有效解决资源紧张问题,在资源有限的情况下,根据不同用户需求制定合理的使用方案,可大大提升系统的灵活性,可用性,提高系统安全性。虚拟化技术按照领域不同的应用进行划分,可以分为服务器虚拟化、展现层虚拟化、桌面虚拟化和应用程序虚拟化。按照虚拟化程度的不同,可划分为全虚拟化(Full Virtualization)、部分虚拟化(Partial Virtualization)、半虚拟化(Para-Virtualization)。按照层次不同,虚拟化包含硬件虚拟化和操作系统虚拟化。

1.2.1  全虚拟化

全虚拟化下把虚拟平台当作物理平台,工作在虚拟平台上的操作系统和运行在真实硬件之上是一样的。用户不需要通过虚拟机[5]就可以实现平台共享,但是缺乏灵活性。

1.2.2  部分虚拟化

部分虚拟化仅仅提供关键性计算组件或者指令集的模拟。操作系统需要做某些修改才能运行在部分虚拟化环境中[6]。

1.2.3  半虚拟化

半虚拟化不对硬件进行模拟,虚拟机拥有独立的运行环境,通过虚拟机管理程序共享底层的硬件资源。操作系统需要修改才能运行在半虚拟化环境中[7]。这种模式下,系统从不必要的工作中解放出来,最大限度的减少处理开销,实现性能提升。

2  文件保护的实现过程

2.1  点虚拟化技术

Linux具有独特的内核模块机制,可以利用内核模块添加系统调用。内核模块虽然是内核的一部分,但是它是独立于内核存在的。内核模块至少包含init_module和cleanup_module两个函数,分别为初始化函数和卸载函数。在内核模块中添加系统调用步骤如下:

(1)Linux在2.4.8版本以后的内核不再导出符号sys_call_table,可通过两个文件vmlinuz和system.map获得sys_call_table的地址。在模块初始化函数init_module中通过grepsys_call_table /boot/System.map获得sys_call_table的地址,在cleanup_module模块恢复原有的系统调用指针。

(2)在/fs/file.c和file.h中定义一个导出函数以实现交互,使用*sys_out = (unsigned long)sys_call_table;独立模块从内核获取系统函数指针表。

(3)通过dh_guard_ptr = (void**)ko_in;将独立内核模块的函数的功能函数指针表传递给内核。

(4)定义struct _SAX_OPERATOR结构体描述进程,包括进程操作的文件fname,授权操作的程序文件名op,进程id。struct _SAX_OPERATOR结构体为:

typedefstruct _SAX_OPERATOR

{

charfname[256];

char op[256];

PID  id;

}SAX_OPERATOR, *PSAX_OPERATOR;

定义结构体struct _MY_FILE_INFO结构体描述被加载的文件,受保护的文件打开后的文件指针*exe和表示该文件是否需要解密的标识字段noCrypt。struct_MY_FILE_INFO结构体为:

typedefstruct _MY_FILE_INFO

{

struct file *exe;

charnoCrypt;

}MY_FILE_INFO;

(5)當某一进程对文件进行操作时,MY_FILE_INFO判断文件是否需要解密,如果文件需要解密,则设置文件指针*exe。在fs/exec.c的do_execve方法中使用filename->name和our_process=current->pid获取进程名和进程id,若是授权进程,将进程操作的文件fname,授权操作的程序文件名op,进程id记录到SAX_OPERATOR中,并返回加密文件对应文件的属性或解密后的明文数据。

上述步骤中,文件的解密和信息读取等操作由独立内核模块实现,虚拟文件操作步骤。也称为点虚拟化技术。

文件保护借助于点虚拟化技术,通过内核独立模块程序读取文件,可以防止非法用户静态反编译、防止动态调试获取信息、隐藏进程实现防止进程的内存拷贝,在提高安全性的同时,不影响系统性能。

2.2  独立模块读取文件

Linux内核模块文件(Kernal Object)的意义在于将内核的功能移到内核外边,需要的时候插入内核,不需要时卸载即可。这样的好处在于缩小内核体积,同时不用开源独立模块代码。在点虚拟化的基础上,不影响系统性能的前提下,进程访问文件的流程如图1所示。

在独立模块中实现文件保护流程主要包括文件发布前的加密,访问过程中的权限判定,以下为具体内容:

(1)重要文件在发布前,采用对称密码算法对文件进行加密,并在其文件描述符中增加重要文件标识。

(2)启动系统加载独立的内核模块,独立内核模块从内核获取解密密钥和加密文件路径。

(3)当进程对文件进行操作时,由内核跳转到独立内核模块进行分析。若是授权进程,且为重要文件,则独立内存模块会返回重要文件的属性查询信息及解密后的明文数据。其中,授权进程采用配置表方式进行配置。

经过测试,这种方法几乎不影响系统性能,同时可以实现文件保护。

2.3  防止静态反编译

目前常用的防止静态反编译的方法,通常包括代码混淆、代码加密、智能压缩等策略。简单的静态反编译策略是对程序加壳,但是加壳程序的运行依赖于自身的解密,容易被逆向破解,安全性不高。本文中将待发布的文件加密,然后为加密文件配置授权进程,只有授权进程访问时才会返回文件的属性和解密之后的明文数据,防止数据被静态反编译。

2.4  防动态调试

首先通过vm_mmap获取受保护程序的进程id到受保护进程数组,然后在do_filp_open函数中,函数原型为structfile*do_filp_open(intdfd,constchar*pathname,intopen_flag,intmode,intacc_mode),该函数会进行一系列flag和mode标志位的检查,之后调用path_init()函数进行后续操作的初始化工作。在函数path_init内部,判断*pathname是否为保护进程id的路径,如果是,在kernal/exit.c中do_exit函数完成进程终止的任务,并置regs->regs[0] = 0。

2.5  防进程的内存拷贝

众所周知,进程是在内存中运行的,而内存中的数据又都写入到/proc/*目录下,可以通过隐藏/proc目录中的文件实现防止进程的内存拷贝。为了防止进程的内存被拷贝,在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實现进程的隐藏。通过这种方式,在/proc目录下无法查看进程路径,也就无法拷贝内存数据。

3  结  论

本文采用点虚拟化技术,并从防止静态反编译、防动态调试、防进程的内存拷贝等多角度、多层次实现文件保护,防止重要文件信息泄露。该方法专门针对嵌入式设备开发,满足嵌入式特点需求,兼容性好,对系统性能影响不大。本文选用的加密算法为常用的对称加密算法,没有对加密算法进行深层研究,在今后的实际研究工作中可以使用更为复杂的加密算法,进一步保护文件的安全。

参考文献:

[1] 张同光.嵌入式系统实用教程 [M].北京:电子工业出版社,2009.

[2] 孙琼.嵌入式Linux应用程序开发详解 [M].北京:人民邮电出版社,2006.

[3] 彭舰,陈良银.嵌入式系统设计 [M].重庆:重庆大学出版社,2008.

[4] 崔爱国.电子商务安全与支付 [M].北京:电子工业出版社,2010.

[5] sunny725216.Linux操作系统及平台虚拟化技术漫谈 [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.【虚拟机】虚拟化技术以及KVM、QEMU与libvirt介绍 [EB/OL].(2013-08-30).https://blog.csdn.net/zwan 0518/article/details/10613481.

作者简介:赵晓华(1990—),女,汉族,河南濮阳人,讲师,硕士,研究方向:智能信息处理,软件开发;赵天耳(1996—),女,汉族,河南郑州人,工程师,本科,研究方向:操作系统安全;刘京京(1990—),女,汉族,河南开封人,助教,硕士,研究方向:图像加密。