我试着在我自己的x86 32位机器上“改进”ASLR,方法是修改process.c中的arch_align_stack(),方法是将第二个参数增加到modulo:
if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
sp -= get_random_int() % 8192;
return sp & ~0xf;
然而,我很快发现过于篡改这会导致内核恐慌;而且我怀疑它会让系统变得不稳定,即使只是篡改了它(它很可能在一段时间内幸免于难,最有可能吗?)。
这促使我问一个关于为什么会发生这种情况的问题(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中没有任何东西看起来与这段代码相同。
答案 0 :(得分:3)
即使在vanilla内核中,堆栈的位置也是随机的。请注意函数load_elf_binary()
invokes randomize_stack_top()
随机化堆栈的位置。该函数是Linux堆栈ASLR的主要部分。
可以找到Linux内核中ASLR的良好描述here。您可能会对堆栈随机化部分感兴趣。
实际上arch_align_stack()
的主要目的是通过HyperThreading或类似技术提高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
)中没有等效代码的原因。