[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/boot: Restrict directmap permissions for .text/.rodata
On 06/12/2021 13:58, Jan Beulich wrote: > On 06.12.2021 14:08, Andrew Cooper wrote: >> 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. > Where do we end up reading .text and/or .rodata through the directmap? Can't > we zap the mappings altogether? I felt it was safer to keep readability via the directmap. I'm not aware of any logic we have which reads the directmap in order, but it ought to be possible. > As to superpage shattering - I understand this is not deemed to be an issue > in the common case since, with Xen moved as high up below 4G as possible, > it wouldn't normally live inside a 1G mapping anyway? This may want calling > out here. Plus, in non-EFI, non-XEN_ALIGN_2M builds isn't this going to > shatter a 2M page at the tail of .rodata? cpu0_stack has already shattered down to 4k, which is likely in the same superpage as rodata in a non-2M build. But at the end of the day, it is a security/performance tradeoff. memcpy(__va(__pa(divide_error)), "\x0f\x0b", 2); asm ("div %ecx" :: "c" (0)); is an especially low barrier for an attacker who has a partial write gadget. The security benefits are substantial, and the perf downsides are a handful of extra pagetables, and a handful of pagewalks taking extra steps, in non-fast paths (i.e. distinctly marginal). It occurs to me while writing this that the same applies to livepatches. > >> 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. > I'm afraid I don't follow: The keys still apply to entire pages, don't they? > This would still allow write access by all 16 CPUs sharing a page for their > stubs. It would be all stubs, because there are only 16 protection keys and we wouldn't want to interleave adjacent stub mappings. The logic would now be: pks_allow_write_access(); write new stub; pks_revoke_write_access(); so as to limit writeability of any stub to just the critical intending to modify it. This way, an unrelated buggy hypercall couldn't write into the stub. >> * 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. > I did consider committing that change, but it wasn't clear to me whether > there were dependencies on earlier parts of the series that it's part of. I've got a dis-entangled version in my CET series. https://github.com/andyhhp/xen/commit/8d55e1c8ff1d979c985b3fb75c23627348c15209 which needed some header file adjustments to build. But yes - I too was thinking that it ought to be committed. ~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |