web-dev-qa-db-ja.com

ASLRモード2の重要性

ASLRには3つのモードがあります。

  • -オフ
  • 1-スタック、ヒープ、共有ライブラリ、vDSO、mmapメモリ領域およびテキスト領域をランダム化します(-fPIE -pieでビルドした場合)
  • 2-さらにbrk()- allocatedメモリをランダム化します。これは、私の理解では、ほとんどの場合、小さなmalloc()- callsからのものです。

特にbrk()に割り当てられたメモリに特別なモードがあるのはなぜですか(これが本当にすべての場合)、それがどれほど重要であるか、またはモード1ではなくASLRのモード2を使用することがいつ重要か?

10
Mr_Mango

brk()を直接使用せずにbrk()に依存しないglibcのデフォルト(ptmalloc)以外のヒープ実装があるため、brk()は、va_randomize_space = 1のみが使用されている場合、予測可能なアドレス空間に保護されません。

攻撃者が直接SYS_brkシステムコールを使用してシェルコードを作成し、メモリを予想されるアドレス空間にマッピングして作業する可能性があるため、これも重要です。

Linuxカーネルソースコードをざっと見てみると、ASLRをモード2に設定すると、動的メモリマッピングアドレス空間の開始がランダム化されるだけです。

https://github.com/torvalds/linux/blob/master/fs/binfmt_elf.c#L1110-L112

<!-- language: lang-c -->

    if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
        /*
         * For architectures with ELF randomization, when executing
         * a loader directly (i.e. no interpreter listed in ELF
         * headers), move the brk area out of the mmap region
         * (since it grows up, and may collide early with the stack
         * growing down), and into the unused ELF_ET_DYN_BASE region.
         */
        if (IS_ENABLED(CONFIG_Arch_HAS_ELF_RANDOMIZE) &&
            elf_ex->e_type == ET_DYN && !interpreter) {
            mm->brk = mm->start_brk = ELF_ET_DYN_BASE;
        }

        mm->brk = mm->start_brk = Arch_randomize_brk(mm);
#ifdef compat_brk_randomized
        current->brk_randomized = 1;
#endif
    }

https://github.com/torvalds/linux/blob/master/mm/mmap.c#L212-L21

<!-- language: lang-c -->

    if (current->brk_randomized)
        min_brk = mm->start_brk;
1
Rilke Petrosky