我们正在接受 PCI PA-DSS 认证,其要求之一是避免将干净的 PAN(卡号)写入磁盘。应用程序不会将此类信息写入磁盘,但如果操作系统(在本例中为 Windows)需要交换,内存内容将写入页面文件。因此,应用程序必须清理内存以防止 RAM 捕获程序服务读取敏感数据。
需要处理三种情况:
- 堆分配(malloc):在释放内存之前,可以使用
memset
清理该区域 - 静态或全局数据:使用后,可以使用
memset
清理该区域 - 本地数据(函数成员):数据入栈,函数结束后不可访问
例如:
void test()
{
char card_number[17];
strcpy(card_number, "4000000000000000");
}
测试执行后,内存中仍然有card_number信息。
一条指令可以在测试结束时将变量 card_number 归零,但这应该适用于程序中的所有函数。
memset(card_number, 0, sizeof(card_number));
有没有办法在某个时候清理堆栈,比如在程序结束之前?
最佳答案
在程序完成时立即清理堆栈可能为时已晚,它可能已经在其运行时的任何时候被换出。您应该只将敏感数据保存在使用 VirtualLock 锁定的内存中所以它不会被换掉。这必须在读取敏感数据之前发生。
像这样可以锁定多少内存有一个小限制,因此您可能不会锁定整个堆栈,并且应该完全避免在堆栈上存储敏感数据。
关于c++ - 是否需要清理堆栈内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44314867/