kcnine
驱动牛犊
驱动牛犊
  • 注册日期2008-12-18
  • 最后登录2010-01-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5978回复:0

Intel VT虚拟机如何实现内存写保护和防篡改GDT/IDT?(不启用EPT的情况)

楼主#
更多 发布于:2009-08-06 20:57
最近偷窥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 应该是这个异常把)。
大牛帮帮忙啊!
游客

返回顶部