【问题标题】:Is mmap deterministic if ASLR is disabled?如果禁用 ASLR,mmap 是否具有确定性?
【发布时间】:2012-01-14 19:47:40
【问题描述】:

如果地址空间布局随机化 (ASLR) 被禁用,我们会有确定性 mmap 吗?通过确定性,我的意思是如果我用相同的输入一次又一次地运行相同的应用程序,我会得到 mmap 返回的相同地址吗?我最感兴趣的是匿名 mmap。

【问题讨论】:

  • 您是否要求独立于mmap 的第一个参数,即请求的地址?
  • 我在问匿名 mmap。
  • 您可以为任何类型的映射请求特定地址。
  • 本,我不是在谈论 MAP_FIXED,而是在没有它的情况下调用 mmap。

标签: c linux gcc x86-64 mmap


【解决方案1】:

如果地址空间布局随机化 (ASLR) 被禁用,我们会有确定性 mmap 吗?

如果您的应用程序在第 i 个 mmap 时刻具有完全相同的内存布局(根据虚拟地址空间的哪些页面已映射,哪些未映射);那么 mmap 在 Linux 内核中应该是确定性的。

有一些奇怪的情况可能会改变内存布局。例如,额外的命令行参数可以将堆栈移动到较低的地址。有很多文件,在 c 运行时(例如语言环境)中映射,如果某些文件的大小从上次开始时发生了变化,那么内存布局也会发生变化。甚至堆栈消耗也可能会影响它。

如果您通过 malloc 分配的应用程序内存分配(大小和分配顺序)发生了变化,则 mmap 将不是确定性的。所以,如果你的应用程序是线程的;它应该修复 malloc 调用的顺序或将所有 malloc 限制在主线程中。

mm/mmap.c: arch_get_unmapped_area - 默认非固定 mmap 地址解析器是确定性的

【讨论】:

  • 请注意,不仅命令行参数,环境也可以下移堆栈。
  • 另外,AUXV 向量可以改变;动态链接器和任何共享库构造函数。
【解决方案2】:

根据我的经验,它是可重现的。当我在gdb 下运行多次(使用相同的输入和条件)的确定性程序(由我编写)(禁用 ASLR)时,指针是相同的。

但是,确定性程序是一种静态不可检测的属性(我只是碰巧知道我正在编写的某些程序具有足够的确定性)。

【讨论】:

  • 请注意,“确定性程序”意味着没有线程。一旦线程进入,所有的赌注都关闭了。另请注意,某些 libc 工具(例如 aio)会在“背后”创建线程。
  • 如果您以严格排序所有分配(包括线程堆栈的分配)的方式使用同步原语,它仍然可以确定线程。
【解决方案3】:

内核可能会多次重新映射同一个虚拟内存地址。但是,我不会依赖内核每次都给你相同的地址,因为它不是必需的。如果您需要一个固定地址并且需要内核将其放置在虚拟内存中的特定位置,请使用MAP_FIXED

【讨论】:

  • MAP_FIXED 使用起来很危险,除非目标地址范围已经存在于进程的地址空间中并且您知道要替换的内容。否则,您可能会破坏属于您不知道的程序其他部分的内存!
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 2017-01-04
  • 2011-03-04
  • 2011-09-12
  • 2019-03-23
  • 2012-02-08
  • 2013-02-20
  • 2015-02-27
相关资源
最近更新 更多