向硬盘控制器植入木马的技术早在 OHM 2013 安全会议上就公开了(Hard disk more than block device),见作者主页 Sprites mods
这个作者的厉害之处是在没有文档的情况下通过 JTAG 调试和反汇编,搞清楚了磁盘控制器的内部结构,并在磁盘控制器里实现了钩子监听并替换文件内容。该 POC 具体做的事情就是把 /etc/shadow 中的 root 密码进行替换,当然真正的木马可以做得更隐蔽。对于政府机构来说,拿到硬盘控制器的 datasheet 大概不是什么难事。当然报道中提到的木马 “兼容” 多种型号的硬盘,肯定是下了不少苦功夫的。
硬盘控制器被植入木马后要 “潜伏” 在重装后的系统中,一种方案是篡改系统引导代码,比如经典的 MBR 病毒,Windows Vista 开始的 Secure Boot 就是应对这个的方案;另一种方案是待系统启动后择机触发,篡改系统的关键文件(Hard disk more than block device 的 POC 就是这种方案),应对方案主要包括程序签名和全盘加密。
数字签名需要信任颁发数字签名的机构。微软把它的证书颁发业务外包给 Verisign,而 Verisign 对 Secure Boot 证书颁发的条件是非常严格的,可以认为一般的木马作者不可能拿到签名,但政府机构就不好说了。 Microsoft UEFI CA Signing policy updates微软为了避免垄断之嫌,要求所有支持 Secure Boot 的主板厂商允许用户关掉 Secure Boot 或者向固件添加新的 Platform Key(类似添加 root certificate)。向固件添加自签名的 key 教程在此 booting a self-signed Linux kernel 或者这个 Owning your Windows 8 UEFI Platform 就像添加 12306 等国内 CA 的根证书会增加安全隐患,向固件添加新的 Platform Key 也是安全隐患。
二、程序签名。就是对每个需要以较高权限执行的可执行文件进行数字签名,并附加在文件上;可执行文件被加载时,检查数字签名,签名不符则拒绝运行。Windows 从 Vista 开始强制驱动程序经过签名。QQ 之类的软件为了防篡改,也有自己检查文件完整性的机制。这里面主要有两个问题:
数据文件不方便进行签名。如果每次对数据文件进行修改后都重新计算整个文件的签名,会严重影响系统的性能。(一种折中的方法是对大文件分块签名,不过还不如直接用全盘加密)例如,硬盘木马可以篡改 Linux /etc 下的配置文件或 Windows 注册表,只要使用字符串等长替换,就不会被操作系统发现。Windows 的程序签名证书并不难搞到。比如 StartSSL 的 Class 2 认证(60 刀)就可以签名可执行文件,而 EV 认证(200 刀)就可以签名内核驱动。http://www.startssl.com/?app=40