在指针中隐藏数据
上周的博客文章《Linux内核模块升级》中,讲了通过升级Linux内核驱动模块xen-evtchn,解决掉一个Xen卡死问题,原因是port_user中port重用,触发kernel BUG。evtchn中port_user的实现,对指针的应用很巧妙:
- 将指针存储在无符长整形(unsigned long)中。
- 将port是否enabled保存在无符长整形从低地址开始的第一个bit中。
上周的博客文章《Linux内核模块升级》中,讲了通过升级Linux内核驱动模块xen-evtchn,解决掉一个Xen卡死问题,原因是port_user中port重用,触发kernel BUG。evtchn中port_user的实现,对指针的应用很巧妙:
目前沙箱虚拟化是基于Xen实现的,沙箱集群大概运行一两个月,会有一台服务器出现Xen卡死的情况,xl命令无法使用,虚拟机无法创建,不得不重启服务器。在项目开发初期,通过重启来解决这样的问题是可以接受的,毕竟出错的概率不是很高,但如果不从根本上解决此问题,心里就像压了一块石头。这样的产品也不能卖给客户,如果你对客户说:“服务器卡死了没关系,重启下就好”,后果会怎样?
现在就彻底解决下这个问题。
Xen官方上周发布了Xen 4.8, What’s New with Xen Project Hypervisor 4.8?,添加了很多新功能,如Credit2调度器正式发布。Xenforce目前使用的是Xen 4.5,从性能、稳定性、功能等几方面考虑,决定升级到Xen 4.8。
自从开发完Xenforce+XenforceHub,虚拟机镜像部署变得异常简单,直接在要部署镜像的服务器上运行xenforce pull
命令即可将需要的镜像从XenforceHub下载到本地,镜像可直接使用,无需更改配置,而且xenforce pull
命令还会处理好镜像依赖,将依赖的镜像也下载下来。镜像部署变得完美,一切变得自动化,一切按照理想的方式工作着。
在cuckoo上测试我的xenforce,任务运行结果出现大量timeout错误,虽然以前也遇到过这个问题,但没当回事放过去了,现在有了xenforce还出现这种问题,是可忍孰不可忍,今天就认真排查下这个问题,消灭这只bug。
Bug现象是这样的,任务运行超时,错误日志有两种:
上篇《Anti-VM之CPUID指令》,通过CPUID指令获取CPU信息,来判断环境是否是虚拟的。这篇从时间角度判断环境是否是虚拟的。
Intel和AMD为处理器增加了虚拟化扩展(Intel VT-x, AMD AMD-V),使得操作系统不做修改就可虚拟化。以Intel VT-x为例,VMM(Virtual Machine Monitor)运行在root模式,虚拟机运行在非root模式,在非root模式下,一些指令如RDMSR,WRMSR,CPUID需要在VMM才能执行,即会触发 VM exit, 从而带来时间上的开销,通过统计时间,就可以判断当前环境是否是虚拟的。
相对于传统的静态分析检测,动态分析技术可以获得恶意样本的详细行为信息。恶意样本作者为了规避动态检测,采取了各种手段,如Anti-VM, Anti-Sandbox, Anti-Debugging。
Anti-VM是为了检测当前运行环境是否是虚拟环境,如果是,恶意样本会停止恶意行为,让安全研究员误认为此样本是良性的。比如恶意样本如果在物理环境下运行,会去连接C&C服务器,当检测到是在虚拟环境下运行时,则去连接正常的域名。