内存已加密

Is memory encrypted?

本文关键字:加密 内存      更新时间:2023-10-16

我想在变量中存储一些数据(我知道变量存储在内存中)。内存中的数据被加密了吗?此外,软件是否能够读取存储在内存中的变量名,并能够从中实际提取数据?

内存在我所知道的任何平台上都是不加密的。无论如何,它的价值都是有限的,因为处理器通常必须对明文数据进行操作,因此数据必须在机器的某个地方上以明文形式存在。

相反,现代操作系统(以及大多数历史操作系统)使用内存保护,只允许某些进程访问某些内存页。每个内存页面都具有读取、写入和(有时)执行权限。操作系统内核负责处理上下文切换上的这些权限,以根据需要授予或拒绝每个进程对内存页的访问。

Saltzer和Schroeder 1975年的论文《计算机系统中的信息保护》描述了一种使用分段而非页面的机制,但该原理几十年来一直保持不变。

通常,任何进程拥有的内存页都是具有足够高权限的进程可读的;操作系统内核当然可以修改内存的任何页面,它也可以选择将该权限委托给用户进程。Linux上的ptrace(2)系统调用提供了一个调试器后门,可用于实现只读内存检查系统,如strace(1)ltrace(1)gdb(1),或内存修改系统,如基于gdb(1)ptrace的沙箱环境。

或者,在某些情况下,可以转储核心文件(请参阅core(5)setrlimit(2)手册页),其中包含进程内存的内容。这就是为什么在发布之前清除重要数据的内存很重要的原因之一。

我是一个团队的成员,该团队致力于在运行程序时加密指针(非PTO链接)。开销惊人,角落案例的数量更是惊人。将这些技术用于普通程序可能并不实用,尽管我可以想象在一个受限的环境中,加密内存或控制结构是可行的方法。(尽管可能其他技术更合适。)

好的,所以我想把一些数据存储在一个变量(我知道,变量存储在内存中)-数据在内存中被加密?

此外,软件是否可以能够读取变量名称存储在内存中,并且能够真的从中提取数据吗?

名称还是值?

对于值:

你的意思是一个不同的程序,而不是你的,来访问和阅读它?是的,这是可能的,根据操作系统的不同,这可能很棘手,也可能更棘手,但可行。

对于名称:这取决于你如何构建你的软件——如果你在其中留下调试信息——这很容易做到。

编号。内存通常不加密。

内存存储您写入其中的数据。在某些情况下,内存将包含数据的纯文本版本,这有时被用作利用系统的一种方式。

也就是说,一旦攻击者能够物理访问您的机器,就很难保护它们。

有一些特定于语言的功能试图解决这个问题,例如C#SecureString,但即使是这些也有其局限性。

内存中的数据被加密了吗?

通常不会。我说"通常"只是因为你可以想象出一个加密内存的操作系统或硬件。所以真的,没有。

软件是否能够读取存储在内存中的变量名,并能够从中实际提取数据?

取决于。使用像PHP这样的解释语言编写的代码,变量名会保存在内存中的某个位置,因此这是可能的。使用编译后的代码(如C++),可以使用调试信息对其进行编译(然后调试器可以查看变量名并提取其值),也可以在没有调试信息的情况下进行编译,然后变量名就会丢失。

此外,编写一个读取任意内存地址的程序非常容易,但要弄清楚读取的字节意味着什么要困难得多。

sarnold关于内存保护的回答是正确的。然而,有些攻击可以绕过多种形式的内存保护。这些攻击包括隐蔽通道、新分配内存中的剩余信息、基于DMA的攻击(如火线)、攻击带访问权限的可信设备、攻击内核模式软件、物理攻击等。对内存进行加密和完整性检查的组合可以帮助应对其中一些攻击。

如果你对加密内存感兴趣,这里有几个项目供你研究。

麻省理工学院AEGIS处理器

SecureCore架构

SecureME架构

空军基于FPGA的HAVEN系统

防篡改的加密协处理器可能会用于其中的一些。它们并不是一般目的。

再次流行的另一种选择是将整个平台、操作系统和所有内容放入托管或类型安全的代码中。这允许类型系统为您提供大部分内存保护。示例包括Scheme48、SPIN、JX和Verve操作系统和软件。

出现了一些解决方案,可以对标准x86微处理器上的内存进行加密,使其免受物理危害(冷启动攻击、有人拿走包含持久数据的非易失性双列直插内存模块(NVDIMM)、插入进行直接内存访问(DMA)攻击的恶意I/O卡等)。

一种方法是使用在CPU末级缓存(L3缓存)中运行的高保证系统管理程序。CPU内部是明文,CPU外部是加密内存。

请注意,您仍然需要针对特权用户进行保护,并修补您的应用程序(所有您已经做过的事情),但新技术确实可以保护正在使用的数据免受物理危害。