Messages in this thread Patch in this message | | | From | david.keisarschm@mail ... | Subject | [PATCH v3 3/3] Replace invocation of weak PRNG in arch/x86/mm/kaslr.c | Date | Sun, 18 Dec 2022 20:19:00 +0200 |
| |
From: David Keisar Schmidt <david.keisarschm@mail.huji.ac.il>
This third series add some changes to the commit messages, and also replaces get_random_u32 with get_random_u32_below, in a case a modulo operation is done on the result.
The memory randomization of the virtual address space of kernel memory regions (physical memory mapping, vmalloc & vmemmap) inside arch/x86/mm/kaslr.c is based on the function prandom_bytes_state which uses the prandom_u32 PRNG.
However, this PRNG turned out to be weak, as noted in commit c51f8f88d705 To fix it, we have changed the invocation of prandom_bytes_state to get_random_bytes.
Unlike get_random_bytes which maintains its own state, prandom_bytes state needs to be seeded, thus, we have omitted the call to the seeding function, since it is not needed anymore.
# Changes since v2
* edited commit message.
Signed-off-by: David Keisar Schmidt <david.keisarschm@mail.huji.ac.il> --- arch/x86/mm/kaslr.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c index 557f0fe25..9ef8993d5 100644 --- a/arch/x86/mm/kaslr.c +++ b/arch/x86/mm/kaslr.c @@ -66,7 +66,6 @@ void __init kernel_randomize_memory(void) size_t i; unsigned long vaddr_start, vaddr; unsigned long rand, memory_tb; - struct rnd_state rand_state; unsigned long remain_entropy; unsigned long vmemmap_size; @@ -113,8 +112,6 @@ void __init kernel_randomize_memory(void) for (i = 0; i < ARRAY_SIZE(kaslr_regions); i++) remain_entropy -= get_padding(&kaslr_regions[i]); - prandom_seed_state(&rand_state, kaslr_get_random_long("Memory")); - for (i = 0; i < ARRAY_SIZE(kaslr_regions); i++) { unsigned long entropy; @@ -123,7 +120,7 @@ void __init kernel_randomize_memory(void) * available. */ entropy = remain_entropy / (ARRAY_SIZE(kaslr_regions) - i); - prandom_bytes_state(&rand_state, &rand, sizeof(rand)); + get_random_bytes(&rand, sizeof(rand)); entropy = (rand % (entropy + 1)) & PUD_MASK; vaddr += entropy; *kaslr_regions[i].base = vaddr; -- 2.38.0
| |