|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/3] x86/boot: Fix microcode module handling during PVH boot
On 23/10/2024 6:01 pm, Roger Pau Monné wrote:
> On Wed, Oct 23, 2024 at 11:57:55AM +0100, Andrew Cooper wrote:
>> From: "Daniel P. Smith" <dpsmith@xxxxxxxxxxxxxxxxxxxx>
>>
>> As detailed in commit 0fe607b2a144 ("x86/boot: Fix PVH boot during boot_info
>> transition period"), the use of __va(mbi->mods_addr) constitutes a
>> use-after-free on the PVH boot path.
>>
>> This pattern has been in use since before PVH support was added. Inside a
>> PVH
>> VM, it will go unnoticed as long as the microcode container parser doesn't
>> choke on the random data it finds.
>>
>> The use within early_microcode_init() happens to be safe because it's prior
>> to
>> move_xen(). microcode_init_cache() is after move_xen(), and therefore
>> unsafe.
>>
>> Plumb the boot_info pointer down, replacing module_map and mbi. Importantly,
>> bi->mods[].mod is a safe way to access the module list during PVH boot.
>>
>> Note: microcode_scan_module() is still bogusly stashing a bootstrap_map()'d
>> pointer in ucode_blob.data, which constitutes a different
>> use-after-free, and only works in general because of a second bug.
>> This
>> is unrelated to PVH, and needs untangling differently.
>>
>> Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
>> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>> ---
>> CC: Jan Beulich <JBeulich@xxxxxxxx>
>> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
>> CC: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
>>
>> Refectored/extracted from the hyperlaunch series.
>>
>> There's no good Fixes tag for this, because it can't reasonably be "introduce
>> PVH", nor can the fix as-is reasonably be backported. If we want to fix the
>> bug in older trees, we need to plumb the mod pointer down alongside mbi.
>> ---
>> xen/arch/x86/cpu/microcode/core.c | 40 +++++++++++-----------------
>> xen/arch/x86/include/asm/microcode.h | 8 +++---
>> xen/arch/x86/setup.c | 4 +--
>> 3 files changed, 22 insertions(+), 30 deletions(-)
>>
>> diff --git a/xen/arch/x86/cpu/microcode/core.c
>> b/xen/arch/x86/cpu/microcode/core.c
>> index 8564e4d2c94c..1d58cb0f3bc1 100644
>> --- a/xen/arch/x86/cpu/microcode/core.c
>> +++ b/xen/arch/x86/cpu/microcode/core.c
>> @@ -35,6 +35,7 @@
>> #include <xen/watchdog.h>
>>
>> #include <asm/apic.h>
>> +#include <asm/bootinfo.h>
>> #include <asm/cpu-policy.h>
>> #include <asm/nmi.h>
>> #include <asm/processor.h>
>> @@ -152,11 +153,8 @@ static int __init cf_check parse_ucode(const char *s)
>> }
>> custom_param("ucode", parse_ucode);
>>
>> -static void __init microcode_scan_module(
>> - unsigned long *module_map,
>> - const multiboot_info_t *mbi)
>> +static void __init microcode_scan_module(struct boot_info *bi)
> Sorry to be pedantic, can't you keep bi as const?
Not really, no.
Yes technically in this patch, but no by the end of the hyperlaunch series.
I'm uninterested in taking extra churn just to have a pointer be const
for a few more patches.
[For the list, I conferred with Roger IRL and he was happy.]
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |