Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
  1. Mar 18, 2016
  2. Mar 17, 2016
    • Mark Brown's avatar
    • David Brown's avatar
      ARM/vdso: Mark the vDSO code read-only after init · a1bd41f7
      David Brown authored
      commit 11bf9b86 upstream.
      
      Although the ARM vDSO is cleanly separated by code/data with the code
      being read-only in userspace mappings, the code page is still writable
      from the kernel.
      
      There have been exploits (such as http://itszn.com/blog/?p=21) that
      take advantage of this on x86 to go from a bad kernel write to full
      root.
      
      Prevent this specific exploit class on ARM as well by putting the vDSO
      code page in post-init read-only memory as well.
      
      Before:
      	vdso: 1 text pages at base 80927000
      	root@Vexpress:/ cat /sys/kernel/debug/kernel_page_tables
      	---[ Modules ]---
      	---[ Kernel Mapping ]---
      	0x80000000-0x80100000           1M     RW NX SHD
      	0x80100000-0x80600000           5M     ro x  SHD
      	0x80600000-0x80800000           2M     ro NX SHD
      	0x80800000-0xbe000000         984M     RW NX SHD
      
      After:
      	vdso: 1 text pages at base 8072b000
      	root@Vexpress:/ cat /sys/kernel/debug/kernel_page_tables
      	---[ Modules ]---
      	---[ Kernel Mapping ]---
      	0x80000000-0x80100000           1M     RW NX SHD
      	0x80100000-0x80600000           5M     ro x  SHD
      	0x80600000-0x80800000           2M     ro NX SHD
      	0x80800000-0xbe000000         984M     RW NX SHD
      
      Inspired by https://lkml.org/lkml/2016/1/19/494
      
       based on work by the
      PaX Team, Brad Spengler, and Kees Cook.
      
      Signed-off-by: default avatarDavid Brown <david.brown@linaro.org>
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Brad Spengler <spender@grsecurity.net>
      Cc: Brian Gerst <brgerst@gmail.com>
      Cc: Denys Vlasenko <dvlasenk@redhat.com>
      Cc: Emese Revfy <re.emese@gmail.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Mathias Krause <minipli@googlemail.com>
      Cc: Michael Ellerman <mpe@ellerman.id.au>
      Cc: Nathan Lynch <nathan_lynch@mentor.com>
      Cc: PaX Team <pageexec@freemail.hu>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: kernel-hardening@lists.openwall.com
      Cc: linux-arch <linux-arch@vger.kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-kernel@vger.kernel.org
      Link: http://lkml.kernel.org/r/1455748879-21872-8-git-send-email-keescook@chromium.org
      
      
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      a1bd41f7
    • Kees Cook's avatar
      x86/vdso: Mark the vDSO code read-only after init · c7be1219
      Kees Cook authored
      commit 018ef8dc upstream.
      
      The vDSO does not need to be writable after __init, so mark it as
      __ro_after_init. The result kills the exploit method of writing to the
      vDSO from kernel space resulting in userspace executing the modified code,
      as shown here to bypass SMEP restrictions: http://itszn.com/blog/?p=21
      
      
      
      The memory map (with added vDSO address reporting) shows the vDSO moving
      into read-only memory:
      
      Before:
      	[    0.143067] vDSO @ ffffffff82004000
      	[    0.143551] vDSO @ ffffffff82006000
      	---[ High Kernel Mapping ]---
      	0xffffffff80000000-0xffffffff81000000      16M                         pmd
      	0xffffffff81000000-0xffffffff81800000       8M   ro     PSE     GLB x  pmd
      	0xffffffff81800000-0xffffffff819f3000    1996K   ro             GLB x  pte
      	0xffffffff819f3000-0xffffffff81a00000      52K   ro                 NX pte
      	0xffffffff81a00000-0xffffffff81e00000       4M   ro     PSE     GLB NX pmd
      	0xffffffff81e00000-0xffffffff81e05000      20K   ro             GLB NX pte
      	0xffffffff81e05000-0xffffffff82000000    2028K   ro                 NX pte
      	0xffffffff82000000-0xffffffff8214f000    1340K   RW             GLB NX pte
      	0xffffffff8214f000-0xffffffff82281000    1224K   RW                 NX pte
      	0xffffffff82281000-0xffffffff82400000    1532K   RW             GLB NX pte
      	0xffffffff82400000-0xffffffff83200000      14M   RW     PSE     GLB NX pmd
      	0xffffffff83200000-0xffffffffc0000000     974M                         pmd
      
      After:
      	[    0.145062] vDSO @ ffffffff81da1000
      	[    0.146057] vDSO @ ffffffff81da4000
      	---[ High Kernel Mapping ]---
      	0xffffffff80000000-0xffffffff81000000      16M                         pmd
      	0xffffffff81000000-0xffffffff81800000       8M   ro     PSE     GLB x  pmd
      	0xffffffff81800000-0xffffffff819f3000    1996K   ro             GLB x  pte
      	0xffffffff819f3000-0xffffffff81a00000      52K   ro                 NX pte
      	0xffffffff81a00000-0xffffffff81e00000       4M   ro     PSE     GLB NX pmd
      	0xffffffff81e00000-0xffffffff81e0b000      44K   ro             GLB NX pte
      	0xffffffff81e0b000-0xffffffff82000000    2004K   ro                 NX pte
      	0xffffffff82000000-0xffffffff8214c000    1328K   RW             GLB NX pte
      	0xffffffff8214c000-0xffffffff8227e000    1224K   RW                 NX pte
      	0xffffffff8227e000-0xffffffff82400000    1544K   RW             GLB NX pte
      	0xffffffff82400000-0xffffffff83200000      14M   RW     PSE     GLB NX pmd
      	0xffffffff83200000-0xffffffffc0000000     974M                         pmd
      
      Based on work by PaX Team and Brad Spengler.
      
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Acked-by: default avatarAndy Lutomirski <luto@kernel.org>
      Acked-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Brad Spengler <spender@grsecurity.net>
      Cc: Brian Gerst <brgerst@gmail.com>
      Cc: David Brown <david.brown@linaro.org>
      Cc: Denys Vlasenko <dvlasenk@redhat.com>
      Cc: Emese Revfy <re.emese@gmail.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Mathias Krause <minipli@googlemail.com>
      Cc: Michael Ellerman <mpe@ellerman.id.au>
      Cc: PaX Team <pageexec@freemail.hu>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: kernel-hardening@lists.openwall.com
      Cc: linux-arch <linux-arch@vger.kernel.org>
      Link: http://lkml.kernel.org/r/1455748879-21872-7-git-send-email-keescook@chromium.org
      
      
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarDavid Brown <david.brown@linaro.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      c7be1219
    • Kees Cook's avatar
      lkdtm: Verify that '__ro_after_init' works correctly · 39d2192e
      Kees Cook authored
      commit 7cca071c
      
       upstream.
      
      The new __ro_after_init section should be writable before init, but
      not after. Validate that it gets updated at init and can't be written
      to afterwards.
      
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Brian Gerst <brgerst@gmail.com>
      Cc: David Brown <david.brown@linaro.org>
      Cc: Denys Vlasenko <dvlasenk@redhat.com>
      Cc: Emese Revfy <re.emese@gmail.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Mathias Krause <minipli@googlemail.com>
      Cc: Michael Ellerman <mpe@ellerman.id.au>
      Cc: PaX Team <pageexec@freemail.hu>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: kernel-hardening@lists.openwall.com
      Cc: linux-arch <linux-arch@vger.kernel.org>
      Link: http://lkml.kernel.org/r/1455748879-21872-6-git-send-email-keescook@chromium.org
      
      
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarDavid Brown <david.brown@linaro.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      39d2192e
    • Kees Cook's avatar
      arch: Introduce post-init read-only memory · 7ece66e2
      Kees Cook authored
      commit c74ba8b3
      
       upstream.
      
      One of the easiest ways to protect the kernel from attack is to reduce
      the internal attack surface exposed when a "write" flaw is available. By
      making as much of the kernel read-only as possible, we reduce the
      attack surface.
      
      Many things are written to only during __init, and never changed
      again. These cannot be made "const" since the compiler will do the wrong
      thing (we do actually need to write to them). Instead, move these items
      into a memory region that will be made read-only during mark_rodata_ro()
      which happens after all kernel __init code has finished.
      
      This introduces __ro_after_init as a way to mark such memory, and adds
      some documentation about the existing __read_mostly marking.
      
      This improves the security of the Linux kernel by marking formerly
      read-write memory regions as read-only on a fully booted up system.
      
      Based on work by PaX Team and Brad Spengler.
      
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Brad Spengler <spender@grsecurity.net>
      Cc: Brian Gerst <brgerst@gmail.com>
      Cc: David Brown <david.brown@linaro.org>
      Cc: Denys Vlasenko <dvlasenk@redhat.com>
      Cc: Emese Revfy <re.emese@gmail.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Mathias Krause <minipli@googlemail.com>
      Cc: Michael Ellerman <mpe@ellerman.id.au>
      Cc: PaX Team <pageexec@freemail.hu>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: kernel-hardening@lists.openwall.com
      Cc: linux-arch <linux-arch@vger.kernel.org>
      Link: http://lkml.kernel.org/r/1455748879-21872-5-git-send-email-keescook@chromium.org
      
      
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarDavid Brown <david.brown@linaro.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      7ece66e2
    • Kees Cook's avatar
      x86/mm: Always enable CONFIG_DEBUG_RODATA and remove the Kconfig option · b8902f8e
      Kees Cook authored
      commit 9ccaf77c
      
       upstream.
      
      This removes the CONFIG_DEBUG_RODATA option and makes it always enabled.
      
      This simplifies the code and also makes it clearer that read-only mapped
      memory is just as fundamental a security feature in kernel-space as it is
      in user-space.
      
      Suggested-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Brian Gerst <brgerst@gmail.com>
      Cc: David Brown <david.brown@linaro.org>
      Cc: Denys Vlasenko <dvlasenk@redhat.com>
      Cc: Emese Revfy <re.emese@gmail.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Mathias Krause <minipli@googlemail.com>
      Cc: Michael Ellerman <mpe@ellerman.id.au>
      Cc: PaX Team <pageexec@freemail.hu>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: kernel-hardening@lists.openwall.com
      Cc: linux-arch <linux-arch@vger.kernel.org>
      Link: http://lkml.kernel.org/r/1455748879-21872-4-git-send-email-keescook@chromium.org
      
      
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarDavid Brown <david.brown@linaro.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      b8902f8e
    • Kees Cook's avatar
      mm/init: Add 'rodata=off' boot cmdline parameter to disable read-only kernel mappings · 97db5772
      Kees Cook authored
      commit d2aa1aca
      
       upstream.
      
      It may be useful to debug writes to the readonly sections of memory,
      so provide a cmdline "rodata=off" to allow for this. This can be
      expanded in the future to support "log" and "write" modes, but that
      will need to be architecture-specific.
      
      This also makes KDB software breakpoints more usable, as read-only
      mappings can now be disabled on any kernel.
      
      Suggested-by: default avatarH. Peter Anvin <hpa@zytor.com>
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Brian Gerst <brgerst@gmail.com>
      Cc: David Brown <david.brown@linaro.org>
      Cc: Denys Vlasenko <dvlasenk@redhat.com>
      Cc: Emese Revfy <re.emese@gmail.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Mathias Krause <minipli@googlemail.com>
      Cc: Michael Ellerman <mpe@ellerman.id.au>
      Cc: PaX Team <pageexec@freemail.hu>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: kernel-hardening@lists.openwall.com
      Cc: linux-arch <linux-arch@vger.kernel.org>
      Link: http://lkml.kernel.org/r/1455748879-21872-3-git-send-email-keescook@chromium.org
      
      
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarDavid Brown <david.brown@linaro.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      97db5772
    • Kees Cook's avatar
      asm-generic: Consolidate mark_rodata_ro() · 52596251
      Kees Cook authored
      commit e267d97b
      
       upstream.
      
      Instead of defining mark_rodata_ro() in each architecture, consolidate it.
      
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Andy Gross <agross@codeaurora.org>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: Ashok Kumar <ashoks@broadcom.com>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Borislav Petkov <bp@suse.de>
      Cc: Brian Gerst <brgerst@gmail.com>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Dan Williams <dan.j.williams@intel.com>
      Cc: David Brown <david.brown@linaro.org>
      Cc: David Hildenbrand <dahi@linux.vnet.ibm.com>
      Cc: Denys Vlasenko <dvlasenk@redhat.com>
      Cc: Emese Revfy <re.emese@gmail.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Helge Deller <deller@gmx.de>
      Cc: James E.J. Bottomley <jejb@parisc-linux.org>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Luis R. Rodriguez <mcgrof@suse.com>
      Cc: Marc Zyngier <marc.zyngier@arm.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mathias Krause <minipli@googlemail.com>
      Cc: Michael Ellerman <mpe@ellerman.id.au>
      Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
      Cc: PaX Team <pageexec@freemail.hu>
      Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Rusty Russell <rusty@rustcorp.com.au>
      Cc: Stephen Boyd <sboyd@codeaurora.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Toshi Kani <toshi.kani@hp.com>
      Cc: kernel-hardening@lists.openwall.com
      Cc: linux-arch <linux-arch@vger.kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-kernel@vger.kernel.org
      Cc: linux-parisc@vger.kernel.org
      Link: http://lkml.kernel.org/r/1455748879-21872-2-git-send-email-keescook@chromium.org
      
      
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarDavid Brown <david.brown@linaro.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      52596251
    • Alex Shi's avatar
    • Alex Shi's avatar
      Merge tag 'v4.4.6' into linux-linaro-lsk-v4.4 · 6d0b88c8
      Alex Shi authored
       This is the 4.4.6 stable release
      6d0b88c8
  3. Mar 16, 2016