Как отключить рандомизацию адресного пространства для двоичного файла в Linux? - PullRequest
17 голосов
/ 21 сентября 2009

Я работаю над системой времени выполнения для параллельных программ, которая может использовать преимущества общей схемы адресного пространства для нескольких процессов, потенциально распределенных по нескольким (тысячам) узлам. Часто программное обеспечение, созданное для этой среды, запускается в системах Linux, в которых рандомизация адресного пространства включена по умолчанию, и пользователи могут не захотеть или не иметь возможности отключить его в масштабе всей системы (через sysctl -w kernel.randomize_va_space=0 и т. П.). Это накладывает некоторые ограничения на параллельные программы и может снизить производительность. Таким образом, мы хотим выяснить, как отключить его для создаваемых нами двоичных файлов. Безопасность не является проблемой, так как это программное обеспечение всегда работает в контролируемых средах.

Я нашел ссылки на различные флаги и переменные, такие как ET_EXEC, EF_AS_NO_RANDOM (очевидно, никогда не объединялись?) И PF_RANDOMIZE, но я не могу найти документ, описывающий, что я могу сделать, чтобы установить эти флаги. Идеальный ответ сказал бы мне, какой флаг компилятора / ассемблера / компоновщика отключит рандомизацию для полученного двоичного файла, и с какими версиями цепочки инструментов / ядра это работает. Следующим лучшим будет инструмент, который делает то же самое после сборки двоичного файла.

Поскольку я уверен, что кто-то предложит это, я уже знаю, что мы можем внести это изменение во время выполнения с помощью setarch -R, но предпочтительно записать это в исполняемый файл.

Похоже, paxctl -rx должен сделать свое дело, но, похоже, он не применяется к текущему методу, используемому в ядрах, которые не включают патчи PaX.

Ответы [ 3 ]

14 голосов
/ 22 сентября 2009

Предположительно, у вас есть какой-то демон, который вызывает ваши параллельные программы на узлах. Если это так, вы можете отключить ASLR этого общего родителя для любых дочерних процессов, которые он создает.

Посмотрите в источниках GDB (7.0 или CVS Head), как это сделать. Суть в том, чтобы позвонить personality(orig_personality|ADDR_NO_RANDOMIZE) после fork и до exec.

1 голос
/ 21 сентября 2009

По какой причине вы не можете сопоставить разделяемую память пространство или использовать именованное FIFO ?

0 голосов
/ 21 сентября 2009

По крайней мере, некоторые более ранние версии ASLR в ядре Linux сохранили смещения при разветвлении . Вместо того, чтобы отключить рандомизацию для своих процессов, не могли бы вы просто упорядочить их в иерархии родительских / дочерних процессов, которая оставляла одинаковые смещения между экземплярами двоичного файла, разветвленного одним и тем же родителем?

...