交换文件是否可能包含您访问过的文件的数据块,并且可以在取证分析期间检测到吗?
你怎么能防止这种情况?
使用深度冻结或类似软件是有效的解决方案吗?
交换文件是否可能包含您访问过的文件的数据块,并且可以在取证分析期间检测到吗?
你怎么能防止这种情况?
使用深度冻结或类似软件是有效的解决方案吗?
是的,交换文件可能包含敏感数据。
在Windows上,您可以通过以下方式配置要在关机时清除的页面文件(交换文件):
regedit32.exe
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
REG_DWORD
设置为 1我不确定这是否是对交换数据的安全删除,但从它增加了关闭过程的分钟数以及微软页面上关于以下内容的文本来看ClearPageFileAtShutdown
:
某些第三方程序可以将未加密(纯文本)密码或其他敏感信息临时存储在内存中。尽管清除页面文件不是计算机物理安全的合适替代品,但您可能希望这样做以在 Windows 未运行时提高计算机上数据的安全性。"
我认为数据已被安全擦除。
在Linux 上,您可以手动擦除交换分区:
swapon -s
swapoff -a
dd if=/dev/zero of=/dev/sdaX bs=1024
/etc/fstab
mkswap /dev/sdaX -U <old_uuid> 1024
swapon -a
Secure-Delete 软件包提供了更好的擦除工具,它带有以下命令:
Sswap旨在以安全的方式删除可能仍位于您的交换空间中的数据,这些数据无法被小偷、执法或其他威胁恢复。擦除算法基于论文“从磁性和固态中安全删除数据”内存”由领先的民用密码学家之一彼得古特曼在第 6 届 Usenix 安全研讨会上发表。
使用 Linux,您可以通过使用受保护的内存来确保不会交换像 PGP 这样的明智工具。
但是你必须配置你的预休眠脚本来杀死所有这些明智的工具并卸载所有加密的文件系统!
如果您正在编码,许多“非托管”语言支持(需要)删除动态分配的内存的能力。如果您想真正确定,您通常还可以将所述内存的值设置为全零,或设置为对攻击者无用的值(随机数据,“所有工作,不玩......”等)。
在 JVM 或 CLR 等托管内存运行时中,您没有此控制权;垃圾收集器检查正在执行的代码是否仍然有对该对象的任何引用,如果没有,它会安排它进行收集。标记过程,以及由此产生的内存释放和堆重组,发生在运行时认为可能是清理的好时机,而不是当您知道应该清理某些东西时。在这些环境中,通常会提供专门用于处理敏感数据的结构。
在 .NET 中,这些东西的主要类型称为SecureString,与基本的 System.String 相比,它有几个优点:
该对象派生自一个基本类族,该类族将其标识为具有“关键终结器”;只要 CLR 对此事有发言权,终结器(在 SecureString 的情况下会从内存中删除所有敏感数据)将在对象超出范围时执行。
用户可以通过调用 Clear() 同步擦除 SecureString 的数据状态。如果用户使用内置的 IDisposable 接口,或者如果没有被用户清理,当垃圾收集器最终确定对象时,也会发生这种情况,但鼓励用户使用 Clear() 或 Dispose() 来清理在用户确定他们不再需要它的那一刻记忆。
在所有情况下,敏感数据都应在内存中以明文形式保存,并在删除前尽可能短的时间。如果它可以在大部分时间保持加密,并且只在需要时解密为明文(如 SecureString 允许的那样),那就太好了。