交换文件可能包含敏感数据

信息安全 数据泄露
2021-09-01 04:43:39

交换文件是否可能包含您访问过的文件的数据块,并且可以在取证分析期间检测到吗?

你怎么能防止这种情况?

使用深度冻结或类似软件是有效的解决方案吗?

4个回答

是的,交换文件可能包含敏感数据。

Windows上,您可以通过以下方式配置要在关机时清除的页面文件(交换文件):

  1. 开始 regedit32.exe
  2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
  3. ClearPageFileAtShutdown的数据值设置为1
  4. 如果该值不存在,则使用类型创建它并将其REG_DWORD设置为 1
  5. 重新开始

我不确定这是否是对交换数据的安全删除,但从它增加了关闭过程的分钟数以及微软页面上关于以下内容的文本来看ClearPageFileAtShutdown

某些第三方程序可以将未加密(纯文本)密码或其他敏感信息临时存储在内存中。尽管清除页面文件不是计算机物理安全的合适替代品,但您可能希望这样做以在 Windows 未运行时提高计算机上数据的安全性。"

我认为数据已被安全擦除。

Linux 上,您可以手动擦除交换分区:

  1. 显示交换详细信息: swapon -s
  2. 卸载交换分区: swapoff -a
  3. 用零覆盖它: dd if=/dev/zero of=/dev/sdaX bs=1024
  4. 获取旧交换分区的 UUID /etc/fstab
  5. 使用该 UUID 创建一个新的交换分区: mkswap /dev/sdaX -U <old_uuid> 1024
  6. 挂载使用: swapon -a

Secure-Delete 软件包提供了更好的擦除工具,它带有以下命令:

  • srm(安全删除)——用于删除当前硬盘上的文件或目录。
  • smem(安全内存擦除器)– 用于擦除计算机内存 (RAM) 中的数据痕迹。
  • sfill(安全可用空间擦除器)——用于擦除磁盘上可用空间中的所有数据痕迹。
  • sswap(安全交换擦除器)——用于擦除交换分区中的所有数据痕迹。

Sswap旨在以安全的方式删除可能仍位于您的交换空间中的数据,这些数据无法被小偷、执法或其他威胁恢复。擦除算法基于论文“从磁性和固态中安全删除数据”内存”由领先的民用密码学家之一彼得古特曼在第 6 届 Usenix 安全研讨会上发表。

交换文件是否可能包含您访问过的文件的数据块,并且可以在取证分析期间检测到吗?

是的。此外,您可能能够读取一些密码、加密密钥和其他敏感/私人数据。

你怎么能防止这种情况?

您可以通过使用一些特定于操作系统的调用来禁止进程中特定虚拟地址空间的内存交换:

其他现代操作系统将提供类似的功能。但是,当您关闭 PC 时,数据通常不会从物理内存(例如 RAM)中删除,并且仍然可以使用冷启动攻击来检索数据

使用 Linux,您可以通过使用受保护的内存来确保不会交换像 PGP 这样的明智工具。

但是你必须配置你的预休眠脚本来杀死所有这些明智的工具卸载所有加密的文件系统!

如果您正在编码,许多“非托管”语言支持(需要)删除动态分配的内存的能力。如果您想真正确定,您通常还可以将所述内存的值设置为全零,或设置为对攻击者无用的值(随机数据,“所有工作,不玩......”等)。

在 JVM 或 CLR 等托管内存运行时中,您没有此控制权;垃圾收集器检查正在执行的代码是否仍然有对该对象的任何引用,如果没有,它会安排它进行收集。标记过程,以及由此产生的内存释放和堆重组,发生在运行时认为可能是清理的好时机,而不是当您知道应该清理某些东西时。在这些环境中,通常会提供专门用于处理敏感数据的结构。

在 .NET 中,这些东西的主要类型称为SecureString,与基本的 System.String 相比,它有几个优点:

  • SecureString 是可变的,不像 String,虽然是引用类型,但被视为不可变;每次分配一个字符串变量时,都会在堆上创建一个新的 String 对象,这意味着当您处理敏感数据时,堆上可能同时存在多个所述数据的不同副本。SecureString 在堆上的单个内存空间内处理自身的所有操作。
  • 保存在 SecureString 中的数据始终是加密的,因此即使它被随意放置,攻击者也需要访问存储在受保护的非托管内存中的密钥容器。
  • 该对象派生自一个基本类族,该类族将其标识为具有“关键终结器”;只要 CLR 对此事有发言权,终结器(在 SecureString 的情况下会从内存中删除所有敏感数据)在对象超出范围时执行。

  • 用户可以通过调用 Clear() 同步擦除 SecureString 的数据状态。如果用户使用内置的 IDisposable 接口,或者如果没有被用户清理,当垃圾收集器最终确定对象时,也会发生这种情况,但鼓励用户使用 Clear() 或 Dispose() 来清理在用户确定他们不再需要它的那一刻记忆。

在所有情况下,敏感数据都应在内存中以明文形式保存,并在删除前尽可能短的时间如果它可以在大部分时间保持加密,并且只在需要时解密为明文(如 SecureString 允许的那样),那就太好了。