CN107450964B - 一种用于发现虚拟机自省系统中是否存在漏洞的方法 - Google Patents
一种用于发现虚拟机自省系统中是否存在漏洞的方法 Download PDFInfo
- Publication number
- CN107450964B CN107450964B CN201710680960.0A CN201710680960A CN107450964B CN 107450964 B CN107450964 B CN 107450964B CN 201710680960 A CN201710680960 A CN 201710680960A CN 107450964 B CN107450964 B CN 107450964B
- Authority
- CN
- China
- Prior art keywords
- function
- system call
- virtual machine
- file
- address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/53—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45587—Isolation or security of virtual machine instances
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Debugging And Monitoring (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种用于发现虚拟机自省系统中是否存在漏洞的方法,通过在被更改的Linux虚拟机系统调用函数入口地址处插入特定的jmp指令,如果能够对虚拟机自省系统进行修改,则表示表示虚拟机自省系统存在漏洞,标志着针对虚拟机自省系统动态监控结果可实现人为控制,将虚拟机自省系统的漏洞进一步暴露,为后续相关研究者进一步完善该系统提供了极为重要的参考。
Description
技术领域
本发明属于计算机科学与技术领域,涉及针对虚拟机自省(Virtual MachineIntrospection,简称VMI)系统中系统调用监控结果的修改,通过查看系统调用结果能否实现人为控制,发现系统漏洞,为系统的进一步完善作参考,具体是一种用于发现虚拟机自省系统中是否存在漏洞的方法。
背景技术
虚拟机自省技术由于能够兼顾良好的“隔离性”和“能见度”,成为保护虚拟机安全的重要选择,引起业界广泛的关注和研究。VMI通常运行于虚拟机下面的虚拟机管理器(VMM)层,由于没有运行在被监控的虚拟机内部,所以VMI和虚拟机具有良好的隔离性。同时,VMM为VMI提供了能够直接检查被监控虚拟机的硬件级别状态(比如物理内存页面、寄存器和硬盘等)和事件(比如系统调用和中断等)的能力,并且能基于先前的数据结构和相关知识推断系统软件状态(比如虚拟机内部的当前运行进程列表),所以VMI对于被监控的虚拟机具有较好的“能见度”。
多个基于虚拟机自省的安全系统已经被相继开发出来。比较知名的虚拟机自省系统(或工具)包括开源库LibVMI,佐治亚理工学院开发的XenAccess[Payne et al.,ACSAC2007]和Ether[Dinaburg et al.,ACM CCS 2008],以及慕尼黑工业大学开发的Nitro[Pfohet al.,International Workshop on Security 2011]等。归纳起来,虚拟机自省系统提供的安全功能主要包括两种类型,分别是静态监控功能和动态监控功能。其中,静态监控功能通过在虚拟机外部(VMM层)监控虚拟机内部特定内存页面上的内容实现对虚拟机的安全监控,例如,监控虚拟机内部正在运行的进程列表和已加载的内核模块列表等。动态监控功能则通过在虚拟机外部(VMM层)监控虚拟机内部发生的动态事件实现对虚拟机的安全监控,例如,监控虚拟机的系统调用事件、中断事件等。这些功能为保护虚拟机安全发挥了重要作用。
然而,分析发现,所有的虚拟机自省系统(或工具)在设计时都是基于一个共同的假设前提:假设被监控的虚拟机操作系统按照规定的方式使用标准内核数据模板,其内存页面提供的原始内容或通过虚拟机管理器报告的事件是正确的。而这在实际中并不是绝对的,使用者可以采用各种技术手段修改虚拟机操作系统底层的内核数据、执行流程等来欺骗虚拟机自省工具,实现虚拟机自省系统监控结果的可控制。为此,北卡罗来纳州立大学的Bahram等人开发了DKSM[Bahram et al.,IEEE SRDS2010],实现了可控制结果的虚拟机自省系统静态监控功能。DKSM以XenAccess为实验系统,通过修改Linux虚拟机中保存当前运行进程列表和已加载内核模块的数据结构的特定节点,使得XenAccess监控到错误的结果,由此发现虚拟机自省系统存在漏洞,揭开了人为控制虚拟机自省系统监控结果的序幕,为虚拟机自省系统的进一步完善提供了重要参考。
到目前为止,在虚拟机自省系统中实现监控结果可控制研究仍然处于起步阶段,并没有一个完整成型的设计思路,还未实现针对虚拟机自省系统动态监控结果的可控制。
发明内容
为了弥补现有技术的不足,本发明提出了一种用于发现虚拟机自省系统中是否存在漏洞的方法,该方法通过在虚拟机中插入内核模块实现VMI系统中系统调用动态监控结果,能够使VMI系统在监控64位Linux虚拟机运行时,得到虚假的系统调用监控信息,从而隐藏实验者在虚拟机中实际执行的系统调用操作,达到其修改虚拟机自省系统动态监控功能(系统调用监控)目的,该方法标志着针对虚拟机自省系统动态监控结果可实现人为控制,将虚拟机自省系统的漏洞进一步暴露,为相关研究者进一步完善虚拟机自省系统提供了极为重要的参考。
为了达成上述目的,本发明实现一种用于发现虚拟机自省系统中是否存在漏洞的方法包括如下步骤:
步骤(1):编写用于更改系统调用执行流和隐藏实际系统调用的Linux虚拟机内核模块;
步骤(2):启动Linux虚拟机;
步骤(3):在Linux虚拟机命令行执行make命令,将步骤(1)编写的内核模块编译后生成格式为.ko的文件;
步骤(4):在Linux虚拟机命令行执行插入步骤(3)生成的格式为.ko的文件的命令,插入格式为.ko的文件后,Linux虚拟机通过自动调用格式为.ko的文件,在/proc文件夹下生成虚拟文件;
步骤(5):在步骤(4)生成的虚拟文件中写入目标系统调用号和实际执行的系统调用号,以调用创建虚拟文件函数中虚拟文件的操作函数,找到虚拟文件的操作函数指向的file_operations结构体,触发file_operations结构体中的触发操作函数,实施更改操作;若更改成功,则表示虚拟机自省系统存在漏洞。
所述步骤(1)中,内核模块包括一个数据结构体和七个函数,七个函数为:插入模块函数,删除模块函数,触发操作函数,获取系统调用表函数,操作函数,暂停操作函数,删除操作函数。
所述数据结构的实现过程为:
定义一个宏,将该宏的长度定义为12个字节,其中3到10这八个字节为占位符,在更改操作过程中动态地替换为任意的系统调用基地址,该宏为jmp指令对应的机器码。
插入模块函数的实现过程为:
在Linux虚拟机命令行下执行插入命令插入内核模块时,实际调用插入模块函数,插入模块函数调用创建虚拟文件函数在Linux虚拟机/proc文件夹下创建的一个虚拟文件,应用层通过读写该虚拟文件,实现与内核的交互。
删除模块函数的的实现过程为:
在Linux虚拟机命令行下执行删除命令删除内核模块时,调用删除模块函数,删除模块函数调用文件删除函数删除虚拟文件,并调用删除操作函数停止更改操作。
触发操作函数的实现过程为:
当向虚拟文件中进行写入操作时,系统调用创建虚拟文件函数中配置的文件操作函数,文件操作函数调用file_operations结构体中的触发操作函数;
触发操作函数首先调用获取系统调用表函数得到系统调用表地址,然后调用操作函数实施更改操作;
触发操作函数的返回值代表了成功读取的字节数。
获取系统调用表函数的实现过程为:
步骤4a,定义一个双重指针**entry,双重指针**entry指向内核内存空间起始地址;
步骤4b,令entry作为系统调用表的起始地址;
步骤4c,从内核内存的起始地址开始搜索,将内核内存的起始地址作为系统调用表地址,用其中一个系统调用的编号访问数组中的成员,如果访问得到的值恰好是这个系统调用号所对应的系统调用的地址,则再进行后续判断;
步骤4d,再从内存头部一直搜索到内存尾部,统计所有访问得到的值恰好是系统调用号所对应的系统调用的地址的entry,如果在内存中搜索到一个导出函数,导出函数对应的entry即为系统调用表地址;如果搜索到至少两个导出函数,则罗列出所有导出函数所对应entry附近的内存块,如果其中间隔存在多处0xffffffff这四个字节,说明这些内存块是导出函数的地址;
步骤4e,返回系统调用表地址。
操作函数的实现过程为:
当调用操作函数执行更改操作时,首先调用暂停操作函数暂停该操作,备份原系统调用;然后通过查找系统调用表找到目标系统调用号和实际执行的系统调用号分别对应的系统调用函数入口地址,替换原系统调用函数入口地址,当执行到原系统调用函数入口地址时,通过jmp指令跳转到更改后的系统调用代码并执行。
暂停操作函数用于暂停更改操作,暂停操作函数的实现过程为:
通过查找系统调用表找到目标系统调用号对应的原系统调用函数入口地址,并从执行原系统调用对应的机器码所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到目标原系统调用函数入口地址所指的内存地址的起始位置中,恢复原系统调用,其中,HOOKED_SIZE为执行原系统调用对应的机器码的长度。
删除操作函数的实现过程为:
当执行删除命令卸载Linux虚拟机内核模块时,系统将自动调用删除模块函数,删除模块函数调用删除操作函数删除更改操作,恢复原系统调用;
删除操作函数通过查找系统调用表找到目标系统调用号对应的原系统调用函数入口地址,并从执行原系统调用对应的机器码所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到原系统调用函数入口地址所指的内存地址的起始位置,每个数据结构体都通过list_head结构体进行串联,删除数据结构体并释放其所占的内存空间,恢复原系统调用,其中,HOOKED_SIZE为执行原系统调用对应的机器码的长度。
本发明与现有的技术相比,具有如下的有益效果:
本发明用于发现虚拟机自省系统中是否存在漏洞的方法通过在被更改系统调用函数入口处通过一条jmp指令跳转到预设系统调用代码段并执行,如果能够对虚拟机自省系统进行修改,则表示表示虚拟机自省系统存在漏洞,标志着针对虚拟机自省系统动态监控结果可实现人为控制,将虚拟机自省系统的漏洞进一步暴露,为相关研究者进一步完善虚拟机自省系统提供了极为重要的参考。
附图说明
图1是本发明的用于发现虚拟机自省系统中是否存在漏洞的方法的总流程图;
图2是install_inline_hook()更改操作函数的流程图。
具体实施方式
下面结合附图和实施例来对本发明作进一步的说明。
本发明通过在被更改的Linux虚拟机系统调用函数入口地址处插入特定的jmp指令,让系统跳转到更改后的系统调用代码并执行,从而误导VMI工具,使其得到虚假的系统调用监控信息,隐藏实验人员在虚拟机中实际执行的系统调用操作,达到实验目的,假设该实验能够成功,说明虚拟机自省系统的动态监控功能实现存在一定漏洞,为后续相关研究者进一步完善该系统提供了重要参考。
参照图1,本发明包括五个步骤,其中关键步骤一中需要编写Linux内核模块Ker_Syscall_Attack,该模块主要包括一个重要结构体和七个函数。
本发明具体实施步骤如下:
步骤一、编写Linux虚拟机内核模块Ker_Syscall_Attack,内核模块Ker_Syscall_Attack用于更改系统调用执行流和隐藏实际系统调用;
该内核模块包括一个struct hooked_item数据结构体(和七个函数,七个函数分别为:插入模块函数init_module(),删除模块函数cleanup_module(),触发操作函数write_handler(),获取系统调用表函数get_sct_via_sys_close(),操作函数install_inline_hook(),暂停操作函数pause_inline_hook(),删除操作函数remove_inline_hook(),struct hooked_item数据结构体和七个函数的具体定义如下:
(1.1)struct hooked_item数据结构体中:real_addr字段表示原系统调用(即被更改的系统调用)的入口地址,real_opcode字段表示执行原系统调用对应的机器码,fake_opcode表示jmp指令对应的机器码,list_head为一个串联结构体,list_head结构体包含prev和next指针,用来链接相邻结构体;通过list_head结构体将所有被更改系统调用所存储的hooked_item数据结构体串联在一起。real_opcode fake_opcode长度通过宏HOOKED_SIZE进行定义,宏HOOKED_SIZE的长度为宏BYTES的长度减1;
定义宏BYTES,将BYTES的长度定义为12个字节,其中3到10这八个字节为占位符,在更改操作过程中会动态的替换为任意的系统调用基地址(即函数入口地址),宏BYTES为jmp指令对应的机器码,该处jmp指令完成的功能是:当执行到被更改的系统调用(即实验者想让VMI监控到的系统调用)入口地址时,通过一条jmp指令跳转到更改后的系统调用函数代码并执行。
七个函数分别定义如下:
函数一:插入模块函数int init_module(void)函数
在Linux虚拟机命令行下执行insmod命令插入内核模块时,实际调用插入模块函数init_module(),而插入模块函数init_module()会调用创建虚拟文件函数proc_create(NAME,S_IRUGO|S_IWUGO,NULL,&proc_fops)在Linux虚拟机/proc文件夹下创建一个虚拟文件entry,应用层通过读写虚拟文件entry,即可实现与内核的交互;创建虚拟文件函数proc_create(NAME,S_IRUGO|S_IWUGO,NULL,&proc_fops)的四个参数意义如下:
参数一:NAME表示值为虚拟文件entry的一个宏,即要生成的虚拟文件名;
参数二:S_IRUGO|S_IWUGO表示创建的虚拟文件entry可读可写;
参数三:表示需要在哪个父文件夹下创建该虚拟文件,这里NULL表示在/proc根文件夹下创建该虚拟文件;
参数四:&proc_fops表示虚拟文件entry的操作函数,这里&proc_fops指向file_operations结构体类型变量proc_fops,该变量中包含触发操作函数write_handler();
当需要操作虚拟文件entry时,本发明将在虚拟文件entry中写入两个数字:第一个数字代表实验人员想让VMI监控到的系统调用号(从而隐藏了系统真正执行的系统调用),第二数字代表实验人员实际执行的系统调用号。
函数二、删除模块函数void cleanup_module(void)
在Linux虚拟机命令行下执行rmmod命令删除内核模块时,实际调用删除模块函数cleanup_module(),而删除模块函数cleanup_module()又调用文件删除函数删除虚拟文件entry,并调用删除操作函数remove_inline_hook()停止更改操作。
函数三、触发操作函数ssize_t write_handler(struct file*filp,constchar__user*buff,size_t count,loff_t*offp)
指针参数filp指向要读取的目标文件;
指针参数buffer表示信息缓冲区;
参数count为要读取的信息长度;
指针参数offp为读的位置相对于文件开头的偏移,在读取信息后,这个指针一般都会移动,移动的值为要读取信息的长度值;
函数返回值代表了成功读取的字节数;
当向虚拟文件entry文件中进行写入操作时,系统会调用创建虚拟文件proc_create()中配置的文件操作函数,从而调用proc_fops结构体变量中的触发操作函数write_handler();
触发操作函数体首先调用获取系统调用表函数get_sct_via_sys_close()得到系统调用表地址,然后调用操作函数install_inline_hook()实施更改操作。
函数四、获取系统调用表函数unsigned long**get_sct_via_sys_close(void)
(4a)定义一个双重指针**entry,双重指针**entry指向内核内存空间起始地址;
(4b)因为sys_close()是导出函数,在用户态可以直接得到其地址,所以(unsigned long*)sys_close即表示导出函数sys_close()系统调用的函数入口地址;又因为系统调用号是系统调用表(可看成一维数组)的索引,所以可以直接使用该索引;假设entry是系统调用表起始地址,那么entry[__NR_close]即表示close()系统调用的函数入口地址;
(4c)从内核内存的起始地址开始搜索,假设内核内存的起始地址为系统调用表地址,用某个系统调用的编号(也就是索引)访问数组中的成员,如果访问得到的值恰好是这个系统调用号所对应的系统调用的地址(本发明使用entry[__NR_close]==(unsignedlong*)sys_close进行判断),那么就认为该entry可能就是系统调用表地址,并进行后续判断;
(4d)再从内存头部一直搜索到内存尾部,统计所有访问得到的值恰好是系统调用号所对应的系统调用的地址的entry,后面的实验证明,我们只在内存中搜索到一个导出函数sys_close,该导出函数sys_close对应的entry即为系统调用表地址,因此证明此方法可行。如果搜索到多个导出函数sys_close,则罗列出所有导出函数所对应entry附近的内存块,如果其中间隔存在多处0xffffffff这四个字节,说明这些内存块是导出函数的地址(系统调用的函数入口地址),通过这些特征的匹配来辨别出真正的系统调用表的基地址;
(4e)返回系统调用表地址。
函数五、调用操作函数void install_inline_hook(void real_number,voidfake_number)
参数real_number代表实验人员想让VMI监控到的系统调用号,如果更改不发生,将执行该系统调用;
参数fake_number代表实验人员在虚拟机内实际执行的系统调用号,即Linux虚拟机中实际执行的系统调用号;
当调用调用操作函数install_inline_hook()执行更改时,首先调用暂停操作函数pause_inline_hook()暂停更改操作,备份原系统调用;然后通过查找系统调用表找到real_number、fake_number对应的系统调用函数入口地址*real_addr、*fake_addr,替换原系统调用函数入口地址,当执行到原系统调用函数入口地址时通过jmp指令跳转到更改后的系统调用代码并执行;
详细实现过程如下:
(5a)首先为hooked_item型结构体item分配内存,宏BYTES为jmp指令对应的机器码,宏HOOKED_SIZE长度为BYTES长度减1,宏DELTA为2;
(5b)把被更改的系统调用函数地址赋给item结构体中real_addr项;
(5c)从源real_addr所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到目标real_opcode所指的内存地址的起始位置中;real_opcode表示执行原系统调用函数对应的机器码;
(5d)从源BYTES所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到目标fake_opcode所指的内存地址的起始位置中;fake_opcode表示jmp指令对应的机器码;
(5e)用系统中实际要执行的系统调用的函数地址addr替换fake_opcode中BYTES的第3到10个字节(8字节),形成一条自定义跳转目标的jmp指令,为后续更改操作做准备;
(5f)调用暂停操作函数pause_inline_hook()备份原系统调用;
(5g)关闭内存写保护;
(5h)从源fake_opcode所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到目标real_addr所指的内存地址的起始位置中,使得执行到某个正常系统调用函数入口时经jmp指令跳转到更改后的系统调用并执行;
(5i)开启内存写保护;
函数六、暂停操作函数void pause_inline_hook(void*real_number)
参数real_number代表实验人员想让VMI监控到的系统调用号,如果更改操作不发生,将执行该系统调用;
该函数用于暂停更改操作。通过查找系统调用表找到real_number对应的原系统调用函数入口地址*real_addr,并从real_opcode(执行原系统调用对应的机器码)所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到目标real_addr(原系统调用函数入口地址)所指的内存地址的起始位置中,从而恢复原系统调用。详细实现过程如下:
(6a)循环遍历由list_head结构体进行串联的hooked_item结构体item;
(6b)如果该结构体中的real_addr等于被更改的系统调用函数入口地址,则执行如下步骤:
(6b1)关闭内存写保护;
(6b2)从源real_opcode(执行原系统调用所对应的机器码)所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到目标real_addr所指的内存地址的起始位置中,从而恢复原系统调用,暂停更改操作;
(6b3)开启内存写保护。
函数七、删除操作函数void remove_inline_hook(void*real_number)
参数real_number代表实验人员想让VMI监控到的系统调用号,如果更改操作不发生,将执行该系统调用。
该函数用于删除更改操作,当执行rmmod命令卸载内核模块Ker_Syscall_Attack时,系统将会自动调用删除模块函数cleanup_module(),删除模块函数cleanup_module()会调用删除操作函数remove_inline_hook()删除该操作,恢复原系统调用。该删除操作函数通过查找系统调用表找到real_number对应的原系统调用函数入口地址*real_addr,并从源real_opcode所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到目标real_addr所指的内存地址的起始位置。因为每个数据结构体hooked_item都通过list_head结构体进行串联,所以需删除该节点并释放其所占的内存空间,从而恢复原系统调用,删除更改;
详细实现过程如下:
(7a)循环遍历由list_head结构体进行串联的hooked_item型结构体item;
(7b)如果该结构体中的real_addr等于某个被更改的系统调用函数入口地址,则执行如下步骤:
(7b1)关闭内存写保护;
(7b2)从源real_opcode所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到目标real_addr所指的内存地址的起始位置中,恢复原系统调用;
(7b3)开启内存写保护;
(7b4)因为每个hooked_item型结构体item通过其中的list_head进行串联,所以需删除该节点并释放其所占的内存空间;
步骤二、用KVM虚拟机管理器启动Linux虚拟机;
步骤三、在Linux虚拟机命令行下执行make命令,编译Ker_Syscall_Attack内核模块,生成jmp.ko文件;
步骤四、在Linux虚拟机命令行下执行插入jmp.ko文件的命令insmod jmp.ko,插入内核模块Ker_Syscall_Attack;插入该内核模块时Linux虚拟机自动调用Ker_Syscall_Attack内核模块中的插入模块函数init_module(),在/proc文件夹下生成虚拟文件entry;
步骤五、在虚拟机命令行下执行echo“real_number fake_number”>/proc/entry命令,即在虚拟文件entry中写入数字real_number fake_number,从而调用创建虚拟文件proc_create()中虚拟文件的操作函数&proc_fops,找到虚拟文件的操作函数所指向的结构体file_operations,触发file_operations结构体中的触发操作函数write_handler()实施具体更改操作;若修改成功,则表示虚拟机自省系统存在漏洞。
若修改成功,为了不对虚拟机自省系统造成损害,则可以再在Linux虚拟机命令行下执行删除jmp.ko的命令rmmod jmp.ko,Linux虚拟机自动调用Ker_Syscall_Attack模块中的删除模块函数cleanup_module()卸载该模块,恢复原系统调用,停止更改操作。
本发明的功能效果可以通过以下实验进一步说明。
实验条件
本发明的实验系统为德国慕尼黑工业大学开发的一套虚拟机自省系统Nitro,该系统能实时监控虚拟机内部系统调用信息。Nitro基于KVM实现,包括两部分:内核模块和基于QEMU的用户空间应用程序,KVM的用户空间应用程序为QEMU模拟器,能够实现暂停、重启虚拟机等操作。通过在模拟器中添加指令可以实时监控虚拟机中特定系统调用和所有系统调用。本文硬件平台选用HP公司的HP Pro 3380MT机,处理器为Intel(R)Core(TM)i5-3470CPU@3.20GHz(4CPUs),~3.2GHz,内存为6GB。物理机和虚拟机均使用Ubuntu-12.04-desktop-amd64操作系统,标准安装。
实验内容
向虚拟文件entry文件中写入数字real_number fake_number,本发明以83、84号系统调用为例,在虚拟文件entry中写入数字83、84。通过读取虚拟文件entry分别得到83、84号系统调用mkdir和rmdir函数入口地址,当程序执行到系统调用函数mkdir入口地址时通过jmp指令跳转到rmdir执行。此时,自定义Nitro监控规则,一旦虚拟机中发生83(mkdir)、84(rmdir)号系统调用时就将相应的系统调用信息打印到物理机kern.log中。插入模块进行实验操作,观察Nitro监控结果,测试结果显示Nitro只监控到83号系统调用,并没有监控到虚拟机内部实际发生的84号系统调用。
结果分析
通过上述实验,虚拟机中实际执行的系统调用如84号系统调用(删除目录操作)并不能被Nitro捕获,Nitro仅能捕获到83号系统调用。虚拟机自省系统动态监控结果的可控制研究达到预期目标。
说明虚拟机自省不仅静态监控功能存在漏洞,其动态监控功能也同样存在漏洞,为后续相关研究者进一步完善该系统提供了极为重要的参考。
Claims (8)
1.一种用于发现虚拟机自省系统中是否存在漏洞的方法,其特征在于,包括如下步骤:
步骤(1):编写用于更改系统调用执行流和隐藏实际系统调用的Linux虚拟机内核模块;
步骤(2):启动Linux虚拟机;
步骤(3):在Linux虚拟机命令行执行make命令,将步骤(1)编写的内核模块编译后生成格式为.ko的文件;
步骤(4):在Linux虚拟机命令行执行插入步骤(3)生成的格式为.ko的文件的命令,插入格式为.ko的文件后,Linux虚拟机通过自动调用格式为.ko的文件,在/proc文件夹下生成虚拟文件;
步骤(5):在步骤(4)生成的虚拟文件中写入目标系统调用号和实际执行的系统调用号,以调用创建虚拟文件函数中虚拟文件的操作函数,找到虚拟文件的操作函数指向的file_operations结构体,触发file_operations结构体中的触发操作函数,实施更改操作;若更改成功,则表示虚拟机自省系统存在漏洞;
所述步骤(1)中,内核模块包括一个数据结构体和七个函数,七个函数为:插入模块函数,删除模块函数,触发操作函数,获取系统调用表函数,操作函数,暂停操作函数,删除操作函数;
获取系统调用表函数的实现过程为:
步骤4a,定义一个双重指针**entry,双重指针**entry指向内核内存空间起始地址;
步骤4b,令entry作为系统调用表的起始地址;
步骤4c,从内核内存的起始地址开始搜索,将内核内存的起始地址作为系统调用表地址,用其中一个系统调用的编号访问数组中的成员,如果访问得到的值恰好是这个系统调用号所对应的系统调用的地址,则再进行后续判断;
步骤4d,再从内存头部一直搜索到内存尾部,统计所有访问得到的值恰好是系统调用号所对应的系统调用的地址的entry,如果在内存中搜索到一个导出函数,导出函数对应的entry即为系统调用表地址;如果搜索到至少两个导出函数,则罗列出所有导出函数所对应entry附近的内存块,如果其中间隔存在多处0xffffffff这四个字节,说明这些内存块是导出函数的地址;
步骤4e,返回系统调用表地址。
2.根据权利要求1所述的一种用于发现虚拟机自省系统中是否存在漏洞的方法,其特征在于,所述数据结构体的实现过程为:
定义一个宏,将该宏的长度定义为12个字节,其中3到10这八个字节为占位符,在更改操作过程中动态地替换为任意的系统调用基地址,该宏作为jmp指令对应的机器码。
3.根据权利要求1所述的一种用于发现虚拟机自省系统中是否存在漏洞的方法,其特征在于,插入模块函数的实现过程为:
在Linux虚拟机命令行下执行插入命令插入内核模块时,实际调用插入模块函数,插入模块函数调用创建虚拟文件函数在Linux虚拟机/proc文件夹下创建的一个虚拟文件,应用层通过读写该虚拟文件实现与内核的交互。
4.根据权利要求1所述的一种用于发现虚拟机自省系统中是否存在漏洞的方法,其特征在于,删除模块函数的实现过程为:
在Linux虚拟机命令行下执行删除命令删除内核模块时,调用删除模块函数,删除模块函数调用文件删除函数删除虚拟文件,并调用删除操作函数停止更改操作。
5.根据权利要求1所述的一种用于发现虚拟机自省系统中是否存在漏洞的方法,其特征在于,触发操作函数的实现过程为:
当向虚拟文件中进行写入操作时,系统调用创建虚拟文件函数中配置的文件操作函数,文件操作函数调用file_operations结构体中的触发操作函数;
触发操作函数首先调用获取系统调用表函数得到系统调用表地址,然后调用操作函数实施更改操作。
6.根据权利要求1所述的一种用于发现虚拟机自省系统中是否存在漏洞的方法,其特征在于,操作函数的实现过程为:
当调用操作函数执行更改操作时,首先调用暂停操作函数暂停该操作,备份原系统调用;然后通过查找系统调用表找到目标系统调用号和实际执行的系统调用号分别对应的系统调用函数入口地址,替换原系统调用函数入口地址,当执行到原系统调用函数入口地址时,通过jmp指令跳转到更改后系统调用代码并执行。
7.根据权利要求1所述的一种用于发现虚拟机自省系统中是否存在漏洞的方法,其特征在于,暂停操作函数用于暂停更改操作,暂停操作函数的实现过程为:
暂停操作函数通过查找系统调用表找到目标系统调用号对应的原系统调用函数入口地址,并从执行原系统调用对应的机器码所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到目标原系统调用函数入口地址所指的内存地址的起始位置中,恢复原系统调用,其中,HOOKED_SIZE为执行原系统调用对应的机器码的长度。
8.根据权利要求1所述的一种用于发现虚拟机自省系统中是否存在漏洞的方法,其特征在于,所述删除操作函数的实现过程为:
当执行删除命令卸载Linux虚拟机内核模块时,系统将自动调用删除模块函数,删除模块函数调用删除操作函数删除更改操作,恢复原系统调用;
删除操作函数通过查找系统调用表找到目标系统调用号对应的原系统调用函数入口地址,并从执行原系统调用对应的机器码所指的内存地址的起始位置开始,拷贝HOOKED_SIZE个字节到原系统调用函数入口地址所指的内存地址的起始位置,每个数据结构体都通过list_head结构体进行串联,删除数据结构体并释放其所占的内存空间,恢复原系统调用,其中,HOOKED_SIZE为执行原系统调用对应的机器码的长度。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710680960.0A CN107450964B (zh) | 2017-08-10 | 2017-08-10 | 一种用于发现虚拟机自省系统中是否存在漏洞的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710680960.0A CN107450964B (zh) | 2017-08-10 | 2017-08-10 | 一种用于发现虚拟机自省系统中是否存在漏洞的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107450964A CN107450964A (zh) | 2017-12-08 |
CN107450964B true CN107450964B (zh) | 2020-05-05 |
Family
ID=60491561
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710680960.0A Active CN107450964B (zh) | 2017-08-10 | 2017-08-10 | 一种用于发现虚拟机自省系统中是否存在漏洞的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107450964B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108415795B (zh) * | 2018-02-12 | 2019-04-05 | 人和未来生物科技(长沙)有限公司 | 一种容器Dockerfile、容器镜像快速生成方法及系统 |
CN109002726A (zh) * | 2018-06-06 | 2018-12-14 | 浙江华途信息安全技术股份有限公司 | Linux操作系统的文件读写透明加解密的方法 |
CN108897602B (zh) * | 2018-07-02 | 2021-05-25 | 哈尔滨工业大学 | 一种基于kvm的虚拟机自省采集系统及采集方法 |
CN111913742B (zh) * | 2018-07-03 | 2022-11-11 | 武汉斗鱼网络科技有限公司 | 一种程序处理方法及相关设备 |
CN110955631B (zh) * | 2018-09-26 | 2023-01-03 | 上海瑾盛通信科技有限公司 | 文件访问追踪方法、装置、存储介质及终端 |
CN111444509B (zh) * | 2018-12-27 | 2024-05-14 | 北京奇虎科技有限公司 | 基于虚拟机实现的cpu漏洞检测方法及系统 |
CN113468533A (zh) * | 2021-07-23 | 2021-10-01 | 浙江大华技术股份有限公司 | 隐藏内核模块的检测清理方法和装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101206692A (zh) * | 2006-12-20 | 2008-06-25 | 联想(北京)有限公司 | 检测进程的方法及设备 |
US9076013B1 (en) * | 2011-02-28 | 2015-07-07 | Amazon Technologies, Inc. | Managing requests for security services |
CN105683985A (zh) * | 2013-10-29 | 2016-06-15 | 慧与发展有限责任合伙企业 | 虚拟机内省 |
CN106445639A (zh) * | 2016-09-30 | 2017-02-22 | 北京奇虎科技有限公司 | 监测虚拟机的方法及装置 |
-
2017
- 2017-08-10 CN CN201710680960.0A patent/CN107450964B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101206692A (zh) * | 2006-12-20 | 2008-06-25 | 联想(北京)有限公司 | 检测进程的方法及设备 |
US9076013B1 (en) * | 2011-02-28 | 2015-07-07 | Amazon Technologies, Inc. | Managing requests for security services |
CN105683985A (zh) * | 2013-10-29 | 2016-06-15 | 慧与发展有限责任合伙企业 | 虚拟机内省 |
CN106445639A (zh) * | 2016-09-30 | 2017-02-22 | 北京奇虎科技有限公司 | 监测虚拟机的方法及装置 |
Non-Patent Citations (3)
Title |
---|
DKSM:Subverting Virtual Machine Introspection for Fun and Profit;Sina Bahram等;《2010 29th IEEE International Symposium on Reliable Distributed Systems》;20101109;第82-91页 * |
WinWizard: Expanding Xen with a LibVMI Intrusion Detection Tool;Jereme Lamps等;《2014 IEEE International Conference on Cloud Computing》;20141204;第849-856页 * |
虚拟化软件栈安全研究;朱民等;《计算机学报》;20160624;第40卷(第2期);第481-504页 * |
Also Published As
Publication number | Publication date |
---|---|
CN107450964A (zh) | 2017-12-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107450964B (zh) | 一种用于发现虚拟机自省系统中是否存在漏洞的方法 | |
Dolan-Gavitt et al. | Virtuoso: Narrowing the semantic gap in virtual machine introspection | |
JP4783471B2 (ja) | クラスが有するメソッドを呼出して実行するコンピュータ・システムが行う方法 | |
Long et al. | Automatic runtime error repair and containment via recovery shepherding | |
US9875173B2 (en) | Time travel debugging in managed runtime | |
US10761966B2 (en) | Generating program analysis data for analysing the operation of a computer program | |
US8266395B2 (en) | Detecting attempts to change memory | |
US7774636B2 (en) | Method and system for kernel panic recovery | |
US20090248611A1 (en) | Trace Collection for a Virtual Machine | |
CN112015491B (zh) | 实现函数跳转的方法、装置及计算机存储介质 | |
JPH11327916A (ja) | コンパイル済コ―ドにおけるダイナミッククラス初期化チェックのコスト低減技術 | |
CN109857520B (zh) | 一种虚拟机自省中的语义重构改进方法及系统 | |
CN105683985B (zh) | 用于虚拟机内省的系统、方法及非暂时性计算机可读介质 | |
CN104715202A (zh) | 一种虚拟机中的隐藏进程检测方法和装置 | |
US11366740B2 (en) | Debugging shared memory errors | |
JP2004303114A (ja) | インタープリタおよびネイティブコード実行方法 | |
CN107463513B (zh) | 在存储位置之间转移控制的系统和方法 | |
CN111444504A (zh) | 一种用于软件运行时自动识别恶意代码的方法及装置 | |
CN109582542B (zh) | 一种嵌入式系统核心转储的方法 | |
CN113176926B (zh) | 一种基于虚拟机自省技术的api动态监控方法及系统 | |
WO2018226460A1 (en) | Asynchronous operation query | |
CN111625296A (zh) | 一种通过构建代码副本保护程序的方法 | |
CN104834861B (zh) | 木马的查杀方法和装置 | |
Mahurkar et al. | Dynacut: A framework for dynamic and adaptive program customization | |
CN102222185A (zh) | 一种避免操作系统启动文件被感染的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |