是否有必要清理堆栈内容?

Jul*_*ano 8 c c++ pci-dss

我们正在获得PCI PA-DSS认证,其中一项要求是避免将干净的PAN(卡号)写入磁盘.应用程序不会将此类信息写入磁盘,但如果操作系统(在本例中为Windows)需要交换,则将内存内容写入页面文件.因此,应用程序必须清理内存以防止RAM捕获器服务读取敏感数据.

有三种情况需要处理:

  • 堆分配(malloc):在释放内存之前,可以清除该区域 memset
  • 静态或全局数据:使用后,可以使用清理区域 memset
  • 本地数据(函数成员):数据放在堆栈上,在函数完成后无法访问

例如:

void test()
{
  char card_number[17];

  strcpy(card_number, "4000000000000000");
}
Run Code Online (Sandbox Code Playgroud)

在执行测试之后,存储器仍然包含card_number信息.

一条指令可以在测试结束时将变量card_number归零,但这应该适用于程序中的所有函数.

memset(card_number, 0, sizeof(card_number));
Run Code Online (Sandbox Code Playgroud)

有没有办法在某个时刻清理堆栈,就像程序结束前一样?

Gro*_*cus 4

当程序完成时清理堆栈可能为时已晚,它可能已经在运行时的任何时刻被换出。您应该仅将敏感数据保存在使用VirtualLock锁定的内存中,这样它就不会被换出。这必须在读取所述敏感数据之前发生。

您可以像这样锁定多少内存有一个小限制,因此您可能不会锁定整个堆栈,并且应该完全避免在堆栈上存储敏感数据。