一尘不染

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

linux

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

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

因为我确定有人会建议这样做,所以我已经知道我们可以在运行时使用进行更改setarch -R,但最好将其记录在可执行文件中。

看起来paxctl -rx应该可以解决问题,但是它似乎不适用于不包含PaX补丁的内核中使用的当前方法。


阅读 370

收藏
2020-06-07

共1个答案

一尘不染

大概您有某种守护程序可以在节点上调用您的并行程序。如果是这样,则可以使此公共父级对其创建的任何子进程禁用ASLR。

在GDB来源(7.0或CVS
Head)中查找如何做到这一点。要旨是在personality(orig_personality|ADDR_NO_RANDOMIZE)之后fork和之前打电话exec

2020-06-07