【问题标题】:ASLR limitations on LinuxLinux 上的 ASLR 限制
【发布时间】:2012-09-25 22:14:31
【问题描述】:

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

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 中似乎没有与此代码等效的内容。

【问题讨论】:

  • 我设法忽略了这一点,对此感到抱歉。我已经完成了我之前的四个问题并进行了更正。谢谢。
  • 现在好多了,我会碰你,因为你花时间:)

标签: c linux linux-kernel aslr


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2013-04-13
    • 1970-01-01
    • 2013-05-30
    • 2021-04-01
    相关资源
    最近更新 更多