TrustZone突破漏洞:Ampere UEFI MM驱动程序中的缓冲区溢出与栈信息泄露
漏洞摘要
在ARM Ampere管理模式的引导错误记录表驱动程序中,发现一处缓冲区溢出和栈信息泄露漏洞。此代码被捆绑到ARM统一可扩展固件接口固件中,并在安全世界的异常等级0运行。BERT驱动程序用于持久化来自前次引导周期的未处理硬件故障。
非安全EL1软件通过安全监视器调用指令和预定义的共享缓冲区与该驱动程序通信。系统重启后,NS-EL1将与BERT驱动程序通信以检查先前故障并从日志获取详细信息。
从NS-EL1传递到S-EL0的、用于定义payload_data的block_size的值缺乏适当检查。这导致可能发生payload_data的越界写入,可用于从普通世界到安全世界的权限提升;或从安全世界读取栈数据的越界读取。
Ampere已修复该漏洞并发布了安全公告。
技术分析
NS-EL1软件通过FFA规范(A-Profile固件框架)使用SMC指令与MM BERT驱动程序交互。SMC指令用于在非安全世界和安全世界之间切换,FFA用于分发到特定驱动和服务。共享缓冲区(在UEFI驱动执行环境阶段初始化为mNsCommBufferMemRegion)用于NS-EL1和S-EL0 BERT驱动程序之间的消息传递。
BERT MM驱动程序的处理程序可通过以下GUID使用FFA规范访问。BertMmHeader展示了通信缓冲区的一般布局。在调用BertMmHandler分发例程之前,MM子系统将共享消息缓冲区复制到私有内存区域以防止TOCTOU问题。由于驱动程序唯一地定义了通信消息中的底层结构,每个驱动程序在使用提供的数据之前都必须执行验证。
包含的代码片段是通过使用Ghidra分析UEFI镜像中的字符串引用所包含的名称创建的。来自EDK2存储库的已知函数和变量也被应用。
|
|
BertMmHeader结构包括一个用于分发到特定子处理程序的function字段和一个UINT32类型的size字段,表示应返回多少数据。BERT_MM_MAX_SIZE定义了可能返回的最大大小。
|
|
当BertMmHandler被调用时,会对CommBuffer和CommBufferSize进行一些初始检查。当header->function为1时,检查*CommBufferSize以确保其小于或等于BERT_MM_MAX_SIZE。此后,代码根据bert_latest结构中的字段进行分支。然而,在这两种情况下,block_size都从未被验证小于BERT_MM_MAX_SIZE。payload_data要么通过mfs->read使用文件内容填充,要么使用CopyMem通过新初始化的基于栈的结构填充。
在CopyMem的情况下,使用的block_size从未被检查是否小于或等于基于栈的block_buffer结构大小或payload_data大小。当block_size大于block_buffer的大小时,会导致基于栈的越界读取,数据将通过payload_data返回给NS-EL1。当block_size大于payload_data时,会发生越界写入,栈数据被复制到payload_data末端之后的内存中。
对于mfs->read,&block_size用于确定应写入payload_data缓冲区的字节数。如果正在读取的文件和block_size都大于payload_data,则会发生越界写入,使用文件内容写入到payload_data的末尾之后。
时间线
- 报告日期:2025-09-19
- 修复日期:2025-12-18
- 披露日期:2025-12-18
严重程度
中等
CVSS整体分数:4.6 / 10
CVSS v3 基本指标:
- 攻击向量:本地
- 攻击复杂度:低
- 所需权限:高
- 用户交互:无
- 作用域:已更改
- 机密性影响:无
- 完整性影响:低
- 可用性影响:低
CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:N/I:L/A:L
CVE ID
CVE-2025-62862
弱点
- CWE-125:越界读取 - 产品读取了超出预期缓冲区末端或之前的的数据。
- CWE-787:越界写入 - 产品写入了超出预期缓冲区末端或之前的数据。
致谢
Finder: de7ec7ed