如何在Linux上禁用二进制文件的地址空间随机化?

时间:2009-09-21 18:02:25

标签: linux gcc aslr heap-randomization

我正在研究并行程序的运行时系统,它可以利用跨多个进程的公共地址空间布局,可能分布在几千个节点上。很多时候,为此环境构建的软件在默认情况下启用了地址空间随机化的Linux系统上运行,用户可能不希望或无法在系统范围内禁用它(通过sysctl -w kernel.randomize_va_space=0等)。这对并行程序施加了一些限制,并且可能损害性能。因此,我们想弄清楚如何为我们构建的二进制文件禁用它。安全性不是问题,因为该软件始终在受控环境中运行。

我找到了对各种标志和变量的引用,比如ET_EXECEF_AS_NO_RANDOM(显然从未合并?)和PF_RANDOMIZE,但我找不到任何描述内容的文档我可以设置这些标志。一个理想的答案会告诉我什么编译器/汇编器/链接器标志将禁用生成的二进制文件的随机化,以及它工作的工具链/内核的版本。接下来最好的是在构建二进制文件后执行相同操作的工具。

由于我确信有人会建议,我已经知道我们可以在运行时使用setarch -R进行此更改,但最好将其记录在可执行文件中。

看起来paxctl -rx应该这样做,但它似乎不适用于不包含PaX补丁的内核中使用的当前方法。

3 个答案:

答案 0 :(得分:14)

据推测,你有某种守护进程在节点上调用你的并行程序。如果是这样,您可以使此公共父禁用ASLR用于它创建的任何子进程。

查看GDB源代码(7.0或CVS Head)以了解如何执行此操作。其要点是在personality(orig_personality|ADDR_NO_RANDOMIZE)之后和fork之前致电exec

答案 1 :(得分:1)

是否有某些原因导致您无法映射shared memory空格或使用已命名的FIFO

答案 2 :(得分:0)

Linux内核preserved offsets when forking中至少有一些早期版本的ASLR。您是否可以简单地将它们安排在父/子进程层次结构下,而不是为您的进程禁用随机化,这可以保持同一父代分叉的二进制实例之间的偏移量相同?