From: Kees Cook <keescook@chromium.org> To: linux-kernel@vger.kernel.org Cc: Kees Cook <keescook@chromium.org>, Rik van Riel <riel@redhat.com>, Casey Schaufler <casey@schaufler-ca.com>, PaX Team <pageexec@freemail.hu>, Brad Spengler <spender@grsecurity.net>, Russell King <linux@armlinux.org.uk>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will.deacon@arm.com>, Ard Biesheuvel <ard.biesheuvel@linaro.org>, Benjamin Herrenschmidt <benh@kernel.crashing.org>, Michael Ellerman <mpe@ellerman.id.au>, Tony Luck <tony.luck@intel.com>, Fenghua Yu <fenghua.yu@intel.com>, "David S. Miller" <davem@davemloft.net>, x86@kernel.org, Christoph Lameter <cl@linux.com>, Pekka Enberg <penberg@kernel.org>, David Rientjes <rientjes@google.com>, Joonsoo Kim <iamjoonsoo.kim@lge.com>, Andrew Morton <akpm@linux-foundation.org>, Andy Lutomirski <luto@kernel.org>, Borislav Petkov <bp@suse.de>, Mathias Krause <minipli@googlemail.com>, Jan Kara <jack@suse.cz> Subject: [PATCH v2 0/11] mm: Hardened usercopy Date: Wed, 13 Jul 2016 14:55:53 -0700 [thread overview] Message-ID: <1468446964-22213-1-git-send-email-keescook@chromium.org> (raw) Hi, This is a start of the mainline port of PAX_USERCOPY[1]. After I started writing tests (now in lkdtm in -next) for Casey's earlier port[2], I kept tweaking things further and further until I ended up with a whole new patch series. To that end, I took Rik's feedback and made a number of other changes and clean-ups as well. Based on my understanding, PAX_USERCOPY was designed to catch a few classes of flaws (mainly bad bounds checking) around the use of copy_to_user()/copy_from_user(). These changes don't touch get_user() and put_user(), since these operate on constant sized lengths, and tend to be much less vulnerable. There are effectively three distinct protections in the whole series, each of which I've given a separate CONFIG, though this patch set is only the first of the three intended protections. (Generally speaking, PAX_USERCOPY covers what I'm calling CONFIG_HARDENED_USERCOPY (this) and CONFIG_HARDENED_USERCOPY_WHITELIST (future), and PAX_USERCOPY_SLABS covers CONFIG_HARDENED_USERCOPY_SPLIT_KMALLOC (future).) This series, which adds CONFIG_HARDENED_USERCOPY, checks that objects being copied to/from userspace meet certain criteria: - if address is a heap object, the size must not exceed the object's allocated size. (This will catch all kinds of heap overflow flaws.) - if address range is in the current process stack, it must be within the current stack frame (if such checking is possible) or at least entirely within the current process's stack. (This could catch large lengths that would have extended beyond the current process stack, or overflows if their length extends back into the original stack.) - if the address range is part of kernel data, rodata, or bss, allow it. - if address range is page-allocated, that it doesn't span multiple allocations. - if address is within the kernel text, reject it. - everything else is accepted The patches in the series are: - Support for arch-specific stack frame checking: 1- mm: Implement stack frame object validation - The core copy_to/from_user() checks, without the slab object checks: 2- mm: Hardened usercopy - Per-arch enablement of the protection: 3- x86/uaccess: Enable hardened usercopy 4- ARM: uaccess: Enable hardened usercopy 5- arm64/uaccess: Enable hardened usercopy 6- ia64/uaccess: Enable hardened usercopy 7- powerpc/uaccess: Enable hardened usercopy 8- sparc/uaccess: Enable hardened usercopy 9- s390/uaccess: Enable hardened usercopy - The heap allocator implementation of object size checking: 10- mm: SLAB hardened usercopy support 11- mm: SLUB hardened usercopy support Some notes: - This is expected to apply on top of -next which contains fixes for the position of _etext on both arm and arm64. - I couldn't detect a measurable performance change with these features enabled. Kernel build times were unchanged, hackbench was unchanged, etc. I think we could flip this to "on by default" at some point, but for now, I'm leaving it off until I can get some more definitive measurements. - The SLOB support extracted from grsecurity seems entirely broken. I have no idea what's going on there, I spent my time testing SLAB and SLUB. Having someone else look at SLOB would be nice, but this series doesn't depend on it. Additional features that would be nice, but aren't blocking this series: - Needs more architecture support for stack frame checking (only x86 now). Thanks! -Kees [1] https://grsecurity.net/download.php "grsecurity - test kernel patch" [2] http://www.openwall.com/lists/kernel-hardening/2016/05/19/5 v2: - added s390 support - handle slub red zone - disallow writes to rodata area - stack frame walker now CONFIG-controlled arch-specific helper -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Kees Cook <keescook@chromium.org> To: linux-kernel@vger.kernel.org Cc: Kees Cook <keescook@chromium.org>, Rik van Riel <riel@redhat.com>, Casey Schaufler <casey@schaufler-ca.com>, PaX Team <pageexec@freemail.hu>, Brad Spengler <spender@grsecurity.net>, Russell King <linux@armlinux.org.uk>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will.deacon@arm.com>, Ard Biesheuvel <ard.biesheuvel@linaro.org>, Benjamin Herrenschmidt <benh@kernel.crashing.org>, Michael Ellerman <mpe@ellerman.id.au>, Tony Luck <tony.luck@intel.com>, Fenghua Yu <fenghua.yu@intel.com>, "David S. Miller" <davem@davemloft.net>, x86@kernel.org, Christoph Lameter <cl@linux.com>, Pekka Enberg <penberg@kernel.org>, David Rientjes <rientjes@google.com>, Joonsoo Kim <iamjoonsoo.kim@lge.com>, Andrew Morton <akpm@linux-foundation.org>, Andy Lutomirski <luto@kernel.org>, Borislav Petkov <bp@suse.de>, Mathias Krause <minipli@googlemail.com>, Jan Kara <jack@suse.cz>, Vitaly Wool <vitalywool@gmail.com>, Andrea Arcangeli <aarcange@redhat.com>, Dmitry Vyukov <dvyukov@google.com>, Laura Abbott <labbott@fedoraproject.org>, linux-arm-kernel@lists.infradead.org, linux-ia64@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, sparclinux@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, kernel-hardening@lists.openwall.com Subject: [PATCH v2 0/11] mm: Hardened usercopy Date: Wed, 13 Jul 2016 14:55:53 -0700 [thread overview] Message-ID: <1468446964-22213-1-git-send-email-keescook@chromium.org> (raw) Message-ID: <20160713215553.TsSO37MXIKtp_Kj6L2l0aOAIb_6wcvNIITvQFEGmV7s@z> (raw) Hi, This is a start of the mainline port of PAX_USERCOPY[1]. After I started writing tests (now in lkdtm in -next) for Casey's earlier port[2], I kept tweaking things further and further until I ended up with a whole new patch series. To that end, I took Rik's feedback and made a number of other changes and clean-ups as well. Based on my understanding, PAX_USERCOPY was designed to catch a few classes of flaws (mainly bad bounds checking) around the use of copy_to_user()/copy_from_user(). These changes don't touch get_user() and put_user(), since these operate on constant sized lengths, and tend to be much less vulnerable. There are effectively three distinct protections in the whole series, each of which I've given a separate CONFIG, though this patch set is only the first of the three intended protections. (Generally speaking, PAX_USERCOPY covers what I'm calling CONFIG_HARDENED_USERCOPY (this) and CONFIG_HARDENED_USERCOPY_WHITELIST (future), and PAX_USERCOPY_SLABS covers CONFIG_HARDENED_USERCOPY_SPLIT_KMALLOC (future).) This series, which adds CONFIG_HARDENED_USERCOPY, checks that objects being copied to/from userspace meet certain criteria: - if address is a heap object, the size must not exceed the object's allocated size. (This will catch all kinds of heap overflow flaws.) - if address range is in the current process stack, it must be within the current stack frame (if such checking is possible) or at least entirely within the current process's stack. (This could catch large lengths that would have extended beyond the current process stack, or overflows if their length extends back into the original stack.) - if the address range is part of kernel data, rodata, or bss, allow it. - if address range is page-allocated, that it doesn't span multiple allocations. - if address is within the kernel text, reject it. - everything else is accepted The patches in the series are: - Support for arch-specific stack frame checking: 1- mm: Implement stack frame object validation - The core copy_to/from_user() checks, without the slab object checks: 2- mm: Hardened usercopy - Per-arch enablement of the protection: 3- x86/uaccess: Enable hardened usercopy 4- ARM: uaccess: Enable hardened usercopy 5- arm64/uaccess: Enable hardened usercopy 6- ia64/uaccess: Enable hardened usercopy 7- powerpc/uaccess: Enable hardened usercopy 8- sparc/uaccess: Enable hardened usercopy 9- s390/uaccess: Enable hardened usercopy - The heap allocator implementation of object size checking: 10- mm: SLAB hardened usercopy support 11- mm: SLUB hardened usercopy support Some notes: - This is expected to apply on top of -next which contains fixes for the position of _etext on both arm and arm64. - I couldn't detect a measurable performance change with these features enabled. Kernel build times were unchanged, hackbench was unchanged, etc. I think we could flip this to "on by default" at some point, but for now, I'm leaving it off until I can get some more definitive measurements. - The SLOB support extracted from grsecurity seems entirely broken. I have no idea what's going on there, I spent my time testing SLAB and SLUB. Having someone else look at SLOB would be nice, but this series doesn't depend on it. Additional features that would be nice, but aren't blocking this series: - Needs more architecture support for stack frame checking (only x86 now). Thanks! -Kees [1] https://grsecurity.net/download.php "grsecurity - test kernel patch" [2] http://www.openwall.com/lists/kernel-hardening/2016/05/19/5 v2: - added s390 support - handle slub red zone - disallow writes to rodata area - stack frame walker now CONFIG-controlled arch-specific helper
next reply other threads:[~2016-07-13 21:55 UTC|newest] Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-07-13 21:55 Kees Cook [this message] 2016-07-13 21:55 ` [PATCH v2 0/11] mm: Hardened usercopy Kees Cook 2016-07-13 21:55 ` [PATCH v2 01/11] mm: Implement stack frame object validation Kees Cook 2016-07-13 21:55 ` Kees Cook 2016-07-13 22:01 ` Andy Lutomirski 2016-07-13 22:01 ` Andy Lutomirski 2016-07-13 22:04 ` Kees Cook 2016-07-13 22:04 ` Kees Cook 2016-07-14 5:48 ` Josh Poimboeuf 2016-07-14 5:48 ` Josh Poimboeuf 2016-07-14 18:10 ` Kees Cook 2016-07-14 18:10 ` Kees Cook 2016-07-14 19:23 ` Josh Poimboeuf 2016-07-14 19:23 ` Josh Poimboeuf 2016-07-14 21:38 ` Kees Cook 2016-07-14 21:38 ` Kees Cook 2016-07-13 21:55 ` [PATCH v2 02/11] mm: Hardened usercopy Kees Cook 2016-07-13 21:55 ` Kees Cook 2016-07-14 23:20 ` Balbir Singh 2016-07-14 23:20 ` Balbir Singh 2016-07-15 1:04 ` Rik van Riel 2016-07-15 1:04 ` Rik van Riel 2016-07-15 1:41 ` Balbir Singh 2016-07-15 1:41 ` Balbir Singh 2016-07-15 4:05 ` Kees Cook 2016-07-15 4:05 ` Kees Cook 2016-07-15 4:53 ` Kees Cook 2016-07-15 4:53 ` Kees Cook 2016-07-15 12:55 ` Balbir Singh 2016-07-15 12:55 ` Balbir Singh 2016-07-15 4:25 ` Kees Cook 2016-07-15 4:25 ` Kees Cook 2016-07-15 19:00 ` [kernel-hardening] " Daniel Micay 2016-07-15 19:00 ` Daniel Micay 2016-07-15 19:14 ` Kees Cook 2016-07-15 19:14 ` Kees Cook 2016-07-15 19:19 ` Daniel Micay 2016-07-15 19:19 ` Daniel Micay 2016-07-15 19:23 ` Kees Cook 2016-07-15 19:23 ` Kees Cook 2016-07-13 21:55 ` [PATCH v2 03/11] x86/uaccess: Enable hardened usercopy Kees Cook 2016-07-13 21:55 ` Kees Cook 2016-07-13 21:55 ` [PATCH v2 04/11] ARM: uaccess: " Kees Cook 2016-07-13 21:55 ` Kees Cook 2016-07-13 21:55 ` [PATCH v2 05/11] arm64/uaccess: " Kees Cook 2016-07-13 21:55 ` Kees Cook 2016-07-13 21:55 ` [PATCH v2 06/11] ia64/uaccess: " Kees Cook 2016-07-13 21:55 ` Kees Cook 2016-07-13 21:56 ` [PATCH v2 07/11] powerpc/uaccess: " Kees Cook 2016-07-13 21:56 ` Kees Cook 2016-07-13 21:56 ` [PATCH v2 08/11] sparc/uaccess: " Kees Cook 2016-07-13 21:56 ` Kees Cook 2016-07-13 21:56 ` [PATCH v2 09/11] s390/uaccess: " Kees Cook 2016-07-13 21:56 ` Kees Cook 2016-07-13 21:56 ` [PATCH v2 10/11] mm: SLAB hardened usercopy support Kees Cook 2016-07-13 21:56 ` Kees Cook 2016-07-13 21:56 ` [PATCH v2 11/11] mm: SLUB " Kees Cook 2016-07-13 21:56 ` Kees Cook 2016-07-14 10:07 ` [kernel-hardening] " Michael Ellerman 2016-07-14 10:07 ` Michael Ellerman 2016-07-14 10:07 ` Michael Ellerman 2016-07-14 10:07 ` [kernel-hardening] " Michael Ellerman 2016-07-15 2:05 ` Balbir Singh 2016-07-15 2:05 ` Balbir Singh 2016-07-15 4:29 ` Kees Cook 2016-07-15 4:29 ` Kees Cook
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1468446964-22213-1-git-send-email-keescook@chromium.org \ --to=keescook@chromium.org \ --cc=akpm@linux-foundation.org \ --cc=ard.biesheuvel@linaro.org \ --cc=benh@kernel.crashing.org \ --cc=bp@suse.de \ --cc=casey@schaufler-ca.com \ --cc=catalin.marinas@arm.com \ --cc=cl@linux.com \ --cc=davem@davemloft.net \ --cc=fenghua.yu@intel.com \ --cc=iamjoonsoo.kim@lge.com \ --cc=jack@suse.cz \ --cc=linux-kernel@vger.kernel.org \ --cc=linux@armlinux.org.uk \ --cc=luto@kernel.org \ --cc=minipli@googlemail.com \ --cc=mpe@ellerman.id.au \ --cc=pageexec@freemail.hu \ --cc=penberg@kernel.org \ --cc=riel@redhat.com \ --cc=rientjes@google.com \ --cc=spender@grsecurity.net \ --cc=tony.luck@intel.com \ --cc=will.deacon@arm.com \ --cc=x86@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).