XenTaint:全虚拟化基于影子页表的内存保护

在Xen上利用按需模拟技术实现污点跟踪系统,第一步就是要捕获污点数据的处理,采用的技术就是利用全虚拟化中Xen的影子页表,将污点数据所在的页表项去掉present标志,一旦domU中处理到这块内存,就会产生页错误异常从而陷入Xen,这种方式对domU是完全透明的。
参考Ether的代码,实现了一个简单的测试demo:domU中的用户态程序分配一块内存,然后把虚拟地址通过超级调用的方式传递进入xen,xen中将这块内存页所在的页表项设置为不存在;用户态程序之后往这块内存写入数据,xen在页错误处理函数中捕获到这次页异常,打印出相关信息并重新将该页设置为存在。因此运行程序后通过xm dmesg能够看到页错误处理函数中打印的信息就表明成功实现了该功能。
简单原理讲解:
1、_sh_propagate是影子页表中用来根据guest页表项生成对应的影子页表项的函数,是影子页表技术的关键函数之一,在这个函数里面判断即将处理的页表项是我们的污点数据所在的页表项时,就去掉该页表项的Present标志,关键代码如下:
guest_gfn = gfn_x(guest_l1e_get_gfn(*gp));
if (v->domain->arch.hvm_domain.xentaint_controls.taint_flag == 1
&& guest_gfn == v->domain->arch.hvm_domain.xentaint_controls.gfn)
{
sflags &= ~(_PAGE_PRESENT);
}
这里要注意的是,该函数需要主动去调用,也就是当你需要把某个内存页设置为不存在时主动调用这个函数重新生成对应的影子页表项,开始没注意导致郁闷了很久~~~
2、sh_page_fault函数是处理页错误的函数,在这里判断页错误是否是我们导致的
nx_gfn = gfn_x(guest_l1e_get_gfn(gw.eff_l1e));
if (nx_gfn == d->arch.hvm_domain.xentaint_controls.gfn)
{
printk("[XenTaint]: sh_page_fault enter!\n"); //通过xm dmesg看到这条消息就成功了!
xentaint_mark_np(v,va,0,0); //重新把这个页设置为存在
d->arch.hvm_domain.xentaint_controls.taint_flag = 0;
unmap_walk(v, &gw);
shadow_unlock(d);
return 1;
}
虽然是个简单的测试demo,不过写的还有改的代码还是蛮多的,搞起来还不是那么简单,哎,这还只是XenTaint项目中的一小块而已。。。。
貌似这里是不是不能上传附件的?
整个demo包括一个domU的用户态程序,domU的驱动模块以及对xen进行修改的patch文件,有需要的童鞋邮件我
xen的版本为3.1.0

你可能感兴趣的:(全虚拟化,影子页表,内存保护)