WSMT
横行无忌这么多年,SMM终于被微软压制了。MS在2016年提出VBS Virtualization-based security,VBS使用windows的管理软件、系统软件与CPU的虚拟化技术相配合,建立起一个安全的环境供给SMM这种不听话的功能使用。
在VBS出现之前,SMM是一匹脱缰的野马,谁也不知道能捅出什么篓子,它能读取和修改所有的内存和资源,几乎想干什么就干什么。在VBS出现后,SMM要听VBS的话,运行在SMM里的固件必须要获取VBS的信任,而那些以前与SMM处在同一个级别(CPL0)的操作系统组件现在趾高气昂了,不用受这种窝囊气。
对Windows知之甚少,不深入研究VBS,主要看一下WSMT。
因为SMM对OS不透明,OS没法直接去管理SMM,需要固件自砍一刀,自己对SMM进行限制,所以微软定义了WSMT。 WSMT全称Windows SMM Security Mitigations Table,使用WSMT这个功能的时候,BIOS(原谅我,还是BIOS看起来比较顺眼…)要在ACPI namespace里创建一个静态的WSMT table。系统启动时,在运行ACPI解析器和_OSI method之前,Windows会先读WSMT并使用里面的Protection flags对SMM进行限制。不过OSPM本身还是不知道这个功能是否是正常的,这个功能完全依靠BIOS来完成的。
来看一下WSMT的protection flags,Windows系统根据SMM Protection 的标志位来选择打开, 关闭或取消某些安全功能:
Bit0
SMM要验证输入和输出的buffers是否都在某个特定的内存范围里(这个范围定义在BIOS里的SMM communication ACPI Table里)
Bit1
SMM要验证所有的输入和输出指针是否在某个特定的内存区域内的地址范围(同上)
Bit2
在ExitBootServices()之后,firmware不允许任何软件来配置系统资源,包含IOMMU’s, 中断控制器,PCI配置空间,FACS,memory layout和ACPI fixed tables里面报告的所有的registers。
未完待续…
附: UEFI在ver2.6里废弃了SMM Communication ACPI Table,不知道现在内存地址放在哪里,望知道的大神帮忙解答,感谢!