[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 read/write. Worse, we even had pieces of code making use of this as a feature. Restrict the permissions for .text/rodata, as we have no legitimate need for writeability of these areas via the directmap alias. Note that the compile-time allocated pagetables do get written through their directmap alias, so need to remain writeable. 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> v2: * Update comments and commit message for clarity, and over changes. Notes: * The stubs are still have RX via one alias, RW via another, and these need to stay. We should harden this using PKS (available on SPR and later) to block incidental writes. * Backing memory for livepatch text/rodata needs similar treatment. * For backporting, this patch depends on c/s e7f147bf4ac7 ("x86/crash: Drop manual hooking of exception_table[]") and c/s e7db635f4428 ("x86/pv-shim: Don't modify the hypercall table"). No compile error will occur from getting these dependencies wrong. --- xen/arch/x86/setup.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 2b44a3ae26dd..b29229933d8c 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -1667,6 +1667,16 @@ 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. The compile-time allocated + * pagetables are written via their directmap alias, so data/bss needs to + * remain writeable. + */ + 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.30.2
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |