|
Message-ID: <CALCETrW21Hx1NiMSo7wu8o3c0TH4WUN_pMx20ZPH_AgwxKJRJw@mail.gmail.com> Date: Wed, 1 Mar 2017 13:00:05 -0800 From: Andy Lutomirski <luto@...capital.net> To: Kees Cook <keescook@...omium.org> Cc: Mark Rutland <mark.rutland@....com>, Hoeun Ryu <hoeun.ryu@...il.com>, "kernel-hardening@...ts.openwall.com" <kernel-hardening@...ts.openwall.com>, Andy Lutomirski <luto@...nel.org>, PaX Team <pageexec@...email.hu>, Emese Revfy <re.emese@...il.com>, Russell King <linux@...linux.org.uk>, "x86@...nel.org" <x86@...nel.org> Subject: Re: [RFC][PATCH 1/8] Introduce rare_write() infrastructure On Wed, Mar 1, 2017 at 12:13 PM, Kees Cook <keescook@...omium.org> wrote: > On Wed, Mar 1, 2017 at 2:43 AM, Mark Rutland <mark.rutland@....com> wrote: >> My objection to that was that we can't implement CPU-local full >> disabling of RO protection for the kernel page tables on some >> architectures and configurations, e.g. arm64, or 32-bit arm with LPAE. > > The CPU-local is a pretty important requirement... Hrmm Why? Presumably we'd do pretty well if we made an alias somewhere at a random address and got rid of it quickly. > >> The RW alias write_write(var, val) approach only relies on what arches >> already have to implement for userspace to work, so if we can figure out >> how to make that work API-wise, we can probably implement that >> generically with switch_mm() and {get,put}_user(). > > With a third mm? I maybe misunderstood what you meant about userspace... > I think I'd like this series a lot better if the arch hooks were designed in such a way that a generic implementation could be backed by kmap, use_mm, or similar. This would *require* that the arch hooks be able to return a different address. Also, I see no reason that the list manipulation needs to be particularly special. If the arch hook sets up an alias, couldn't the generic code just call it twice. So here's a new proposal for how the hooks could look: void __arch_rare_write_begin(void); void *__arch_rare_write_map(void *addr, size_t len); void *__arch_rare_write_unmap(void *addr, size_t len); void __arch_rare_write_end(void); or an even simpler variant: void __arch_rare_write_begin(void); void __arch_rare_write(void *dest, const void *source, size_t len); void __arch_rare_write_end(void); Now a generic implementation could work by allocating a percpu mm_struct that contains a single giant VMA. __arch_rare_write_begin() switches to that mm. __arch_rare_write pokes some PTEs into the mm and calls copy_to_user(). __arch_rare_write_end() switches back to the original mm. An x86 implementation could just fiddle with CR0.WP.
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.