首页 / 知识
关于安全性:使用C语言保护内存分配器
2023-04-12 01:15:00

Secure Memory Allocator in C++我想创建一个分配器,该分配器为内存提供以下属性:
这个想法是,它将包含用户不应访问的敏感信息(如许可证信息)。我已经在网上进行了常规研究,并向其他人询问了有关此问题的信息,但我找不到在此问题上找一个好的位置。 更新 Josh提到使用
并用于
Ted Percival提到了mlock,但是我还没有实现它。 我发现尼尔·弗格森(Neil Furguson)和布鲁斯·施耐尔(Bruce Schneier)的实用密码学也非常有帮助。 您无法真正防止内存访问。如果您以管理员或系统身份运行,则可以阻止分页,但不能阻止管理员或系统读取内存。即使您可以某种方式完全阻止其他进程读取您的内存(您不能这样做),另一个进程实际上仍可以向您的进程中注入新线程并以这种方式读取内存。 即使您可以某种方式完全锁定您的进程并保证操作系统永远不会允许其他人访问您的进程,您仍然没有完全的保护。整个操作系统可以在虚拟机中运行,可以随时暂停和检查该虚拟机。 您不能从系统所有者那里保护内存内容。好莱坞和音乐产业多年来一直对此感到痛苦。如果可能的话,他们已经在这样做了。 在Unix系统上,可以使用mlock(2)将内存页面锁定到RAM中,以防止页面被分页。
每个进程可以锁定多少内存是有限制的,可以用 安装Libsodium,通过#include 使用分配机制 保护堆分配 比malloc()和朋友慢,它们需要3或4个额外的虚拟内存页。
使用
这些功能在受保护的数据周围添加了保护页面,以使其在类似流血的情况下不太可能被访问。 此外,可以使用锁定存储操作( 在 使用后将内存清零
使用后,敏感数据应被覆盖,但可以通过优化编译器或链接程序以静默方式删除memset()和手写代码。 sodium_memzero()函数将尝试从pnt开始有效地将len个字节清零,即使对代码进行了优化也是如此。 锁定内存分配
sodium_mprotect_noaccess()函数使使用sodium_malloc()或sodium_allocarray()分配的区域不可访问。无法读取或写入,但会保留数据。该功能可用于使机密数据不可访问,除非特定操作实际需要时。
sodium_mprotect_readonly()函数将使用sodium_malloc()或sodium_allocarray()分配的区域标记为只读。尝试修改数据将导致该过程终止。
如果您正在为Windows开发,则可以通过多种方法来限制对内存的访问,但是绝对不能屏蔽其他人。如果希望保守秘密,请阅读"编写安全代码",该书在一定程度上解决了该问题,但是请注意,您无法知道代码是在真实计算机上运行还是在虚拟机上运行。有很多Win32 API内容可以处理处理这种事情的加密,包括安全存储秘密-书中谈到了这一点。您可以查看在线Microsoft CyproAPI以获得详细信息。 OS设计人员意识到了这个问题,并且需要确保明文的安全(再次阅读"编写安全代码")。 Win32 API函数 总而言之,请查看您平台上的加密API,它们将比您自己破解某些东西更好地解决该问题。 让我们一次一点:
这很公平。
那将很难。据我所知,您不能禁用虚拟分页,因为它是由操作系统处理的。如果有办法,那么您将在操作系统的肠子里摸索。
您可以通过PGP运行它,并将其加密存储在内存中,然后根据需要对其进行解密。巨大的性能打击。
将所有敏感信息保留在机器之外。严重地。不要将敏感信息存储在内存中。编写一个自定义删除例程,该例程将自动从您执行的所有分配中删除所有数据。切勿一般性地访问装有敏感材料的机器。如果执行数据库访问,请确保在触发之前清除所有访问权限。仅具有特定登录权限的人员可以访问。没有一般的群组访问权限。
转储内存。 您要查询的内容在操作系统级别进行处理。数据进入程序后,很容易被分页。 有动机的人可以使用硬件调试器来访问内存。 @graham
然后,您必须将密钥保存在内存中。这会使它变得更难一点,但绝对不是不可能的。任何有动力的人仍将设法从内存中获取数据。 您最好的选择是实现类似于.NET \\的SecureString类的内容,并务必小心将数据的任何纯文本副本归零(一旦发生异常,也不要忘记清理)被抛出)。使用std :: string等执行此操作的一种好方法是使用自定义分配器。 在Windows上,如果使用CryptProtectMemory(或对于较旧的系统使用RtlEncryptMemory),则加密密码存储在不可分页(内核?)的内存中。在我的测试中,这些功能相当快,尤其是。考虑到他们为您提供的保护。 在其他系统上,我喜欢使用Blowfish,因为它是速度和力量之间的良好结合。在后一种情况下,您必须在程序启动时随机生成自己的密码(河豚的熵为16个字节)。不幸的是,没有操作系统的支持,您可以采取很多措施来保护该密码,尽管您可能会使用一般的混淆技术将硬编码的salt值嵌入可执行文件中,以便与密码结合使用(每小部分)帮助)。 总体而言,该策略只是更广泛的纵深防御方法的一部分。还请记住,到目前为止,最常见的攻击媒介仍然是诸如缓冲区溢出和不清理程序输入之类的简单错误。
您了解过Vista(及更高版本)受保护的进程(直接.doc下载)。我相信由操作系统实施的保护是娱乐界的礼貌。 @德里克公园 他只是更努力地说,不是没有可能。 PGP将使其变得更加困难,并非没有可能。 @Chris
但是您实际上必须愿意为别人拥有的计算机付费。 :p @roo
那绝对是问题所在。只要您从不授予访问权限,就可以安全地存储内容,但是一旦授予访问权限,您的控制权就消失了。您可以使其更加困难,但这仅是全部。 @Derek:哦,但是有了可信的计算,您可以使用内存屏蔽! :-P devils-advocate> |
最新内容
相关内容
pythonpython是前端语言吗?
pythonpython是前端语言吗?,代码,互动,培训,平台,标准,设计,语言,前端,语法,解释性,python语言属于后端开发语言。Python是一个高层次的结合pythonpython是什么类型的语言
pythonpython是什么类型的语言,培训,系统,教育,软件,电脑,代码,简介,人工智能,类型,语言,python是一种面向对象、解释型、动态类型计算机程序python脚本语言
python脚本语言,代码,设计,情况,培训,语句,项目,基础,意外,异常,空格,Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被python为什么是胶水语言
python为什么是胶水语言,代码,标准,培训,环境,一致,系统,统一,数据,周期性,服务,胶水语言先从Helloworld开始。所有学python的童鞋都会从这句python如何查看对象属性
python如何查看对象属性,培训,网络,系统,函数,对象,属性,变量,示例,实例,模块,在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要pythonpython是脚本语言吗?
pythonpython是脚本语言吗?,设计,培训,大规模,项目,软件,面临,开发者,语言,脚本语言,方法,Python是脚本语言。python是一种计算机程序设计语python如何释放内存
python如何释放内存,培训,情况,名称,对象,赋值,内存,别名,变量,语句,函数,关于Python中的内存释放问题首先就不得不提到Python解释器在何种情python语言的全排列怎么提速?
python语言的全排列怎么提速?,培训,情况,代码,排列,元素,程序,方法,之后,语言,生成器,python从n个不同元素中任取m(m≤n)个元素,按照一定的顺python伪私有属性的理解
python伪私有属性的理解,名称,对外,培训,属性,定义,类别,实例,冲突,前面,后面,python伪私有属性的理解1、说明(1)确保定义类别中的属性(类别python调试器是什么
python调试器是什么,时间,培训,标准,工具,功能,源码,方面,断点,语法,实例,python调试器是什么1、说明Python调试器,是可以节省时间并提高Pytho关于C ++:我无法让调试器停止发生首
关于C ++:我无法让调试器停止发生首次机会异常的中断,关于C ++:我无法让调试器停止发生首次机会异常的中断,设置,调试程序,chance,exc关于不可知的语言:忽略引号部分拆分
关于不可知的语言:忽略引号部分拆分字符串,关于不可知的语言:忽略引号部分拆分字符串,算法,分割,字符串,有什么,Split a string ignori