c++ - 是否需要清理堆栈内容?

标签 c++ c pci-dss

我们正在接受 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/

相关文章:

http - 为什么 FireFox 和某些其他浏览器会在服务器响应时更改地址栏中的 URL

c++ - 降序插入排序

c - 全局变量链接行为

内存使用异常的 C Python 模块

c - FTP被动模式: connect to server

c++ - g++ 提示 constexpr 函数不是常量表达式

c++ - 如何在C++中使用其构造函数初始化unique_ptrs的二维 vector ?

c++ - 如何在 Linux 平台上使用 C++ 中的 gTest 检测内存泄漏

ssl - 账户密码传输和 PCI DSS 合规性