Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753394AbbKZJ5z (ORCPT ); Thu, 26 Nov 2015 04:57:55 -0500 Received: from r00tworld.com ([212.85.137.150]:38816 "EHLO r00tworld.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750845AbbKZJ5v (ORCPT ); Thu, 26 Nov 2015 04:57:51 -0500 From: "PaX Team" To: Ingo Molnar Date: Thu, 26 Nov 2015 10:57:13 +0100 MIME-Version: 1.0 Subject: Re: [kernel-hardening] [PATCH 0/2] introduce post-init read-only memory Reply-to: pageexec@freemail.hu CC: kernel-hardening@lists.openwall.com, Mathias Krause , "linux-kernel@vger.kernel.org" , Kees Cook , Andy Lutomirski , Ingo Molnar , Thomas Gleixner , "H. Peter Anvin" , x86-ml , Arnd Bergmann , Michael Ellerman , linux-arch@vger.kernel.org, Emese Revfy Message-ID: <5656D779.17137.12A1EA53@pageexec.freemail.hu> In-reply-to: <20151126085425.GA29848@gmail.com> References: <1448401114-24650-1-git-send-email-keescook@chromium.org>, <565595F5.32536.DB9FE75@pageexec.freemail.hu>, <20151126085425.GA29848@gmail.com> X-mailer: Pegasus Mail for Windows (4.70) Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7BIT Content-description: Mail message body X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.1.12 (r00tworld.com [212.85.137.150]); Thu, 26 Nov 2015 10:57:06 +0100 (CET) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2850 Lines: 53 On 26 Nov 2015 at 9:54, Ingo Molnar wrote: > * PaX Team wrote: > > > actually the kernel could silently recover from this given how the page fault > > handler could easily determine that the fault address fell into the > > data..read_only section and just silently undo the read-only property, log the > > event to dmesg and retry the faulting access. > > So a safer method would be to decode the faulting instruction, to skip it by > fixing up the return RIP and to log the event. It would be mostly equivalent to > trying to write to ROM (which get ignored as well), so it's a recoverable (and > debuggable) event. if by skipping you mean ignoring the write attempt then it's not a good idea as it has a good chance to cause unexpected behaviour down the line. e.g., imagine that the write was to a function pointer (even an entire ops structure) or a boolean that controls some important feature for after-init code. ignoring/dropping such writes could cause all kinds of logic bugs (if not worse). my somewhat related war story is that i once tried to constify machine_ops (both the struct and the variable of the same name) directly and just forced the writes in kvm/xen/etc via type casts. now i knew it was all undefined behaviour but i didn't expect gcc to take advantage of it but it did (const propagated the *initial* fptr values into the indirect calls by turning them into direct calls) and which in turn prevented proper reboots for guests (an event which obviously happens much later after init/boot to the great puzzlement of end users and myself). misusing __read_only and ignoring write attempts would effectively produce the same misbehaviour as above so i strongly advise against it. now i understand that the motivation is probably to preserve the read-only property despite wrong use of __read_only but for this i'd suggest to simply not make the silent recovery the default behaviour and enable it on the kernel command line only. after all, this is expected to be a reproducible problem and affected users can just reboot (in fact, they'd be advised to) when it happens and get a proper report that they could then send back to lkml. i also don't expect this to be a frequent problem as __read_only will have to be handled carefully in every case and not just at the time of adding it to a variable but also later during code evolution. as i suggested in the constify plugin thread earlier, use of __read_only should be tied to compile time checking of all uses of the affected variable to eliminate the entire problem of problematic writes. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/