密码在内存中吗?

信息安全 操作系统 密码管理 磁盘加密
2021-09-08 17:49:42

我有一个加密硬盘(dm_crypt)。这就是为什么我将密码存储在一个简单的文本文件中。我通常从中复制/粘贴密码。行!
问:如果我打开这个文本文件,它就会进入内存。所以我所有明文格式的密码都“那里”..如果我关闭文本文件,密码会从内存中删除吗?我正在使用的内存可以被其他人实时访问吗?有没有更好/更安全的方法来复制/粘贴我的密码?例如,如果我按 Ctrl+V 来设置它应该清除剪贴板吗?运行 Fedora 14 ..
或者我如何“加密我的 RAM”?有什么办法吗?
谢谢!

3个回答

坦率地说,是的,他们可以。这是一个过于简单化的答案。

更复杂的答案是您需要了解您的操作系统如何处理内存。您可能会听到有关戒指、特权级别等的讨论。让我简要解释一下:

  • 当你的操作系统启动时(通过整个 16 位 BIOS 的东西),它基本上有一大堆内存(你的整个 RAM)可以使用,并且在特权模式下这样做,这意味着它可以做任何它喜欢的任何事情记忆的一部分。
  • 然而,自 1980 年以来的 x86 体系结构(在我出生之前的某个时间)就支持保护模式的概念,其中 CPU 硬件提供了允许操作系统以这样一种方式启动应用程序的机制,即它们的内存地址是隔离的。
  • 因此,这种保护模式允许操作系统为每个应用程序创建一个虚拟地址空间。这意味着应用程序的内存概念与实际的物理内存地址不同,并且应用程序没有对内存的特权访问。实际上,应用程序直接被阻止修改彼此的内存地址,因为它们看不到它,除非通过明确定义的操作系统请求(系统调用)来请求诸如共享内存之类的东西,其中两个进程共享一个地址空间。

(这是一种简化,为简洁起见,我跳过了大块内容,但这就是要点 - 应用程序请求访问由操作系统和硬件管理的内存)。

所以理论上,你没问题,对吧?技术上不正确。正如我所说,操作系统确实提供了明确定义的方式来访问其他进程的内存。就可能性而言,以下是一些可能的呈现方式:

  • 如果我转储应用程序的内存,我可以很容易地解析存储的密码。
  • 调试器适当设计的用户态风格的 rootkit 可能能够让我访问该内存。我不是这种技术的专家,但知道在某些情况下可以做到。
  • 最后,操作系统在这里可能会弄巧成拙。您有权访问的虚拟内存还有其他一些后果。操作系统将其显示为虚拟,因为它们经常交换内存以确保有足够的 RAM 可用于当前运行的应用程序。所以一个有趣的攻击可能是导致系统交换,然后崩溃并检查交换分区。你的交换也加密了吗?

最后,我应该指出,如果您的攻击者通过内核模块在内核中运行代码,那么游戏无论如何都结束了,因为没有什么可以阻止他们在您的内存空间中搜索 ascii 字符串。

但是,现实一点:

  • 如果您的内核通过 rootkit 受到威胁,那么键盘记录器可能比旨在获取密码的扫描内存更容易实现。
  • 用户态风格的rootkits 涉及调试器,用于评估不是为调试而设计的程序(即没有调试符号等),即使它们在理论上是可能的,实现起来也不是一件容易的事。利用这一点也不容易——你,用户,将不得不被欺骗在调试器下执行所述编辑器,这可能意味着社会工程或物理访问。

但是,我的建议是,您永远不要在任何地方存储明文密码。如果您需要提醒,我建议使用部分不完整的提示,这将唤醒您的记忆并允许您推断密码,但合理地阻止其他人这样做,即使他们认识您。这远非理想,但比明文密码好。

我会使用 KeepassX,它通过您的密码和可选的密钥文件使用加密文件,并且不会关心这些理论问题。

  • 使用 Keepass,您还可以阻止剪贴板管理器,因此当剪贴板更改时他们不会收到通知(例如,这会阻止通过自动类型粘贴的文本保存在剪贴板管理器软件中。如果未启用此自动类型,则会发生这种情况)

  • 还有一个拆分秘密的功能,可以防止应用程序定期检查剪贴板内容。