我试图通过修改 process.c 中的 arch_align_stack() 来增加第二个参数以求模 in:
if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
sp -= get_random_int() % 8192;
return sp & ~0xf;
但是我很快发现,过度篡改它会导致内核 panic ;而且我怀疑即使只是稍微篡改它也会使系统不稳定(它很可能会在一段时间内幸存下来?)。
这促使我问一个关于为什么会发生这种情况的问题(原始问题位于 Why does the stack have to be page aligned?)。显然这是因为(如用户“mpe”所述)默认堆栈大小为 8 kiB,即 8192 字节。那么通过扩展增加内核中的堆栈大小,这个参数(8192)应该可以增加吗?还提到堆栈本身的位置可以随机化。
Pax 会这样做吗?如果不是,那为什么不呢?
内核中如何/在哪里指定堆栈大小?这对于 32 位和 64 位有什么不同吗?
32 位和 64 位在这方面有什么区别吗? 64 位仍然使用 process.c 来处理这些东西吗?我看到在 process_64.c 中没有任何内容与此代码等效。
最佳答案
即使在 Vanilla 内核中,堆栈的位置也是随机的。请注意函数 load_elf_binary()
invokes randomize_stack_top()
随机化堆栈的位置。该函数是Linux堆栈ASLR的主要部分。
可以在 Linux 内核中找到对 ASLR 的很好描述 here .您可能最感兴趣的部分是堆栈随机化。
实际上,arch_align_stack()
的主要目的是通过超线程或类似技术提高 CPU 上的缓存性能。此外,选择值 8129 并不是因为堆栈大小(内核堆栈大小确实是 8K,但此函数是随机化用户堆栈地址),而是因为英特尔的建议。参见 this和 this .
THREAD_SIZE
指定内核堆栈大小,对于 x86-32 和 x86-64 都是 8K,如 here 所述.用户堆栈大小不固定,因为堆栈可能会增长,除非它受到用户限制。
arch/x86/kernel/process.c
包含 32 位和 64 位通用的代码。这就是为什么 arch/x86/kernel/process_64.c
(或 arch/x86/kernel/process_32.c
)中没有等效代码的原因。
关于c - Linux 上的 ASLR 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12734679/