mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:12:45 +00:00 
			
		
		
		
	Kernel: Randomize non-specific VM allocations done by sys$execve()
Stuff like TLS regions, main thread stacks, etc. All deserve to be randomized unless the ELF requires specific placement. :^)
This commit is contained in:
		
							parent
							
								
									10b2b71a2c
								
							
						
					
					
						commit
						9250ac0c24
					
				
					 1 changed files with 5 additions and 5 deletions
				
			
		|  | @ -295,7 +295,7 @@ static ErrorOr<LoadResult> load_elf_object(NonnullOwnPtr<Memory::AddressSpace> n | |||
|         } | ||||
| 
 | ||||
|         auto region_name = TRY(KString::formatted("{} (master-tls)", elf_name)); | ||||
|         master_tls_region = TRY(new_space->allocate_region(Memory::RandomizeVirtualAddress::No, {}, program_header.size_in_memory(), PAGE_SIZE, region_name->view(), PROT_READ | PROT_WRITE, AllocationStrategy::Reserve)); | ||||
|         master_tls_region = TRY(new_space->allocate_region(Memory::RandomizeVirtualAddress::Yes, {}, program_header.size_in_memory(), PAGE_SIZE, region_name->view(), PROT_READ | PROT_WRITE, AllocationStrategy::Reserve)); | ||||
|         master_tls_size = program_header.size_in_memory(); | ||||
|         master_tls_alignment = program_header.alignment(); | ||||
| 
 | ||||
|  | @ -323,7 +323,7 @@ static ErrorOr<LoadResult> load_elf_object(NonnullOwnPtr<Memory::AddressSpace> n | |||
|         size_t rounded_range_end = TRY(Memory::page_round_up(program_header.vaddr().offset(load_offset).offset(program_header.size_in_memory()).get())); | ||||
|         auto range_end = VirtualAddress { rounded_range_end }; | ||||
| 
 | ||||
|         auto region = TRY(new_space->allocate_region(Memory::RandomizeVirtualAddress::No, range_base, range_end.get() - range_base.get(), PAGE_SIZE, region_name->view(), prot, AllocationStrategy::Reserve)); | ||||
|         auto region = TRY(new_space->allocate_region(Memory::RandomizeVirtualAddress::Yes, range_base, range_end.get() - range_base.get(), PAGE_SIZE, region_name->view(), prot, AllocationStrategy::Reserve)); | ||||
| 
 | ||||
|         // It's not always the case with PIE executables (and very well shouldn't be) that the
 | ||||
|         // virtual address in the program header matches the one we end up giving the process.
 | ||||
|  | @ -358,7 +358,7 @@ static ErrorOr<LoadResult> load_elf_object(NonnullOwnPtr<Memory::AddressSpace> n | |||
|         auto range_base = VirtualAddress { Memory::page_round_down(program_header.vaddr().offset(load_offset).get()) }; | ||||
|         size_t rounded_range_end = TRY(Memory::page_round_up(program_header.vaddr().offset(load_offset).offset(program_header.size_in_memory()).get())); | ||||
|         auto range_end = VirtualAddress { rounded_range_end }; | ||||
|         auto region = TRY(new_space->allocate_region_with_vmobject(Memory::RandomizeVirtualAddress::No, range_base, range_end.get() - range_base.get(), program_header.alignment(), *vmobject, program_header.offset(), elf_name->view(), prot, true)); | ||||
|         auto region = TRY(new_space->allocate_region_with_vmobject(Memory::RandomizeVirtualAddress::Yes, range_base, range_end.get() - range_base.get(), program_header.alignment(), *vmobject, program_header.offset(), elf_name->view(), prot, true)); | ||||
| 
 | ||||
|         if (should_allow_syscalls == ShouldAllowSyscalls::Yes) | ||||
|             region->set_syscall_region(true); | ||||
|  | @ -392,7 +392,7 @@ static ErrorOr<LoadResult> load_elf_object(NonnullOwnPtr<Memory::AddressSpace> n | |||
|         return ENOEXEC; | ||||
|     } | ||||
| 
 | ||||
|     auto* stack_region = TRY(new_space->allocate_region(Memory::RandomizeVirtualAddress::No, {}, Thread::default_userspace_stack_size, PAGE_SIZE, "Stack (Main thread)", PROT_READ | PROT_WRITE, AllocationStrategy::Reserve)); | ||||
|     auto* stack_region = TRY(new_space->allocate_region(Memory::RandomizeVirtualAddress::Yes, {}, Thread::default_userspace_stack_size, PAGE_SIZE, "Stack (Main thread)", PROT_READ | PROT_WRITE, AllocationStrategy::Reserve)); | ||||
|     stack_region->set_stack(true); | ||||
| 
 | ||||
|     return LoadResult { | ||||
|  | @ -469,7 +469,7 @@ ErrorOr<void> Process::do_exec(NonnullRefPtr<OpenFileDescription> main_program_d | |||
|     bool has_interpreter = interpreter_description; | ||||
|     interpreter_description = nullptr; | ||||
| 
 | ||||
|     auto* signal_trampoline_region = TRY(load_result.space->allocate_region_with_vmobject(Memory::RandomizeVirtualAddress::No, {}, PAGE_SIZE, PAGE_SIZE, g_signal_trampoline_region->vmobject(), 0, "Signal trampoline", PROT_READ | PROT_EXEC, true)); | ||||
|     auto* signal_trampoline_region = TRY(load_result.space->allocate_region_with_vmobject(Memory::RandomizeVirtualAddress::Yes, {}, PAGE_SIZE, PAGE_SIZE, g_signal_trampoline_region->vmobject(), 0, "Signal trampoline", PROT_READ | PROT_EXEC, true)); | ||||
|     signal_trampoline_region->set_syscall_region(true); | ||||
| 
 | ||||
|     // (For dynamically linked executable) Allocate an FD for passing the main executable to the dynamic loader.
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling