Skip to content
  • Matthieu CASTET's avatar
    x86: Add RO/NX protection for loadable kernel modules · 84e1c6bb
    Matthieu CASTET authored
    
    
    This patch is a logical extension of the protection provided by
    CONFIG_DEBUG_RODATA to LKMs. The protection is provided by
    splitting module_core and module_init into three logical parts
    each and setting appropriate page access permissions for each
    individual section:
    
     1. Code: RO+X
     2. RO data: RO+NX
     3. RW data: RW+NX
    
    In order to achieve proper protection, layout_sections() have
    been modified to align each of the three parts mentioned above
    onto page boundary. Next, the corresponding page access
    permissions are set right before successful exit from
    load_module(). Further, free_module() and sys_init_module have
    been modified to set module_core and module_init as RW+NX right
    before calling module_free().
    
    By default, the original section layout and access flags are
    preserved. When compiled with CONFIG_DEBUG_SET_MODULE_RONX=y,
    the patch will page-align each group of sections to ensure that
    each page contains only one type of content and will enforce
    RO/NX for each group of pages.
    
      -v1: Initial proof-of-concept patch.
      -v2: The patch have been re-written to reduce the number of #ifdefs
           and to make it architecture-agnostic. Code formatting has also
           been corrected.
      -v3: Opportunistic RO/NX protection is now unconditional. Section
           page-alignment is enabled when CONFIG_DEBUG_RODATA=y.
      -v4: Removed most macros and improved coding style.
      -v5: Changed page-alignment and RO/NX section size calculation
      -v6: Fixed comments. Restricted RO/NX enforcement to x86 only
      -v7: Introduced CONFIG_DEBUG_SET_MODULE_RONX, added
           calls to set_all_modules_text_rw() and set_all_modules_text_ro()
           in ftrace
      -v8: updated for compatibility with linux 2.6.33-rc5
      -v9: coding style fixes
     -v10: more coding style fixes
     -v11: minor adjustments for -tip
     -v12: minor adjustments for v2.6.35-rc2-tip
     -v13: minor adjustments for v2.6.37-rc1-tip
    
    Signed-off-by: default avatarSiarhei Liakh <sliakh.lkml@gmail.com>
    Signed-off-by: default avatarXuxian Jiang <jiang@cs.ncsu.edu>
    Acked-by: default avatarArjan van de Ven <arjan@linux.intel.com>
    Reviewed-by: default avatarJames Morris <jmorris@namei.org>
    Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
    Cc: Andi Kleen <ak@muc.de>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    Cc: Dave Jones <davej@redhat.com>
    Cc: Kees Cook <kees.cook@canonical.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    LKML-Reference: <4CE2F914.9070106@free.fr>
    [ minor cleanliness edits, -v14: build failure fix ]
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    84e1c6bb