开篇故事:一次“幽灵”密钥泄露事件
2022年,某头部云计算厂商的机密计算团队收到一个紧急工单:客户在完成一个为期3个月的机密计算项目后,按照安全规范销毁了所有密钥。
但两周后,客户的安全审计发现,内存转储文件中仍残留着部分密钥的碎片信息。
客户崩溃了:“我们明明调用了free()和memset(),为什么密钥还在?”
技术团队调取日志后发现,问题出在三个环节:一是开发者只清空了应用层内存,忽略了TEE内部运行时库的缓存副本;二是清空操作后没有执行缓存行刷新指令;三是TEE的EPC页面被回收后,物理内存页并未被硬件清零。
这个案例告诉我们:在TEE环境中,“删除”不等于“销毁”。今天,我们就来彻底解决这个棘手问题。
痛点拆解:常见的“假删除”实现
误区1:认为memset能保证安全删除
这是最常见的错误。看这个反例:
# 反例代码:看似安全,实则危险importctypesdefunsafe_delete_key