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

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

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

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

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

3 ответа

Решение

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

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

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

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

Другие вопросы по тегам