3

我试图通过在 process.c 中修改 arch_align_stack() 来“改进”我自己的 x86 32 位机器上的 ASLR,方法是将第二个参数增加到模:

if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
    sp -= get_random_int() % 8192;
return sp & ~0xf;

但是我很快发现,过多地篡改它会导致内核恐慌。而且我怀疑它会使系统变得不稳定,即使只是对其进行了一些篡改(它很可能靠运气存活了一段时间?)。

这促使我问了一个关于为什么会发生这种情况的问题(原始问题为什么堆栈必须是页面对齐的?)。显然这是因为(如用户“mpe”所述)默认堆栈大小为 8 kiB,即 8192 字节。那么通过扩展增加内核中的堆栈大小,这个参数(8192)应该可以增加吗?还提到堆栈本身的位置可以是随机的。

帕克斯会这样做吗?如果不是,那为什么不呢?

内核中如何/在哪里指定堆栈大小?这对于 32 位和 64 位有什么不同吗?

32位和64位之间有什么区别吗?64 位仍然使用 process.c 来处理这些东西吗?我看到在 process_64.c 中似乎没有与此代码等效的内容。

4

1 回答 1

3

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

可以在此处找到对 Linux 内核中 ASLR 的良好描述。您可能主要对Stack Randomization部分感兴趣。

其实主要目的arch_align_stack()是通过超线程或类似技术提高 CPU 上的缓存性能。此外,没有选择值 8129 是因为堆栈大小(内核堆栈大小确实是 8K,但这个函数是随机化用户堆栈地址)而是因为 Intel 的建议。看到这个这个

THREAD_SIZE指定内核堆栈大小,x86-32 和 x86-64 都是 8K,如此处所述。用户堆栈大小不是固定的,因为堆栈可能会增长,除非它受到用户的限制。

arch/x86/kernel/process.c包含 32 位和 64 位通用的代码。arch/x86/kernel/process_64.c这就是为什么(或arch/x86/kernel/process_32.c)中没有等效代码的原因。

于 2012-10-07T17:35:39.373 回答