资讯中心

【TEE从入门到精通及实战】43 手写一个SGX Enclave内存分配器:从EPC页到TLS的硬核实战

📅 2026/6/23 10:53:52
【TEE从入门到精通及实战】43 手写一个SGX Enclave内存分配器:从EPC页到TLS的硬核实战
开篇故事:当Enclave内存耗尽时,我的金融风控模型崩溃了去年,我帮一家金融科技公司优化SGX Enclave内的风控模型推理。他们的Enclave代码跑在Azure机密计算上,业务逻辑是加载一个300MB的深度学习模型,然后处理实时交易数据。上线第一天,模型加载到一半,Enclave直接OOM(Out of Memory)崩溃——进程被杀,所有会话丢失,导致一笔百万级的交易被误判为高风险。我登录到SGX调试环境,用sgx_get_shared_resource_info查看EPC(Enclave Page Cache)状态,发现Enclave只分配了128MB EPC内存,而模型+运行时+栈空间已经超过200MB。更糟糕的是,他们的代码里大量使用malloc和new,但这些调用在Enclave内部默认走的是非安全的内存分配——直接从宿主进程的堆里拿内存,完全绕过了EPC的加密保护。“我们以为SGX会自动把所有内存加密……”对方的CTO一脸苦笑。这正是我写这篇文章的原因:在SGX Enclave里,默认的内存分配器不安全,你必须手写一个EPC感知的分配器。痛点拆解:Enclave内存分配的三个常见误区误区1:用malloc就安全了?反例代码(你可能会在教程里看到这种写法):