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建议.参见this和this.
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