Intel SMM 缓存中毒攻击

一大早起来上网就看到这么一条劲爆的新闻。其实这个漏洞由来已久,以前至少见过两次对它的介绍,而今天,我们终于看到实实在在的exploit了。

我把官方的paper和exploit代码通读了一遍,发现这个漏洞的原理其实很简单,大体如此:

1. 把SMM内存区域设为write-back模式,这需要修改mtrr(/proc/mtrr)。很明显,在linux上这一步是需要root权限的。也就是说,这里也就已经决定了这个漏洞不是用来给你提升权限的,而是用来隐藏rootkit等东西的。

2. 对SMM内存区域写入你自己的攻击代码,因为上一步已经把cache设为了wb,所以写入的代码其实是暂时存放在cache中的。而在一般情况下,这块内存显然是uncachable的,而且不会让你随便写入的。

3. 马上进入SMM模式,这时,SMI中断处理程序会从cache中读取相应的代码去执行,而不是从内存中。攻击目的达成!而且系统根本不会检测得到!

这里面隐含了非常关键的一步,那就是需要知道SMM内存中SMI处理函数的偏移(详细见Intel官方手册Vol 3 24.4.1),官方paper中给出的方法是:把上面的手法反过去,去读出SMM里面的内容进而得到那个偏移,非常巧妙。:-) 这个漏洞好啊,SMM那个地方风不着雨不着的,而且权限还不低,更可恶的是攻击代码在缓存中,几乎不太可能检测得到!tmd绝了!

Update: 根据这篇文章,TSEG其实就是物理内存的最后一块,可以根据自己机器的配置和/proc/mtrr的输出来判断。

这里有几个概念可能不太好理解,

1. SMM,System Management Mode。Intel CPU的一种模式,和我们通常所说的实模式,保护模式类似。它和实模式差不多,只是寻址是32位的。设立它的目的是给BIOS和firmware使用的。详细描述见Intel Vol 3, Ch 24。

2. MSR,MODEL-SPECIFIC REGISTERS,一些特殊的寄存器,有特殊的用途,比如sysenter。这些寄存器可以通过rdmsr来读取,通过wrmsr来写入。详细描述见 Intel Vol 3 8.4。

3. MTRR,MEMORY TYPE RANGE REGISTERS,MSR中的一类,设置内存块的缓存属性,比如上面提到的缓存策略。具体描述见Intel Vol 3 10.11,也可参考Linux内核源代码arch/x86/kernel/cpu/mtrr/中的代码。