问题描述
|
我想在变量中存储一些数据(我知道变量存储在内存中)。内存中的数据是否被加密?另外,软件是否有可能能够读取存储在内存中的变量名并能够从中实际提取数据?
解决方法
在我所知的任何平台上,内存均未加密。无论如何,它的价值都是有限的,因为处理器通常必须对纯文本数据进行操作,因此数据必须在某处的机器上为纯文本格式。
取而代之的是,现代操作系统(以及大多数历史悠久的操作系统)使用内存保护来仅允许某些进程访问某些内存页面。每个内存页面都具有读取,写入和(有时)执行权限。操作系统内核负责处理上下文切换上的那些权限,以根据需要授予或拒绝对每个进程的内存页的访问。
Saltzer和Schroeder于1975年发表的论文《计算机系统中的信息保护》描述了一种使用段而不是页面的机制,但数十年来该原理一直未变。
通常,任何进程拥有的内存页面都可以被具有足够高特权的进程读取。 OS内核当然可以修改任何内存页面,并且它也可以选择将该特权委派给用户进程。 Linux上的“ 0”系统调用提供了一个调试器后门,可用于实现只读内存检查系统(例如,“ 1”或“ 2”或“ 3”)或内存修改系统(例如,基于“ 3”和“ 5”的沙箱环境)。
或者,可以在某些情况下(参见ѭ6和
setrlimit(2)
联机帮助页)转储包含进程内存内容的核心文件。这就是为什么在发布之前清除重要数据的存储很重要的原因之一。
我是一个团队的成员,该团队致力于在运行的程序中加密指针(非PTO链接)。开销是惊人的,角落案例的数量甚至更令人惊讶。尽管我可以想象在受限的环境中使用加密的内存或控制结构是可行的方法,但将这些技术用于通用程序可能并不实际。 (尽管可能其他技术更合适。)
,
好的,我想在其中存储一些数据
一个变量(我知道,变量
存储在内存中)-该数据
在内存中被加密?
没有
另外,软件是否有可能
能够读取变量名
存储在内存中并能够
实际从中提取数据吗?
名称或值?
对于值:
您是说要访问和阅读该程序,而不是您自己的程序吗?是的,这是可能的,具体取决于操作系统,这可能会比较棘手或更加棘手,但可行。
对于名称:
取决于您构建软件的方式-如果在其中保留调试信息-这样做很容易。
, 不可以。内存通常不加密。
内存存储您写入其中的数据。有时,内存将包含数据的纯文本版本,有时这被用作利用系统的一种方式。
就是说,一旦攻击者可以物理访问您的计算机,则很难保护它们。
有一些特定于语言的功能试图解决此问题,例如C#SecureString
,但即使这些也有其局限性。
,
内存中的数据是否被加密?
通常没有。我之所以说“通常”,只是因为可以想象到您可以制作一个对内存进行加密的操作系统或硬件。真的,不。
软件是否有可能能够读取存储在内存中的变量名并能够从中实际提取数据?
要看。使用解释性语言(如PHP)之类的代码,变量名保存在内存中的某个位置,因此可以想象得到。使用像C ++这样的已编译代码,可以使用调试信息对其进行编译(然后调试器将能够查看变量名并提取其值),或者不使用它就可以对其进行编译,然后变量名将丢失。
另外,编写一个程序可以读取任意的内存地址非常容易,但是要弄清楚读取的字节意味着什么却要困难得多。
,sarnold关于内存保护的答案是正确的。但是,有些攻击可以绕过许多形式的内存保护。这些包括秘密通道,新分配的内存中的剩余信息,基于DMA的攻击(如火线),使用访问权限攻击受信任的设备,攻击内核模式软件,物理攻击等。加密和内存完整性检查的组合可以帮助解决某些问题。这些攻击。
如果您对加密的内存感兴趣,可以参考以下几个项目。
MIT AEGIS处理器
SecureCore架构
SecureME体系结构
空军基于FPGA的HAVEN系统
为了防止篡改,可以使用加密协处理器来实现某些目的。它们只是不通用的。
再次流行的另一种选择是将整个平台(包括操作系统和所有平台)置于托管或键入安全代码中。这使类型系统可以为您执行大部分的内存保护。示例包括Scheme48,SPIN,JX和Verve操作系统和软件。
, 有一些新的解决方案可以对标准x86微处理器上的内存进行加密,以免受物理损害(冷启动攻击,有人放弃了包含持久数据的非易失性双列直插式内存模块(NVDIMM),插入执行直接内存访问的恶意I / O卡) (DMA)攻击等)。
一种方法是使用在CPU末级高速缓存(L3高速缓存)中运行的高度保证的管理程序。 CPU内部是明文,CPU外部是加密内存。
请注意,您仍然需要防止特权用户和补丁应用程序(您已经做过的所有事情),但是新技术确实可以保护使用中的数据免受物理损害。