On Wed, Feb 12, 2020 at 05:54:35PM +0100, Jann Horn wrote: > On Wed, Feb 12, 2020 at 8:51 AM Kees Cook <keescook@xxxxxxxxxxxx> wrote: > > On Tue, Feb 11, 2020 at 02:55:41PM -0800, Daniel Colascione wrote: > > > Let userfaultfd opt out of handling kernel-mode faults > > > Add a new sysctl for limiting userfaultfd to user mode faults > > > > Now this I'm very interested in. Can you go into more detail about two > > things: > [...] > > - Why is this needed in addition to the existing vm.unprivileged_userfaultfd > > sysctl? (And should this maybe just be another setting for that > > sysctl, like "2"?) > > > > As to the mechanics of the change, I'm not sure I like the idea of adding > > a UAPI flag for this. Why not just retain the permission check done at > > open() and if kernelmode faults aren't allowed, ignore them? This would > > require no changes to existing programs and gains the desired defense. > > (And, I think, the sysctl value could be bumped to "2" as that's a > > better default state -- does qemu actually need kernelmode traps?) > > I think this might be necessary for I/O emulation? As in, if before > getting migrated, the guest writes some data into a buffer, then the > guest gets migrated, and then while the postcopy migration stuff is > still running, the guest tells QEMU to write that data from > guest-physical memory to disk or whatever; I think in that case, QEMU > will do something like a pwrite() syscall where the userspace pointer > points into the memory area containing guest-physical memory, which > would return -EFAULT if userfaultfd was restricted to userspace > accesses. > > This was described in this old presentation about why userfaultfd is > better than a SIGSEGV handler: > https://drive.google.com/file/d/0BzyAwvVlQckeSzlCSDFmRHVybzQ/view > (slide 6) (recording at https://youtu.be/pC8cWWRVSPw?t=463) Right. AFAICT QEMU uses it far more than disk IOs. A guest page can be accessed by any kernel component on the destination host during a postcopy procedure. It can be as simple as when a vcpu writes to a missing guest page which still resides on the source host, then KVM will get a page fault and trap into userfaultfd asking for that page. The same thing happens to other modules like vhost, etc., as long as a missing guest page is touched by a kernel module. Thanks, -- Peter Xu