论文部分内容阅读
虚拟机自省(Virtual Machine Introspection,简称VMI)技术由于能够兼顾良好的“隔离性”和“能见度”,已成为保护虚拟化环境安全的重要选择并引起业界广泛的关注和研究,多个基于虚拟机自省的安全工具和系统被相继开发出来。然而,这些虚拟机自省工具或系统在设计时都是基于一个共同的假设前提:假设被监控的虚拟机操作系统按照规定的方式使用标准内核数据模板,其内存页面提供的原始内容或通过虚拟机管理器报告的事件是正确的。而这在实际中并不是绝对的,攻击者可以采用各种技术手段修改客户机操作系统底层的内核数据、执行流等来改变客户机内核数据模板,以欺骗虚拟机自省工具,达到攻击目的。论文在分析了VMI系统假设前提并发现其存在漏洞的基础上,分别针对VMI系统的静态监控和动态监控功能进行了攻击。在对VMI的静态监控功能进行攻击时,论文选择虚拟机自省开源库LibVMI作为被攻击实验系统,攻击其针对虚拟机进程和内核模块列表的静态监控功能。具体来说,通过修改进程和内核模块结构体中的特定字段,实现了从虚拟机内外部视角同时更改任意进程名、内核模块名的攻击;通过更改getdents64系统调用并摘除虚拟机进程双向链表内的特定节点分别实现了从虚拟机内、外部视角同时隐藏特定进程的攻击;通过摘除虚拟机内核模块双向链表内的特定节点,实现了从虚拟机内、外部同时隐藏特定内核模块的攻击。这些攻击都会导致LibVMI提供的静态监控功能失效。在对VMI的动态监控功能进行攻击时,论文选择Nitro作为被攻击实验系统,攻击其针对虚拟机系统调用事件的动态监控功能。具体来说,论文设计并实现了三种针对Nitro的攻击方案:(1)直接将虚拟机原系统调用表中某正常系统调用函数内容更改为恶意系统调用内容;(2)通过内联挂钩,在被攻击的系统调用函数入口处使用jmp指令跳转到预设恶意代码段,执行完恶意操后返回到原系统调用函数继续执行;(3)修改派遣例程entrySYSCALL64中系统调用表地址,保存真表,并用假表对它进行替换,同时互换恶意系统调用服务例程地址与某正常系统调用服务例程地址在假表中的位置,并对调标准库中封装例程在发生这个两个系统调用时压入eax寄存器的值。该方案能很好的躲避针对系统调用表的完整性检查,保证恶意系统调用执行且不被发现。以上三种方案都会导致Nitro提供的系统调用动态监控功能失效。论文设计和实现的各种攻击方案均能实现预定目标,总体达到设计要求,这些攻击对于推动虚拟机自省工具的进一步完善和发展具有积极的促进意义。