bluepill 有两个方面:感染是如何发生的,以及一旦发生,您是否可以检测到它。
第一个方面实际上与所有恶意软件相同。bluepill 的新颖之处在于“它无法检测到”的说法。
对此进行了广泛的研究,并设计了几种检测方法。
您应该注意到,到目前为止,还没有在野外看到蓝丸威胁。
检测操作系统是否在虚拟机内运行
最早发表的检测方法涉及计时。来自对 Anthony Liguori 的采访:
硬件虚拟化需要一种称为“陷阱和仿真”的技术。这个想法是硬件捕获某些指令,VMM 模拟这些指令,使软件相信它在虚拟机中运行。
软件仿真意味着这些指令在 VMM 下执行要比在普通硬件上花费更长的时间来完成。这个事实可以用来检测 VMM 的存在。
我就这个问题联系了 Rutkowska,她试图在她的原型中解决这个问题,方法是在每个出口调整一个处理器时钟。然而,对于外部时间源,她没有任何责任,她在她的博客上承认了这一点。
她将此称为她系统中的一个理论上的弱点,但我向您保证,利用它是非常实际的。
bluepill 概念的原作者 (Joanna Rutkowska) 还发表了另一篇论文 (RedPill),可用于检测 BluePill rootkit。
我找不到这篇论文,但找到了这个出色的摘要:
int swallow_redpill () {
unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
*((unsigned*)&rpill[3]) = (unsigned)m;
((void(*)())&rpill)();
return (m[5]>0xd0) ? 1 : 0;
}
这段代码的核心其实是SIDT指令(编码为0F010D[addr]),它在目的操作数中存储了中断描述符表寄存器(IDTR)的内容,目的操作数其实是一个内存位置。SIDT 指令的特殊和有趣之处在于,它可以在非特权模式(ring3)下执行,但它返回敏感寄存器的内容,供操作系统内部使用。
因为IDTR寄存器只有一个,但至少有两个OS同时运行(即host和guest OS),VMM需要把guest的IDTR重新定位到一个安全的地方,这样才不会和host的冲突。不幸的是,VMM 无法知道来宾操作系统中运行的进程是否(以及何时)执行 SIDT 指令,因为它没有特权(并且不会产生异常)。这样进程就得到了IDT表的重定位地址。据观察,在 VMWare 上,IDT 的重定位地址为地址 0xffXXXXXX,而在 Virtual PC 上为 0xe8XXXXXX。这在 VMWare Workstation 4 和 Virtual PC 2004 上进行了测试,两者都在 Windows XP 主机操作系统上运行。
本文回顾的另一种方法是从 2008 年开始的:
这个想法是通过另一个管理程序来拦截管理程序的启动(让我们将后者称为虚拟入侵防御系统,或 VIPS)。当任何管理程序(恶意或合法)启动时,它会打开 VM 根模式。这个事件很容易被 VIPS 拦截。下一个是什么?有两种方法可以处理此事件:完全阻止虚拟机管理程序,或允许它通过仿真工作。
第一种方法是在 BIOS 中模拟具有禁用 HVT 功能的 PC。这将阻止 HVT rootkit 工作。
第二种方式是允许管理程序通过模拟硬件虚拟化(或嵌套)工作。对于合法的虚拟化软件,应该这样做。
在这两种情况下(阻塞或模拟),VIPS 在它试图启动的那一刻拦截一个管理程序。VIPS 可以读取管理程序的主体并对其进行分析。可以显示通知消息。
这真的是威胁吗
然后是攻击的实际方面需要考虑。
bluepill rootkit 需要实现 xen 或类似复杂的东西,这是一项巨大的努力。由于确实无法保证无论如何都不会被检测到或阻止,因此攻击者将选择一条更简单的路径,即经典的 rootkit。
我相信这就是为什么 bluepill rootkit 还没有出现在野外的部分原因。