系统相关
首页 > 系统相关> > c-Linux上的ASLR限制

c-Linux上的ASLR限制

作者:互联网

我尝试通过在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;

但是我很快发现,对此进行过多篡改会导致内核崩溃.而且我怀疑它即使只是对其进行某种程度的改动也会使系统不稳定(它很可能幸存了一段时间,很可能会这样吗?).

这促使我问一个问题,为什么会发生(原始问题为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中似乎没有什么等效于此代码.

解决方法:

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

可以在here中找到有关ASLR在Linux内核中的很好描述.您可能会对堆栈随机化这一部分感兴趣.

实际上,arch_align_stack()的主要目的是通过超线程技术或类似技术来提高CPU上的缓存性能.此外,由于栈大小(内核栈大小的确为8K,但此函数将用户栈地址随机化)而未选择值8129,而是因为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)中没有等效代码的原因.

标签:aslr,linux-kernel,c-3,linux
来源: https://codeday.me/bug/20191127/2075091.html