同じプログラムを実行するたびに仮想メモリ領域が異なるのはなぜですか?

同じプログラムを実行するたびに仮想メモリ領域が異なるのはなぜですか?

私はLinuxでメモリ領域の仮想メモリマッピング作業をしています。実行ファイルは単純な計算プログラムです。プログラムの2つのインスタンスが実行されると、以下に示すマッピングが表示されます/proc/pid/maps。ヒープ、スタック、vvars、vdsoなどの場所は、ロード時にランダムにオフセットされているように見えます。なぜこのようなことをするのですか?

例1:ヒープは次から始まります。013f4000

00400000-00401000 r--p 00000000 08:16 3557412                            <program-exe>
00401000-00480000 r-xp 00001000 08:16 3557412                            <program-exe>
00480000-004a5000 r--p 00080000 08:16 3557412                            <program-exe>
004a6000-004ac000 rw-p 000a5000 08:16 3557412                            <program-exe>
004ac000-004ad000 rw-p 00000000 00:00 0 
013f4000-01417000 rw-p 00000000 00:00 0                                  [heap]
7ffd98bd8000-7ffd98bf9000 rw-p 00000000 00:00 0                          [stack]
7ffd98bfc000-7ffd98bff000 r--p 00000000 00:00 0                          [vvar]
7ffd98bff000-7ffd98c00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]

例2:ヒープは次から始まります。013cc000

00400000-00401000 r--p 00000000 08:16 3557412                            <program-exe>
00401000-00480000 r-xp 00001000 08:16 3557412                            <program-exe>
00480000-004a5000 r--p 00080000 08:16 3557412                            <program-exe>
004a6000-004ac000 rw-p 000a5000 08:16 3557412                            <program-exe>
004ac000-004ad000 rw-p 00000000 00:00 0 
013cc000-013ef000 rw-p 00000000 00:00 0                                  [heap]
7ffe3717d000-7ffe3719e000 rw-p 00000000 00:00 0                          [stack]
7ffe371fa000-7ffe371fd000 r--p 00000000 00:00 0                          [vvar]
7ffe371fd000-7ffe371fe000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]

答え1

これは、ASLR(Address Space Layout Randomization)というセキュリティ機能の結果です。 ASLRが有効になると、カーネルは重要なプロセスセグメントを任意のアドレスにロードします。すべての最新のLinuxカーネルはデフォルトでASLRを有効にします。 ASLRはを介して制御できます/proc/sys/kernel/randomize_va_space。 ~から手順マニュアルページ:

/proc/sys/kernel/randomize_va_space(Linux 2.6.12以降)システムのASLR(Address Space Layout Randomization)ポリシーを選択します(ASLRをサポートするアーキテクチャで)。このファイルは3つの値をサポートします。

          0  Turn ASLR off.  This is the default for architectures that
             don't support ASLR, and when the kernel is booted with the
             norandmaps parameter.

          1  Make the addresses of mmap(2) allocations, the stack, and
             the VDSO page randomized.  Among other things, this means
             that shared libraries will be loaded at randomized
             addresses.  The text segment of PIE-linked binaries will
             also be loaded at a randomized address.  This value is the
             default if the kernel was configured with CONFIG_COM‐
             PAT_BRK.

          2  (Since Linux 2.6.25) Also support heap randomization.  This
             value is the default if the kernel was not configured with
             CONFIG_COMPAT_BRK.

したがって、ASLR を一時的にディセーブルにするには、root として次のコマンドを実行します。

echo 0 > /proc/sys/kernel/randomize_va_space

テストを再実行すると、両方のプロセスが同じアドレスマッピングを持つことを確認できます。

関連情報