内存已加密
Is memory encrypted?
我想在变量中存储一些数据(我知道变量存储在内存中)。内存中的数据被加密了吗?此外,软件是否能够读取存储在内存中的变量名,并能够从中实际提取数据?
内存在我所知道的任何平台上都是不加密的。无论如何,它的价值都是有限的,因为处理器通常必须对明文数据进行操作,因此数据必须在机器的某个地方上以明文形式存在。
相反,现代操作系统(以及大多数历史操作系统)使用内存保护,只允许某些进程访问某些内存页。每个内存页面都具有读取、写入和(有时)执行权限。操作系统内核负责处理上下文切换上的这些权限,以根据需要授予或拒绝每个进程对内存页的访问。
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外部是加密内存。
请注意,您仍然需要针对特权用户进行保护,并修补您的应用程序(所有您已经做过的事情),但新技术确实可以保护正在使用的数据免受物理危害。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- AES加密到解密未正确输出
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 从内存导入密钥时加密++ BERDecode异常?
- 内存中的C 加密变量
- 简单加密程序集程序-写入内存位置时发生访问冲突
- 内存已加密