ASLR对Linux的限制

时间:2012-10-04 19:42:40

标签: c linux linux-kernel aslr

我试着在我自己的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中没有任何东西看起来与这段代码相同。

1 个答案:

答案 0 :(得分:3)

即使在vanilla内核中,堆栈的位置也是随机的。请注意函数load_elf_binary() invokes randomize_stack_top()随机化堆栈的位置。该函数是Linux堆栈ASLR的主要部分。

可以找到Linux内核中ASLR的良好描述here。您可能会对堆栈随机化部分感兴趣。

实际上arch_align_stack()的主要目的是通过HyperThreading或类似技术提高CPU的缓存性能。此外,由于堆栈大小未选择值8129(内核堆栈大小确实为8K,但此函数使用户堆栈地址随机化),但由于英特尔建议。请参阅thisthis

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)中没有等效代码的原因。