2009-09-21 11 views
16

私は複数のプロセスにわたって共通のアドレススペースレイアウトを利用できる並列プログラムのためにランタイムシステムを開発しています。数千ノードにまたがる可能性があります。多くの場合、この環境向けに構築されたソフトウェアは、アドレス空間のランダム化がデフォルトで有効になっているLinuxシステム上で実行され、ユーザはシステム全体で無効にしたり無効にしたりすることはできません(sysctl -w kernel.randomize_va_space=0など)。これは、並列プログラムにいくつかの制限を課し、パフォーマンスを低下させる可能性があります。したがって、私たちが構築するバイナリのためにそれを無効にする方法を理解したいと思います。このソフトウェアは常に管理された環境で動作しているため、セキュリティは問題ではありません。Linuxでバイナリのアドレス空間のランダム化を無効にするにはどうすればよいですか?

私はET_EXECEF_AS_NO_RANDOM(明らかに合併したことがない?)とPF_RANDOMIZEのように、様々なフラグや変数への参照を見つけたが、私はこれらのフラグを設定するために何ができるかを説明し、任意のドキュメントを見つけることができません。理想的な答えは、コンパイラ/アセンブラ/リンカのフラグがバイナリのランダム化を無効にするか、これが動作するツールチェーン/カーネルのバージョンを教えてくれます。次善策は、バイナリをビルドした後も同じことをするツールです。

誰かがそれを提案してくれると確信しているので、実行時にsetarch -Rでこの変更を行うことができますが、これを実行可能ファイルに記録することをお勧めします。

paxctl -rxのように見えますが、PaXパッチが含まれていないカーネルで使用されている現在の方法には当てはまらないようです。

答えて

14

おそらくあなたはノード上であなたの並列プログラムを起動する何らかの種類のデーモンを持っています。その場合、この共通の親プロセスは、作成する子プロセスに対してASLRを無効にすることができます。

GDBソース(7.0またはCVS Head)でその方法を調べてください。その要点は、forkの後、execの前にpersonality(orig_personality|ADDR_NO_RANDOMIZE)に電話することです。

+0

私はこれを調査し、今試してみます。 – Novelocrat

+0

働いたようです。ありがとう! – Novelocrat

1

shared memoryのスペースをマップできないか、名前がFIFOの場合は何らかの理由がありますか?

+1

あります。私たちは複数のノードにまたがって走っています。 – Novelocrat

0

少なくともLinuxカーネルのASLRの一部のバージョンpreserved offsets when forking。プロセスのランダム化を無効にするのではなく、同じ親プロセスがバイナリのインスタンス間でオフセットを同じに保つ親/子プロセス階層の下にそれらを配置することができますか?

+1

これらのプロセスは複数のノードで実行されているため、できません。スレッドの移行は、アドレス空間を手動で同期させるためにフープを飛び越える必要がないときはずっと簡単です。 – Novelocrat

関連する問題