Skip to contentSkip to conversation

mm,ima,kexec: use memblock_free_late from ima_free_kexec_buffer

PATCH In review Rik van Riel 2 participants 4 messages Jul 20, 2023 – Jul 24, 2023

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mm,ima,kexec: use memblock_free_late from ima_free_kexec_buffer

The code calling ima_free_kexec_buffer runs long after the memblock allocator has already been torn down, potentially resulting in a use after free in memblock_isolate_range.

With KASAN or KFENCE, this use after free will result in a BUG from the idle task, and a subsequent kernel panic.

Switch ima_free_kexec_buffer over to memblock_free_late to avoid that issue.

Fixes fee3ff99bc67 ("powerpc: Move arch independent ima kexec functions to drivers/of/kexec.c")
---
 arch/x86/kernel/setup.c | 8 ++------
 drivers/of/kexec.c      | 3 ++-
 2 files changed, 4 insertions(+), 7 deletions(-)
arch/x86/kernel/setup.c +2 -6
index fd975a4a5200..aa0df37c1fe7 100644
@@ -359,15 +359,11 @@ static void __init add_early_ima_buffer(u64 phys_addr)
 #if defined(CONFIG_HAVE_IMA_KEXEC) && !defined(CONFIG_OF_FLATTREE)
 int __init ima_free_kexec_buffer(void)
 {
-	int rc;
-
 	if (!ima_kexec_buffer_size)
 		return -ENOENT;
 
-	rc = memblock_phys_free(ima_kexec_buffer_phys,
-				ima_kexec_buffer_size);
-	if (rc)
-		return rc;
+	memblock_free_late(ima_kexec_buffer_phys,
+			   ima_kexec_buffer_size);
 
 	ima_kexec_buffer_phys = 0;
 	ima_kexec_buffer_size = 0;
drivers/of/kexec.c +2 -1
index f26d2ba8a371..68278340cecf 100644
@@ -184,7 +184,8 @@ int __init ima_free_kexec_buffer(void)
 	if (ret)
 		return ret;
 
-	return memblock_phys_free(addr, size);
+	memblock_free_late(addr, size);
+	return 0;
 }
 #endif
 
Signature · 1 line
2.41.0
maintainer Acked-by on v1 1/1
#1 lore raw
Quoted 11 lines · Rik van Riel

The code calling ima_free_kexec_buffer runs long after the memblock allocator has already been torn down, potentially resulting in a use after free in memblock_isolate_range.

With KASAN or KFENCE, this use after free will result in a BUG from the idle task, and a subsequent kernel panic.

Switch ima_free_kexec_buffer over to memblock_free_late to avoid that issue.

Fixes fee3ff99bc67 ("powerpc: Move arch independent ima kexec functions to drivers/of/kexec.c")
Fixes b69a2afd5afc ("x86/kexec: Carry forward IMA measurement log on kexec")

(I'm assuming someone else is taking this)

Quoted 47 lines
---
 arch/x86/kernel/setup.c | 8 ++------
 drivers/of/kexec.c      | 3 ++-
 2 files changed, 4 insertions(+), 7 deletions(-)
arch/x86/kernel/setup.c +2 -6
index fd975a4a5200..aa0df37c1fe7 100644
@@ -359,15 +359,11 @@ static void __init add_early_ima_buffer(u64 phys_addr)
 #if defined(CONFIG_HAVE_IMA_KEXEC) && !defined(CONFIG_OF_FLATTREE)
 int __init ima_free_kexec_buffer(void)
 {
-	int rc;
-
 	if (!ima_kexec_buffer_size)
 		return -ENOENT;
 
-	rc = memblock_phys_free(ima_kexec_buffer_phys,
-				ima_kexec_buffer_size);
-	if (rc)
-		return rc;
+	memblock_free_late(ima_kexec_buffer_phys,
+			   ima_kexec_buffer_size);
 
 	ima_kexec_buffer_phys = 0;
 	ima_kexec_buffer_size = 0;
drivers/of/kexec.c +2 -1
index f26d2ba8a371..68278340cecf 100644
@@ -184,7 +184,8 @@ int __init ima_free_kexec_buffer(void)
 	if (ret)
 		return ret;
 
-	return memblock_phys_free(addr, size);
+	memblock_free_late(addr, size);
+	return 0;
 }
 #endif
 
Signature · 1 line
2.41.0
#2 lore raw
Quoted 9 lines · Rob Herring
Quoted 8 lines · Rik van Riel

The code calling ima_free_kexec_buffer runs long after the memblock allocator has already been torn down, potentially resulting in a use
after free in memblock_isolate_range.

With KASAN or KFENCE, this use after free will result in a BUG from the idle task, and a subsequent kernel panic.

Quoted 9 lines
Quoted 5 lines

Switch ima_free_kexec_buffer over to memblock_free_late to avoid that issue.

Fixes fee3ff99bc67 ("powerpc: Move arch independent ima kexec

functions to drivers/of/kexec.c")

Fixes b69a2afd5afc ("x86/kexec: Carry forward IMA measurement log on

kexec")

Thank you for digging further back in the history of that code.

Quoted 3 lines

(I'm assuming someone else is taking this)

I hope so, but I don't know who...

Signature · 1 line
All Rights Reversed.
maintainer
#3 lore raw
Quoted 19 lines · Rik van Riel
Quoted 9 lines · Rob Herring
Quoted 8 lines · Rik van Riel

The code calling ima_free_kexec_buffer runs long after the memblock allocator has already been torn down, potentially resulting in a use
after free in memblock_isolate_range.

With KASAN or KFENCE, this use after free will result in a BUG from the idle task, and a subsequent kernel panic.

Quoted 9 lines
Quoted 5 lines

Switch ima_free_kexec_buffer over to memblock_free_late to avoid that issue.

Fixes fee3ff99bc67 ("powerpc: Move arch independent ima kexec

functions to drivers/of/kexec.c")

Fixes b69a2afd5afc ("x86/kexec: Carry forward IMA measurement log on

kexec")

Quoted 7 lines

Thank you for digging further back in the history of that code.

Quoted 3 lines

(I'm assuming someone else is taking this)

I hope so, but I don't know who...

You could split this into 2 patches, then there's no doubt. And each Fixes is clear.

Rob