8月14日,英特尔再次披露3个芯片级漏洞,恶意软件和恶意虚拟机可利用这些漏洞从计算机内存中盗取秘密信息。
口令、个人信息、金融记录和加密密钥均在受影响范围之列,可被攻击者从其他应用和其他客户的虚拟机,以及英特尔安全扩展(SGX)飞地及系统管理模式(SMM)内存中抽取出来。SGX是本应防护这些秘密不受恶意代码干扰的英特尔安全技术。SMM则是用户计算机的隐藏管理员,对计算机硬件有着完全控制权,且可访问计算机上存储的所有数据。
总体而言,英特尔的桌面、工作站和服务器CPU都谈不上安全。最重要的是,这些芯片并未按文档所述的方式工作:芯片技术手册称,内存可被标记为访问受限的。但实际情况却并不是这样。也就是说,脆弱主机上的恶意软件和云平台上的客户虚拟机,都可以从其他软件和其他客户的虚拟机中提取出敏感数据。
很明显,Chipzilla的管理层牺牲了安全来换取速度上的提升:他们的处理器在软件执行上堪称飞一般的速度,内存保护机制不过是事后聊以自慰的摆设。在对性能的无尽追求中,保护用户数据安全的防护措施被当成了可选项而不是必选项。
去除了预测执行设计缺陷的重制版英特尔处理器将于今年晚些时候开始发售。以操作系统和虚拟机管理程序补丁形式放出的缓解措施应该很快就会推出。如果你担心恶意软件或恶意虚拟机会吞噬掉宝贵的数据,那就应该打上这些补丁。请睁大眼睛紧盯补丁推出情况。某些软件缓解措施需要先安装上英特尔今年二季度的微代码更新。
因为涉及到从CPU一级数据缓存中抽取秘密信息,英特尔将这3个漏洞定名为“一级终端故障(L1TF)”漏洞:
1. CNNVD-201808-341(CVE-2018-3615)
CNNVD-201808-341(CVE-2018-3615)影响SGX。将于本周举行的Usenix安全研讨会上由多家学术机构予以披露。英特尔称:“装有带预测执行和SGX功能微处理器的系统,可能会被利用边信道分析获取了本地用户访问权的攻击者,从SGX保护的飞地未授权抽取出一级数据缓存中的信息。”发现该漏洞的团队将之命名为“预兆(Foreshadow)”。需要安装英特尔微代码更新才可以修复此漏洞。
2. CNNVD-201808-342(CVE-2018-3620)
CNNVD-201808-342(CVE-2018-3620)影响操作系统和SMM。英特尔称:“装有带预测执行和地址翻译功能微处理器的系统,可能会被利用终端页面错误和边信道分析获取了本地用户访问权的攻击者,未授权抽取出一级数据缓存中的信息。”想要修复该漏洞,操作系统内核便需打上补丁,SMM则要进行微代码更新。
3. CNNVD-201808-343(CVE-2018-3646)
CNNVD-201808-343(CVE-2018-3646)影响虚拟机管理程序和虚拟机。英特尔称:“装有带预测执行和地址翻译功能微处理器的系统,可能会被利用终端页面错误和边信道分析获取了客户操作系统本地用户访问权的攻击者,未授权抽取出一级数据缓存中的信息。”想要保护数据,微代码、操作系统和虚拟机管理程序都要更新。
操作系统和虚拟机管理程序级漏洞(CNNVD-201808-342/CVE-2018-3620和CNNVD-201808-343/CVE-2018-3646),是大学研究人员告知了SGX漏洞(CNNVD-201808-341/CVE-2018-3615)后,由英特尔的工程师发现的。关于这些漏洞的影响,Chipzilla称:
恶意应用可能会推断出操作系统内存或其他应用中数据的值。恶意客户虚拟机可能会推断出虚拟机管理器(VMM)内存或其他客户虚拟机内存中数据的值。SMM外的恶意软件可能会推测出SMM内存中数据的值。英特尔SGX飞地内部或外部的恶意软件都可能推测出另一块SGX飞地中的数据。
值得指出的是,运行有多台客户提供的虚拟机的云平台上,这些客户操作系统必须打上补丁,否则,它们可能利用共享的底层主机硬件来盗取邻近虚拟机的信息。
这意味着,客户只应被允许使用平台提供的内置了缓解措施的内核,或者虚拟机管理软件必须被配置为不会安排陌生人的虚拟机运行在相同的物理CPU内核上,或者禁用超线程技术。正如 Red Hat 指出的,应用这些缓解措施可能会对性能造成打击。
英特尔表示:
部分市场,尤其是运行有传统虚拟化技术的那些(主要在数据中心),建议客户或合作伙伴采取额外的措施以保护他们的系统。这主要是为防止IT管理员或云提供商无法保证所有虚拟化操作系统都经更新的情况。这些额外措施包括启用特定的虚拟机管理程序核心调度功能,或选择在某些特定场景中禁用超线程技术。虽然这些额外的措施可能只适用于相对较小的部分市场,但我们觉得有必要为所有的客户提供解决方案。
这些特定案例中,某些工作负载的性能或资源利用率可能会受到不同程度的影响。英特尔及其行业合作伙伴正努力开发多个解决方案以消除此影响,客户可根据自身需要从中选择最佳方案。作为解决问题的一部分,我们已经开发了在系统运行期间检测L1TF相关漏洞利用的方法,仅在必要时应用缓解措施。我们已向部分合作伙伴提供了该功能的预发布微代码以供测试评估,希望能在此后加以推广。
针对上述漏洞,英特尔发布了带有详细信息的技术白皮书和FAQ。Red Hat 和Oracle也有各自的阐述。
同时,SUSE推出了一份在线咨询,微软也为其Windows拿出了安全建议,Xen和VMware对漏洞情况做了详细描述,Linux内核补丁的情况也能在网上查到。换句话说,用户现在就可以检查自己的操作系统和虚拟机管理器,找到相应的更新。
到底哪儿出错了?
我们来对问题打个总结:基本上,英特尔的CPU无视了操作系统内核页表。微软Windows和Linux之类的操作系统在内存中维护有名为页表的特殊数据结构,负责描述物理RAM该怎么分配给活跃应用程序。
这些页表在英特尔手册中也有定义,负责指定应用程序能不能在内存段中读写信息。页表有个名为“当前(present)”的设置位,设置为“1”表明某块物理RAM可供当前应用程序用于存储信息。如果设置为“0”,表明并未分配任何物理RAM,对该区域的任何访问都应遭遇“内存页错误”的封锁。
应用程序访问自身在内存中的数据用的是虚拟内存地址,该地址必须转换为指向RAM芯片中某个部分的物理内存地址才行。
为此,处理器会查询页表,以将应用程序的虚拟内存地址转换成相对应的物理RAM地址。该查询会耗费掉一定的时间,而现代英特尔CPU不会等待页表查完,它们会根据缓存在一级数据缓存中的所请求信息的副本,预测性地执行代码——即便页表指定该数据在物理内存中已失效而不应被读取。
其结果就是,恶意软件或恶意客户操作系统可利用该特性,通过强制标记页面为不存在并观察有哪些数据被预测性地从一级缓存中取出,来确定它本不应读取的数据。当然,这些操作得在处理器的页面故障电路介入并中断处理之前做完。
这就要求漏洞利用代码要运行在执行受害代码的同一块物理CPU核心上——因为漏洞利用代码需要观察一级数据缓存。
微软TechNet和虚拟化博客上也有更进一步的细节描述。
另外,微软Azure、AWS和谷歌计算引擎都已经推出了缓解措施。
避免被黑
必须指出:目前为止,还没有恶意软件在利用相关的熔断和幽灵漏洞,上述预测执行漏洞也未见野生漏洞利用,这有部分原因是因为业内已经推出了缓解措施,还有部分原因是因为另有其他更容易的黑客方法。
相比用特定方法搞定底层硬件开发出恶意软件来缓慢抽取内存中秘密,用虚假网站骗得用户输入网上银行登录口令要容易得多。某种程度上,我们还得感谢有别的方法可以让黑客不去利用这些芯片级漏洞。
英特尔发言人称:“今年早些时候发布的伪代码,加上14号开始放出的相关操作系统和虚拟机管理软件更新,已解决了L1TF问题。”
我们在网站上提供了更详细的信息,并一直建议用户更新系统,因为保持系统更新是受到保护的最佳方式。