c - Linux 上的 ASLR 限制

标签 c linux linux-kernel aslr

我试图通过修改 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,但此函数是随机化用户堆栈地址),而是因为英特尔的建议。参见 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)中没有等效代码的原因。

关于c - Linux 上的 ASLR 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12734679/

相关文章:

c - 错误 : passing argument 1 of ‘kthread_create_on_node’ from incompatible pointer type

android - 获取Android Linux内核的内核命令行参数

c - 包含结构的自由链表包含结构

C编程读取输入错误检查

使用 fork() 进行 C 系统编程

linux - 如何选择文件中多次出现的相同行序列?

c - 在各自的行上打印偶数/奇数

通过将数字替换为数字,将句子转换为数字。例如使用 strcmp 将 ABCD 转换为 2223

linux - 如何在 unix 中将第一列移动到最后一列?

linux - 如何设置内核线程的亲和性?