malloc是确定性的吗?

Met*_*est 25 c linux malloc x86 gcc

malloc是确定性的吗?说如果我有一个分叉进程,也就是另一个进程的副本,并且在某些时候它们都调用了malloc函数.两个进程中分配的地址是否相同?假设其他执行部分也是确定性的.

注意:这里,我只讨论虚拟内存,而不是物理内存.

Fle*_*exo 27

完全没有理由确定它是确定性的,事实上它可能有一些好处,它不是确定性的,例如增加利用漏洞的复杂性(参见本文).

这种随机性有助于使利用更难写.要成功利用缓冲区溢出,通常需要做两件事:

  1. 将有效负载交付到可预测/已知的内存位置
  2. 导致执行跳转到该位置

如果内存位置不可预测,那么跳转会变得非常困难.

标准§7.20.3.3/ 2中的相关引用:

malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的

如果打算使其具有确定性,那么就可以明确说明.

即使它今天看起来确定性,我也不会打赌它更新的内核或更新的libc/GCC版本.

  • @jweyrich - C标准明确指出它不是确定性的.它不是确定性的事实可以用于各种方式的实现 - 我使用地址空间随机化作为一个明显的现代例子,但还有其他不太明显的原因(实现没有虚拟内存弹簧这样的东西) ). (3认同)

Tom*_*mmy 11

C99规范(至少在其最终的公共草案中)陈述了"J.1未指明的行为":

未指定以下内容:...通过连续调用calloc,malloc和realloc函数(7.20.3)分配的存储的顺序和连续性.

所以看起来malloc不一定是确定性的.因此,假设它是不安全的.

  • 我不认为你错了,但引文严格说明存储的连续性,这与确定性无关.实现可以是确定性的,但在连续调用中不分配连续内存.还是我错了? (3认同)
  • 它讲述了连续性和秩序.所以我的阅读是规范指定了返回存储顺序没有必需的行为.因此,除其他外,它没有指明它必须是确定性的.因此,有效的实施可能是也可能不是确定性的. (3认同)

Ada*_*eld 7

这完全取决于malloc实施.没有固有的原因可以解释为什么特定的malloc实现会引入非确定性(除了可能作为应用程序模糊测试,但即使这样,它也应该默认禁用).例如,Doug Leamalloc不使用rand(3)或使用任何类似的方法.

但是,因为malloc使如调用内核sbrk(2)mmap(2)Linux或VirtualAllocWindows上,这些系统调用可能并不总是确定的,即使在其他方面相同的过程.内核可能会mmap出于某种原因决定故意在不同的进程中提供不同的'ed地址.

因此,对于通常在没有系统调用的情况下在用户空间中进行服务的小分配,很可能在a之后生成的指针将是相同的fork().由系统服务的大型分配可以是相同的.

但总的来说,不要依赖它.如果您确实需要在单独的进程中使用相同的指针,请在分叉之前创建它们,或者使用共享内存并适当地共享它们.