通过 OP-TEE 使用 MA35D1 TSI 实现内存块安全监控
步骤概览:
- 启用并配置 TSI 模块
- 在 OP-TEE 中添加 TSI 驱动
- 实现安全监控逻辑
- 处理中断并触发安全响应
- REE 端交互(可选)
详细步骤:
1. 启用并配置 TSI 模块
在 ARM TrustZone 架构中,TSI 硬件模块负责监控内存访问:
// OP-TEE core 初始化阶段(core/arch/arm/plat-nuvoton/...)
void init_tsi(void)
{
/* 1. 启用 TSI 时钟 */
io_write32(CLK_BASE + CLK_TSI_EN, 0x1);
/* 2. 配置监控的内存范围 */
io_write32(TSI_BASE + TSI_ADDR_START, 0x80000000); // 起始地址
io_write32(TSI_BASE + TSI_ADDR_END, 0x8000FFFF); // 结束地址
/* 3. 设置触发条件 */
uint32_t ctrl = (1 << 0) | // 使能模块
(1 << 3) | // 监控非安全世界访问
(1 << 5); // 写操作触发
io_write32(TSI_BASE + TSI_CTRL, ctrl);
}
2. OP-TEE 驱动实现(core/drivers/sec_monitor.c)
static enum itr_return tsi_irq_handler(struct itr_handler *h)
{
/* 读取中断状态 */
uint32_t status = io_read32(TSI_BASE + TSI_STATUS);
if (status & VIOLATION_EVENT) {
/* 获取违规地址 */
uint32_t fault_addr = io_read32(TSI_BASE + TSI_FAULT_ADDR);
/* 安全处理 */
handle_security_violation(fault_addr);
/* 清除中断标志 */
io_write32(TSI_BASE + TSI_STATUS, status);
return ITRR_HANDLED;
}
return ITRR_NONE;
}
/* 注册中断处理 */
DECLARE_INTERRUPT_HANDLER(tsi_irq_handler);
3. 安全违规处理函数
void handle_security_violation(uint32_t addr)
{
/* 1. 记录安全事件 */
FMSG("TSI Alert! Illegal access at 0x%x", addr);
/* 2. 阻止进一步访问 */
disable_memory_region(addr);
/* 3. 执行安全策略(示例)*/
if (is_critical_region(addr)) {
wipe_sensitive_data(); // 擦除敏感数据
tee_entry_panic(); // 触发安全重启
}
/* 4. 可选:通知 REE 安全异常 */
notify_ree_side(TEE_EVENT_SECURITY_BREACH);
}
4. 用户空间 TA 调用接口(可选)
// TA 命令处理函数
TEE_Result cmd_monitor_memory(uint32_t param_types, TEE_Param params[4])
{
uint32_t start = params[0].value.a;
uint32_t end = params[0].value.b;
/* 验证参数是否在安全内存范围内 */
if (!validate_memory_range(start, end))
return TEE_ERROR_ACCESS_DENIED;
/* 配置 TSI 监控范围 */
configure_tsi_range(start, end);
return TEE_SUCCESS;
}
5. REE 端应用示例(通过 TEE Client API)
// 在 Linux 用户空间调用 TA
TEEC_Operation op = {0};
op.paramTypes = TEEC_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT);
op.params[0].value.a = 0x80000000;
op.params[0].value.b = 0x8000FFFF;
TEEC_InvokeCommand(session, CMD_ENABLE_MONITOR, &op, &err_origin);
关键配置注意事项:
内存范围验证
在配置监控区域前,需验证地址属于非安全内存:
static bool validate_memory_range(uint32_t start, uint32_t end)
{
return (start >= NS_DRAM_START) && (end <= NS_DRAM_END);
}
中断注册
在 OP-TEE 初始化阶段注册中断:
void main_init_tsi(void)
{
interrupt_add_handler(TSI_IRQ_NUM, tsi_irq_handler, 0);
interrupt_enable(TSI_IRQ_NUM);
}
错误场景处理
- 记录访问时间戳和源地址
- 隔离被攻击的内存区域
- 根据安全策略触发系统重置
性能优化
- 动态加载监控配置(避免全内存监控)
- 使用 TSI 的多区域监控功能(MA35D1支持4个独立监控区)
- 中断防抖动机制(配置最小触发间隔)
安全增强建议:
- 加密内存内容
结合 AES 引擎加密被监控内存数据
- 可信日志存储
将安全事件日志存储在 RPMB 安全存储中
- 运行时策略更新
通过安全 TA 动态更新监控策略:
update_policy(region_id, NEW_PERMISSIONS);
- 与 HSM 联动
触发硬件安全模块进行密钥轮换或证书撤销
调试提示:使用 DMSG() 输出调试信息时需在正式版本中禁用,避免信息泄露风险。通过串口安全调试通道(UART protected by TZASC)查看日志。