阅读:5978回复:0
Intel VT虚拟机如何实现内存写保护和防篡改GDT/IDT?(不启用EPT的情况)
最近偷窥http://rootkit.com/newsread.php?newsid=758的虚拟机框架写了个VT虚拟机
希望能进行WINDOWS内核保护,当然是不开启EPT扩展页表的情况下,太复杂 目前可以实现禁止修改CR0寄存器的WP位,以及阻止修改SYSENTER相关MSR实现SYSENTER HOOK (其实就是改了CR0 host/guest mask和设置一下CR0 read shadow,MSR是必然会引起VM EXIT的)。 但众所周知,绕过内存写保护还有一种常规方法是创建MDL,这种方式不会产生VM EXIT,难道用HOOK做,但HOOK在RING0总有办法绕过,大不了自己实现API。 HyperSight这款软件(http://northsecuritylabs.com/testing.aspx下载 号称世界上第一款VIPS)号称是实现了如下的功能:(引用自官方白皮书http://northsecuritylabs.com/downloads/whitepaper-html/) Hypersight Rootkit Detector monitors and intercepts the following actions classified as being potentially dangerous: Hypersight监视和拦截以下的危险行为,大概是这个意思吧 我鸟语不行 · Attempts to modify page table. This activity is typical for ‘shadow walker’ rootkits that hide themselves in the computer memory. 尝试篡改页表,这一行为时典型的'shadow walker' rootkits在内存中隐藏自己的方式 · Attempts to modify read-only kernel modules. Most rootkits exhibit this behavior. 尝试修改只读的内核模块,大多数rootkits有这种行为 · Attempts to modify GDT and IDT. Typical for ‘shadow walker’ and other rootkits. 尝试修改GDT/IDT,'shadow walker'和其他rootkits的典型特征 然后又说内存写保护的东西 Rootkits are performing the following activities to circumvent memory write-protection: rootkits用一下的方式绕过内存写保护 · Resetting write-protection bit (CR0.WP) 重置CR0的WP位 · Mapping memory sections with write privileges (calls to MmMapLockedPages, MmMapLockedPagesSpecifyCache) 以写权限映射内存 · Accessing physical system memory via \Device\PhysicalDrive object 访问物理内存对象 Hypersight Rootkit Detector kernel intercepts all attempts to circumvent memory write-protection Hypersight Rootkit Detector 内核拦截一些尝试绕过内存写保护的行为。 我测试了一下,在Intel VT的CPU下,根本没实现内存写保护,而且他初始化VMCS的时候跟我赋的值是基本一样的(同样没有开启EPT扩展页表)。 08年的Black Hat上日本人Murakami发表议题:基于硬件虚拟化的主机防御系统(反正就这意思),PPT可以到Black Hat官网下载 里面的VIPS是基于一个www.SecureVM.org的BitVisor得日本开源虚拟机的,貌似该虚拟机并没有使用EPT,而是使用软件虚拟机使用的影子页表进行的内存虚拟化,文中叫SPT,作者的内存写保护是通过设置SPT的W/R位实现的,GUEST OS无法修改影子页表。但我总不能去用影子页表,那复杂,而且性能开销很大。其实是我不会。 去年的XCON徐昊也说了类似的东西,可以我没钱参加,也没拿到任何相关资料 悲哀 Intel手册3B卷翻了N遍(我E文不行只能走马观花),也没找到能够实现内存写保护的机制,除了启用EPT,至于修改IDT/GDT似乎也不会产生VM EXIT。实在是黔驴技穷啊! 还有一个奇怪的事情:开启虚拟化后,GUEST OS的程序修改CR0.WP位即使失败也能成功修改SSDT而不蓝屏,可能是我没处理#GP异常(General Protection 应该是这个异常把)。 大牛帮帮忙啊! |
|