2009-09-21 3 views
16

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

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

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

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

ответ

14

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

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

+0

Я буду исследовать и попробовать это сейчас. – Novelocrat

+0

Кажется, что сработало. Благодаря! – Novelocrat

1

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

+1

Существует. Мы работаем на нескольких узлах. – Novelocrat

0

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

+1

Нет, мы не можем, потому что эти процессы работают на нескольких узлах. Миграция потоков намного проще, когда нам не нужно переходить через обручи, чтобы вручную синхронизировать адресное пространство. – Novelocrat