内存运行时加密

1. 概述

当应用程序使用 API key、访问令牌或私有凭证等敏感数据时,这些数据会暂时驻留在堆内存中。 为降低恶意软件或内存扫描器定位这些机密的可能性,我们采用了基于 memguard 构建的专用内存保护层。这可以确保敏感信息存放在锁定、受保护且生命周期短暂的内存区域中,防止意外泄露或使用后残留。

虽然内存运行时加密能显著降低侧信道攻击的风险,但并不能 100% 完全消除此类风险,也不能完全替代类似 Confidential VM 的完整 TEE(可信执行环境)。

使用锁定、受保护的堆内存进行内存运行时加密
Click to open the full-size diagram

内存运行时加密:通过锁定、受保护的堆内存,保护敏感密钥和凭证免受内存扫描器和恶意软件的侵害。

2. 为什么重要

即使在静态存储和传输过程中都进行了加密,机密在使用时(为运行时操作而解密时)仍然可能暴露。内存攻击往往正是针对这一时间窗口,通过扫描进程堆来寻找可识别的密钥特征。

通过将凭证隔离在受保护的内存中:

  • 数据被锁定在物理 RAM 中,不会被交换到磁盘。
  • 内存页周围设有保护区域,可检测或阻止访问尝试。
  • 缓冲区在使用后会被显式擦除。
  • 机密在内存中的存活时间被缩短到毫秒或秒级。

这一方法为防范运行时凭证窃取和进程内恶意软件提供了纵深防御。

3. 架构概述

3.1 解密与加载

敏感数据(例如 API key 或令牌)从安全存储中解密,或从密钥管理服务中获取,然后直接放入受保护的堆内存。

3.2 受保护内存区

数据加载后会保存在 memguard 保护的安全区(enclave)中:

  • 不可交换(基于 mlock 的保护)
  • 周围设有保护页
  • 出错或作用域结束时自动销毁

3.3 短暂访问

受保护的数据只会在需要它的操作(例如认证、签名或加密)期间被短暂访问,不会在内存的其他位置创建永久副本。

3.4 立即清零

操作完成后,内存缓冲区会被安全擦除并释放,不会留下任何可恢复的机密痕迹。

4. 总结

敏感凭证只会被解密到受保护的堆内存中,与普通进程空间隔离。它们只被短暂使用,随即被擦除,且绝不会写入日志或磁盘,从而确保即使主机被攻破或遭到内存检查,也无法恢复正在使用的机密。