作者:沈晓燕-东东 | 来源:互联网 | 2022-12-03 11:47
如果我们在C中有一个带有简单的单位化ìnt
变量的函数,我们就知道这个变量可能并不总是初始化为零.相反,它可能包含一些"垃圾"值.
我的问题是:究竟什么能代表这个价值?它可能是由之前终止的进程留下的一些信息(未同步的内存)?
如果是,那么这不是一个极其严重的安全漏洞吗?因为以这种方式,任何进程都可以读取使用与当前进程相同的地址空间的进程留下的信息(密码,令牌等).
我的假设是,对于每个新进程,内核将为该新进程分配的内存(至少对于堆栈)归零,然后将可执行文件加载到内存中.那些"垃圾"值实际上值由所产生的加载过程的的当前进程(使得没有办法来访问从使用相同的地址空间的其他进程的任何左数据).
我正在与一些研究员讨论这个话题,我真的想要一个清晰而全面的答案(我确信有一个).我们假设内核是基于debian/centos的.很高兴知道不同内核/ OS-es的行为是否存在差异.
谢谢你.
1> Eric Postpis..:
这应该分为两个问题:
C标准对未初始化对象的价值有何评价?
叫什么内存main
?
第一个问题在其他Stack Overflow问题和答案中讨论.一个完整的答案是复杂的,涉及到各种情况的讨论,这个问题似乎并没有特别提出这个问题,所以我将把它留给其他Stack Overflow问题.对于这个问题,足以说明使用未初始化对象的值很容易出现未定义的行为.此外,这不仅仅是因为对象的内存可能具有麻烦的值,而是因为C标准允许C实现以各种方式将读取未初始化值的程序视为行为不当的程序,然后优化可以进一步破坏程序.
就内存中的内容而言(假设我们有一种支持的方式来检查它,可能通过使用汇编语言而不是C),那么提供任何类型的安全性的每个多用户系统在创建之前都会擦除(或以其他方式初始化)内存可用于流程.main
正如问题所设想的那样,当前在内存中调用的任何值都是加载过程的结果或操作系统初始化的结果.(请注意,加载过程的结果包括加载常量数据和程序文本 - 因此我们希望在那里找到定义的值 - 以及加载代码完成的工作中剩余的任何数据 - 其变量等等. )
这个问题要求一个明确的答案,所以让我澄清一下:一个操作系统,对用户进程提供安全,必须使内存供其它进程之前擦除存储器中的先前过程数据.通过信任程序不检查它给出的内存并用它做任何想做的事情,就不能提供安全性.
不打算由不受信任的用户共享的基本系统当然可以在创建新进程并为其分配内存时跳过内存的初始化.