【发布时间】:2018-10-02 21:51:13
【问题描述】:
如果我们在 C 语言中有一个函数,其中包含一个简单的单元化 ìnt 变量,我们知道这个变量可能并不总是初始化为零。相反,它可能包含一些“垃圾”值。
我的问题是:究竟能代表什么价值?可能是之前终止的进程留下的一些信息(未释放的内存)?
如果是,那么这不是一个极其严重的安全漏洞吗?因为通过这种方式,任何进程都可以读取与当前进程使用相同地址空间的进程留下的信息(密码、令牌等)。
我的假设是,对于每个新进程,内核会将分配给该新进程的内存归零(至少对于堆栈而言),然后将可执行文件加载到内存中。这些“垃圾”值实际上是由当前进程的加载过程生成的值(因此无法访问使用相同进程的其他进程的任何剩余数据地址空间)。
我正在与一些人就这个话题争论,我真的想要一个清晰而全面的答案(我相信有一个)。我们假设内核是基于 debian/centos 的。很高兴知道不同内核/操作系统的行为是否存在差异。
非常感谢。
【问题讨论】:
-
这样的变量会有一个indeterminate值。
-
也许,也许不是。这就是不确定值的意义所在,您只是无法分辨它们是什么或它们来自什么。此外,对于其他纯整数类型,该值可能是 trap 表示,即使读取这些也可能导致崩溃。
-
现代操作系统在后台任务被进程释放后将其归零。所以不,那个 indeterminate 值不是来自另一个进程的值。
-
请区分OS和C标准。后者说一个未初始化的变量正是如此。然而,操作系统可能会做其他事情,但 C 代码不能试图对此进行猜测。如果 C 标准说一个变量是未初始化的:那么你必须这样对待它。
标签: c linux security process stack