[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/boot: Restrict directmap permissions for .text/.rodata
While we've been diligent to ensure that the main text/data/rodata mappings have suitable restrictions, their aliases via the directmap were left fully RW. Worse, we even had pieces of code making use of this as a feature. Restrict the permissions, as we have no legitimate need for writeability of these areas via the directmap alias. Note that the pagetables and cpu0_stack do get written through their directmap alias, so we can't just read-only the whole image. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Wei Liu <wl@xxxxxxx> Ever so slightly RFC, as it has only had light testing. Notes: * The stubs are still have RX via one alias, RW via another, and these need to stay. Hardening options include splitting the stubs so the SYSCALL ones can be read-only after setup, and/or expanding the stub size to 4k per CPU so we really can keep the writeable alias as not present when the stub isn't in active use. * Future CPUs with Protection Key Supervisor (Sapphire Rapids and later) would be able to inhibit writeability outside of a permitted region, and because the protection key is per logical thread, we woulnd't need to expand the stubs to 4k per CPU. * At the time of writing, PV Shim still makes use of .rodata's read/write alias in the directmap to patch the hypercall table, but that runs earlier on boot. Also, there are patches out to address this. * For backporting, this patch depends on c/s e7f147bf4ac7 ("x86/crash: Drop manual hooking of exception_table[]"), and nothing would break at compile time if the dependency was missing. --- xen/arch/x86/setup.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index f40a9fe5d351..c8641c227d9a 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -1566,6 +1566,14 @@ void __init noreturn __start_xen(unsigned long mbi_p) destroy_xen_mappings((unsigned long)&__2M_rwdata_end, ROUNDUP((unsigned long)&__2M_rwdata_end, MB(2))); + /* + * Mark all of .text and .rodata as RO in the directmap - we don't want + * these sections writeable via any alias. + */ + modify_xen_mappings((unsigned long)__va(__pa(_start)), + (unsigned long)__va(__pa(__2M_rodata_end)), + PAGE_HYPERVISOR_RO); + nr_pages = 0; for ( i = 0; i < e820.nr_map; i++ ) if ( e820.map[i].type == E820_RAM ) -- 2.11.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |