Messages in this thread | | | Subject | Re: [PATCH 4/4] x86,module: Detect CRn and DRn manipulation | From | Nadav Amit <> | Date | Tue, 7 Apr 2020 14:22:11 -0700 |
| |
> On Apr 7, 2020, at 1:50 PM, Peter Zijlstra <peterz@infradead.org> wrote: > > On Tue, Apr 07, 2020 at 01:27:45PM -0700, Nadav Amit wrote: >>> On Apr 7, 2020, at 12:38 PM, Peter Zijlstra <peterz@infradead.org> wrote: >>> >>> On Tue, Apr 07, 2020 at 11:55:21AM -0700, Nadav Amit wrote: >>>>> On Apr 7, 2020, at 4:02 AM, Peter Zijlstra <peterz@infradead.org> wrote: >>>>> >>>>> Since we now have infrastructure to analyze module text, disallow >>>>> modules that write to CRn and DRn registers. >>>> >>>> Assuming the kernel is built without CONFIG_PARAVIRT, what is the right way >>>> for out-of-tree modules to write to CRs? Let’s say CR2? >>> >>> Most of them there is no real justification for ever writing to. CR2 I >>> suppose we can have an exception for given a sane rationale for why >>> you'd need to rewrite the fault address. >> >> For the same reason that KVM writes to CR2 - to restore CR2 before entering >> a guest, since CR2 not architecturally loaded from the VMCS. I suspect there >> are additional use-cases which are not covered by the kernel interfaces. > > So I'm not much of a virt guy (clearly), and *groan*, that's horrible. > I'll go make an exception for CR2.
Clearly you are not a virt guy if you think that this is the horrible part in x86 virtualization ;-)
Anyhow, I do not think it is the only use-case which is not covered by your patches (even considering CRs/DRs alone). For example, there is no kernel function to turn on CR4.VMXE, which is required to run hypervisors on x86.
I think a thorough analysis of existing software is needed to figure out which use-cases are valid, and to exclude them during module scanning or to provide alternative kernel interfaces to enable them. This may require a transition phase in which module scanning would only issue warnings and would not prevent the module from being loaded.
| |