点击上方蓝字 关注联想全球安全实验室
CVE-2022-21198 Intel SMM 漏洞分析

背景
2022年10月下旬,我参加了Intel的Circuit Breaker项目。该项目是Intel发起的漏洞奖励计划,在签署了一系列协议之后我终于拿到了代码。第一次拿到Intel的UEFI代码还是有点小激动的,有些模块在IDA里看过很多遍,但是当真正看到代码的时候还是有种既熟悉又陌生的感觉。
大概一周后,我在一个SMI处理程序中发现了一处TOCTOU漏洞,配合DMA攻击能够读写SMRAM并将权限提升到系统管理模式(SMM)。在上报该漏洞后,Intel认为该问题与内部审计的漏洞(CVE-2022-21198) 相同。从Intel 2022年11月份的安全公告 Intel-sa-00688和安全更新情况来看,他们可能提前就知道这个漏洞了,很遗憾这次无缘奖金。
Intel给CVE-2022-21198的评分为7.9分,属于高危漏洞,但在公告里一笔带过。因此,本文主要聊一聊漏洞的细节,以及Intel是如何修复的。
由于NDA的缘故,源码就不进行展示了。这里用IDA的伪代码进行替代,这份代码相信许多看官手里也都有。

漏洞
该漏洞位于SpiSmmStub的一处SMI handler中。

深入ChildSwSmiHandler分析:

处理程序调用 SmmIsBufferOutsideSmmValid来检查攻击者控制的 CommBuffer指针是否与SMRAM重叠,以避免SMI处理程序读/写它自己的地址空间。然后分配一块内存,把CommBuffer复制到安全的内存上,避免TOCTOU攻击。一切都是标准的中规中矩的操作,到目前为止,一切都很好。

真正有问题的部分在这里。在完成某个具体的功能的时候,比如SPI_FUNCTION_FLASH_READ处理函数从安全内存中取参数,调用Interface+n执行具体操作,在操作完成后还需要把结果返回给调用者,也就是放回到CommBuffer中。
而如上图所示,在返回的数据结构的构造中,数据长度、嵌套指针的值等等这些都没有从安全内存中获取,而是从攻击者可控的CommBuffer中重新获取,这也为攻击者提供了TOCTOU利用的机会。比如上面这个代码片段,CopyMem的目的地址和长度都是攻击者可控的,尽管前面有检查,但是在这里仍然留下了很长的时间窗口可以让攻击者利用DMA攻击修改这些值。
而整个ChildSwSmiHandler的代码风格都是类似的,这也导致了许多功能处理都有一样的问题。
SPI_FUNCTION_FLASH_READ
SPI_FUNCTION_FLASH_READ_SFDP
SPI_FUNCTION_FLASH_READ_JEDEC_ID
SPI_FUNCTION_FLASH_READ_STATUS
SPI_FUNCTION_GET_REGION_ADDRESS
SPI_FUNCTION_READ_PCH_SOFTSTRAP
SPI_FUNCTION_READ_CPU_SOFTSTRAP
整个漏洞的情况大致如此,并不复杂。

POC
由于我并没有PCILeech之类的可以做DMA attack的东西,只能把代码拿出来用线程来构造竞争条件模拟一下,所以就不拿来献丑了。

修复方案
再来看看Intel的补丁。


Intel的修复方案也很简单,在从Commbuffer复制到安全内存和从安全内存复制到Commbuffer动作之后多加了一个修复嵌套指针的操作。

简单地说,SMI handler不再直接使用外部提供的嵌套指针了。这个函数根据不同功能号重新构造内部的嵌套指针,返回数据的时候也是一股脑地把Commbuffer填满然后再去修复内部的指针。
这个修复方案仍然有一点点瑕疵,目前已经报告给Intel了,由于还没有披露,具体就不多说了。
最后附上一份fwhunt rule。(大部分时候是好用的)
INTEL-SA-00688:
meta:
author: charles
license: CC0-1.0
name: CVE-2022-21198
namespace: vulnerabilities
CVE number: CVE-2022-21198
vendor id: INTEL-SA-00688
CVSS score: 7.9 High
advisory: https:/www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00688.html
description: Time-of-check time-of-use race condition in the BIOS firmware for some Intel(R) Processors may allow a privileged user to potentially enable escalation of privilege via local access.
volume guids:
- 7D655829-26DD-4342-96AD-04899477C3FA
hex_strings:
not-all:
- 488b014883e80174624883e801745c4883e802744d4883e801743e4883e801742f4883e80174294883e80174154883e80174064883f801753a488d412048894118c3488d412448894114488d4128eb1f488d411c48894114c3488d411d48894115c3488d412148894119c3488d41244889411c
code:
and:
- pattern: E8....FFFF488B....803D....000000
place: child_sw_smi_handlers
【转发抽奖】
福利来啦!!!
安全保驾护航
代码的世界亦有万千色彩
关注此公众号+转发本文至朋友圈
即可参与抽奖~

别划走!!!
还有【留言抽奖】!!!
文章下方参与留言,
揪10个小伙伴送上精美礼品
【安全实验室定制鼠标收纳袋】一份~

欢迎大家积极参与~
-END-
往期精彩合集
CSL

联想GIC全球安全实验室(中国)
chinaseclab@lenovo.com
原文始发于微信公众号(联想全球安全实验室):【重大福利在文末↓↓↓】CVE-2022-21198 Intel SMM 漏洞分析