From c200997c9ae2a1fc9585fcf6953bc1c9fa4c66db Mon Sep 17 00:00:00 2001 From: Marsman1996 Date: Wed, 13 Nov 2024 21:34:34 +0800 Subject: [PATCH] Avoid init stack top at `MAX_USERSPACE_VADDR` --- kernel/src/process/process_vm/init_stack/mod.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/kernel/src/process/process_vm/init_stack/mod.rs b/kernel/src/process/process_vm/init_stack/mod.rs index 383730441..99fe1cfae 100644 --- a/kernel/src/process/process_vm/init_stack/mod.rs +++ b/kernel/src/process/process_vm/init_stack/mod.rs @@ -121,9 +121,17 @@ impl Clone for InitStack { impl InitStack { pub(super) fn new() -> Self { let nr_pages_padding = { - let mut random_nr_pages_padding: u8 = 0; - getrandom(random_nr_pages_padding.as_bytes_mut()).unwrap(); - random_nr_pages_padding as usize + // We do not want the stack top too close to MAX_USERSPACE_VADDR. + // So we add this fixed padding. Any small value greater than zero will do. + const NR_FIXED_PADDING_PAGES: usize = 7; + + // Some random padding pages are added as a simple measure to + // make the stack values of a buggy user program harder + // to be exploited by attackers. + let mut nr_random_padding_pages: u8 = 0; + getrandom(nr_random_padding_pages.as_bytes_mut()).unwrap(); + + nr_random_padding_pages as usize + NR_FIXED_PADDING_PAGES }; let initial_top = MAX_USERSPACE_VADDR - PAGE_SIZE * nr_pages_padding; let max_size = INIT_STACK_SIZE;