Подтвердить что ты не робот

Как отключить рандомизацию адресного пространства для двоичного кода в Linux?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Есть ли какая-то причина, по которой вы не можете сопоставить пространство shared memory или использовать имя FIFO?

Ответ 3

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