mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-04-01 20:03:26 +00:00
This renames the (now inaccurate) CONFIG_DEBUG_RODATA and related config
CONFIG_SET_MODULE_RONX to the more sensible CONFIG_STRICT_KERNEL_RWX and CONFIG_STRICT_MODULE_RWX. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Kees Cook <kees@outflux.net> iQIcBAABCgAGBQJYrJ2ZAAoJEIly9N/cbcAmb4UQAIDnJYF4xecUfxofypQwt7ey DcR8SH+g/Rkm3v2bUOrVdlP333ePRUEs6C47PgYSLlKsZiQA3H6bsTILHJZGHZ3j laNH4sjQ0j+Sr2rHXk8fLz3YpHHwIy49bfu2ERXFH92BMnTMCv1h9IWFgOMH+4y5 09n16TPHMUj1k0DGjHO/n03qLIKOo3Xy/Va5dhQ/6dGU4zR4KhOBnhLlG3IU7Atd KTR+ba/qym7bDQbTezMuaajTiZctr6a45yBKDWu4Knu+ot2a7K7fYvfRT3YVb5SU aTSYps7NKQbewcQSqNdek1zytoy2Ck7CH511e+3ypwNmao5KQwRgH7OX1pDEXyZv rGDaVzKMTSddH23jLEKUbpR847Lza9+V3h5YtbMG8GgiCKs91Ec666iEE3NVZBO8 1hiiYhE2iDxi10B/EZZcn2gOt2JaB2m2GxWIrJOz4txtDAWbUYlhUpWEUynBTPQ0 cYBZVnge81awipZJTWUv57LyufnTnMSK3i8Q8t0woj4C7pFbPYfjnKCrgwTQyAvr mD4uFBrgFb1lftbc3kfTdeoZmXerzvubsstWdr3rU3nsiJFzY1SwJZe8n0THyL4g DzURFrj/8UXb32Kavysz6FTxFO9u87mJm6yqHn/Y3bEK7Y7cch/NYjRC9Q6dpH+4 ld9apHF6iRrqgf+x6oOh =7KhR -----END PGP SIGNATURE----- Merge tag 'rodata-v4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux Pull rodata updates from Kees Cook: "This renames the (now inaccurate) DEBUG_RODATA and related SET_MODULE_RONX configs to the more sensible STRICT_KERNEL_RWX and STRICT_MODULE_RWX" * tag 'rodata-v4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: arch: Rename CONFIG_DEBUG_RODATA and CONFIG_DEBUG_MODULE_RONX arch: Move CONFIG_DEBUG_RODATA and CONFIG_SET_MODULE_RONX to be common
This commit is contained in:
commit
7bb033829e
33 changed files with 90 additions and 109 deletions
Documentation
arch
include/linux
init
kernel
|
@ -115,12 +115,12 @@
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
If the architecture that you are using supports the kernel option
|
If the architecture that you are using supports the kernel option
|
||||||
CONFIG_DEBUG_RODATA, you should consider turning it off. This
|
CONFIG_STRICT_KERNEL_RWX, you should consider turning it off. This
|
||||||
option will prevent the use of software breakpoints because it
|
option will prevent the use of software breakpoints because it
|
||||||
marks certain regions of the kernel's memory space as read-only.
|
marks certain regions of the kernel's memory space as read-only.
|
||||||
If kgdb supports it for the architecture you are using, you can
|
If kgdb supports it for the architecture you are using, you can
|
||||||
use hardware breakpoints if you desire to run with the
|
use hardware breakpoints if you desire to run with the
|
||||||
CONFIG_DEBUG_RODATA option turned on, else you need to turn off
|
CONFIG_STRICT_KERNEL_RWX option turned on, else you need to turn off
|
||||||
this option.
|
this option.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
|
@ -135,7 +135,7 @@
|
||||||
<para>Here is an example set of .config symbols to enable or
|
<para>Here is an example set of .config symbols to enable or
|
||||||
disable for kgdb:
|
disable for kgdb:
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem><para># CONFIG_DEBUG_RODATA is not set</para></listitem>
|
<listitem><para># CONFIG_STRICT_KERNEL_RWX is not set</para></listitem>
|
||||||
<listitem><para>CONFIG_FRAME_POINTER=y</para></listitem>
|
<listitem><para>CONFIG_FRAME_POINTER=y</para></listitem>
|
||||||
<listitem><para>CONFIG_KGDB=y</para></listitem>
|
<listitem><para>CONFIG_KGDB=y</para></listitem>
|
||||||
<listitem><para>CONFIG_KGDB_SERIAL_CONSOLE=y</para></listitem>
|
<listitem><para>CONFIG_KGDB_SERIAL_CONSOLE=y</para></listitem>
|
||||||
|
@ -166,7 +166,7 @@
|
||||||
</para>
|
</para>
|
||||||
<para>Here is an example set of .config symbols to enable/disable kdb:
|
<para>Here is an example set of .config symbols to enable/disable kdb:
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem><para># CONFIG_DEBUG_RODATA is not set</para></listitem>
|
<listitem><para># CONFIG_STRICT_KERNEL_RWX is not set</para></listitem>
|
||||||
<listitem><para>CONFIG_FRAME_POINTER=y</para></listitem>
|
<listitem><para>CONFIG_FRAME_POINTER=y</para></listitem>
|
||||||
<listitem><para>CONFIG_KGDB=y</para></listitem>
|
<listitem><para>CONFIG_KGDB=y</para></listitem>
|
||||||
<listitem><para>CONFIG_KGDB_SERIAL_CONSOLE=y</para></listitem>
|
<listitem><para>CONFIG_KGDB_SERIAL_CONSOLE=y</para></listitem>
|
||||||
|
|
|
@ -51,11 +51,17 @@ kernel, they are implemented in a way where the memory is temporarily
|
||||||
made writable during the update, and then returned to the original
|
made writable during the update, and then returned to the original
|
||||||
permissions.)
|
permissions.)
|
||||||
|
|
||||||
In support of this are (the poorly named) CONFIG_DEBUG_RODATA and
|
In support of this are CONFIG_STRICT_KERNEL_RWX and
|
||||||
CONFIG_DEBUG_SET_MODULE_RONX, which seek to make sure that code is not
|
CONFIG_STRICT_MODULE_RWX, which seek to make sure that code is not
|
||||||
writable, data is not executable, and read-only data is neither writable
|
writable, data is not executable, and read-only data is neither writable
|
||||||
nor executable.
|
nor executable.
|
||||||
|
|
||||||
|
Most architectures have these options on by default and not user selectable.
|
||||||
|
For some architectures like arm that wish to have these be selectable,
|
||||||
|
the architecture Kconfig can select ARCH_OPTIONAL_KERNEL_RWX to enable
|
||||||
|
a Kconfig prompt. CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT determines
|
||||||
|
the default setting when ARCH_OPTIONAL_KERNEL_RWX is enabled.
|
||||||
|
|
||||||
#### Function pointers and sensitive variables must not be writable
|
#### Function pointers and sensitive variables must not be writable
|
||||||
|
|
||||||
Vast areas of kernel memory contain function pointers that are looked
|
Vast areas of kernel memory contain function pointers that are looked
|
||||||
|
|
34
arch/Kconfig
34
arch/Kconfig
|
@ -781,4 +781,38 @@ config VMAP_STACK
|
||||||
the stack to map directly to the KASAN shadow map using a formula
|
the stack to map directly to the KASAN shadow map using a formula
|
||||||
that is incorrect if the stack is in vmalloc space.
|
that is incorrect if the stack is in vmalloc space.
|
||||||
|
|
||||||
|
config ARCH_OPTIONAL_KERNEL_RWX
|
||||||
|
def_bool n
|
||||||
|
|
||||||
|
config ARCH_OPTIONAL_KERNEL_RWX_DEFAULT
|
||||||
|
def_bool n
|
||||||
|
|
||||||
|
config ARCH_HAS_STRICT_KERNEL_RWX
|
||||||
|
def_bool n
|
||||||
|
|
||||||
|
config STRICT_KERNEL_RWX
|
||||||
|
bool "Make kernel text and rodata read-only" if ARCH_OPTIONAL_KERNEL_RWX
|
||||||
|
depends on ARCH_HAS_STRICT_KERNEL_RWX
|
||||||
|
default !ARCH_OPTIONAL_KERNEL_RWX || ARCH_OPTIONAL_KERNEL_RWX_DEFAULT
|
||||||
|
help
|
||||||
|
If this is set, kernel text and rodata memory will be made read-only,
|
||||||
|
and non-text memory will be made non-executable. This provides
|
||||||
|
protection against certain security exploits (e.g. executing the heap
|
||||||
|
or modifying text)
|
||||||
|
|
||||||
|
These features are considered standard security practice these days.
|
||||||
|
You should say Y here in almost all cases.
|
||||||
|
|
||||||
|
config ARCH_HAS_STRICT_MODULE_RWX
|
||||||
|
def_bool n
|
||||||
|
|
||||||
|
config STRICT_MODULE_RWX
|
||||||
|
bool "Set loadable kernel module data as NX and text as RO" if ARCH_OPTIONAL_KERNEL_RWX
|
||||||
|
depends on ARCH_HAS_STRICT_MODULE_RWX && MODULES
|
||||||
|
default !ARCH_OPTIONAL_KERNEL_RWX || ARCH_OPTIONAL_KERNEL_RWX_DEFAULT
|
||||||
|
help
|
||||||
|
If this is set, module text and rodata memory will be made read-only,
|
||||||
|
and non-text memory will be made non-executable. This provides
|
||||||
|
protection against certain security exploits (e.g. writing to text)
|
||||||
|
|
||||||
source "kernel/gcov/Kconfig"
|
source "kernel/gcov/Kconfig"
|
||||||
|
|
|
@ -4,10 +4,14 @@ config ARM
|
||||||
select ARCH_CLOCKSOURCE_DATA
|
select ARCH_CLOCKSOURCE_DATA
|
||||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||||
select ARCH_HAS_ELF_RANDOMIZE
|
select ARCH_HAS_ELF_RANDOMIZE
|
||||||
|
select ARCH_HAS_STRICT_KERNEL_RWX if MMU && !XIP_KERNEL
|
||||||
|
select ARCH_HAS_STRICT_MODULE_RWX if MMU
|
||||||
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
||||||
select ARCH_HAVE_CUSTOM_GPIO_H
|
select ARCH_HAVE_CUSTOM_GPIO_H
|
||||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||||
select ARCH_MIGHT_HAVE_PC_PARPORT
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||||
|
select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX
|
||||||
|
select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT if CPU_V7
|
||||||
select ARCH_SUPPORTS_ATOMIC_RMW
|
select ARCH_SUPPORTS_ATOMIC_RMW
|
||||||
select ARCH_USE_BUILTIN_BSWAP
|
select ARCH_USE_BUILTIN_BSWAP
|
||||||
select ARCH_USE_CMPXCHG_LOCKREF
|
select ARCH_USE_CMPXCHG_LOCKREF
|
||||||
|
|
|
@ -1738,17 +1738,6 @@ config PID_IN_CONTEXTIDR
|
||||||
additional instructions during context switch. Say Y here only if you
|
additional instructions during context switch. Say Y here only if you
|
||||||
are planning to use hardware trace tools with this kernel.
|
are planning to use hardware trace tools with this kernel.
|
||||||
|
|
||||||
config DEBUG_SET_MODULE_RONX
|
|
||||||
bool "Set loadable kernel module data as NX and text as RO"
|
|
||||||
depends on MODULES && MMU
|
|
||||||
---help---
|
|
||||||
This option helps catch unintended modifications to loadable
|
|
||||||
kernel module's text and read-only data. It also prevents execution
|
|
||||||
of module data. Such protection may interfere with run-time code
|
|
||||||
patching and dynamic kernel tracing - and they might also protect
|
|
||||||
against certain classes of kernel exploits.
|
|
||||||
If in doubt, say "N".
|
|
||||||
|
|
||||||
source "drivers/hwtracing/coresight/Kconfig"
|
source "drivers/hwtracing/coresight/Kconfig"
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
|
@ -25,7 +25,6 @@ CONFIG_MODULE_UNLOAD=y
|
||||||
# CONFIG_ARCH_MULTI_V7 is not set
|
# CONFIG_ARCH_MULTI_V7 is not set
|
||||||
CONFIG_ARCH_ASPEED=y
|
CONFIG_ARCH_ASPEED=y
|
||||||
CONFIG_MACH_ASPEED_G4=y
|
CONFIG_MACH_ASPEED_G4=y
|
||||||
CONFIG_DEBUG_RODATA=y
|
|
||||||
CONFIG_AEABI=y
|
CONFIG_AEABI=y
|
||||||
CONFIG_UACCESS_WITH_MEMCPY=y
|
CONFIG_UACCESS_WITH_MEMCPY=y
|
||||||
CONFIG_SECCOMP=y
|
CONFIG_SECCOMP=y
|
||||||
|
@ -79,7 +78,8 @@ CONFIG_DEBUG_LL_UART_8250=y
|
||||||
CONFIG_DEBUG_UART_PHYS=0x1e784000
|
CONFIG_DEBUG_UART_PHYS=0x1e784000
|
||||||
CONFIG_DEBUG_UART_VIRT=0xe8784000
|
CONFIG_DEBUG_UART_VIRT=0xe8784000
|
||||||
CONFIG_EARLY_PRINTK=y
|
CONFIG_EARLY_PRINTK=y
|
||||||
CONFIG_DEBUG_SET_MODULE_RONX=y
|
CONFIG_STRICT_MODULE_RWX=y
|
||||||
|
CONFIG_STRICT_KERNEL_RWX=y
|
||||||
# CONFIG_XZ_DEC_X86 is not set
|
# CONFIG_XZ_DEC_X86 is not set
|
||||||
# CONFIG_XZ_DEC_POWERPC is not set
|
# CONFIG_XZ_DEC_POWERPC is not set
|
||||||
# CONFIG_XZ_DEC_IA64 is not set
|
# CONFIG_XZ_DEC_IA64 is not set
|
||||||
|
|
|
@ -26,7 +26,6 @@ CONFIG_ARCH_MULTI_V6=y
|
||||||
# CONFIG_ARCH_MULTI_V7 is not set
|
# CONFIG_ARCH_MULTI_V7 is not set
|
||||||
CONFIG_ARCH_ASPEED=y
|
CONFIG_ARCH_ASPEED=y
|
||||||
CONFIG_MACH_ASPEED_G5=y
|
CONFIG_MACH_ASPEED_G5=y
|
||||||
CONFIG_DEBUG_RODATA=y
|
|
||||||
CONFIG_AEABI=y
|
CONFIG_AEABI=y
|
||||||
CONFIG_UACCESS_WITH_MEMCPY=y
|
CONFIG_UACCESS_WITH_MEMCPY=y
|
||||||
CONFIG_SECCOMP=y
|
CONFIG_SECCOMP=y
|
||||||
|
@ -81,7 +80,8 @@ CONFIG_DEBUG_LL_UART_8250=y
|
||||||
CONFIG_DEBUG_UART_PHYS=0x1e784000
|
CONFIG_DEBUG_UART_PHYS=0x1e784000
|
||||||
CONFIG_DEBUG_UART_VIRT=0xe8784000
|
CONFIG_DEBUG_UART_VIRT=0xe8784000
|
||||||
CONFIG_EARLY_PRINTK=y
|
CONFIG_EARLY_PRINTK=y
|
||||||
CONFIG_DEBUG_SET_MODULE_RONX=y
|
CONFIG_STRICT_MODULE_RWX=y
|
||||||
|
CONFIG_STRICT_KERNEL_RWX=y
|
||||||
# CONFIG_XZ_DEC_X86 is not set
|
# CONFIG_XZ_DEC_X86 is not set
|
||||||
# CONFIG_XZ_DEC_POWERPC is not set
|
# CONFIG_XZ_DEC_POWERPC is not set
|
||||||
# CONFIG_XZ_DEC_IA64 is not set
|
# CONFIG_XZ_DEC_IA64 is not set
|
||||||
|
|
|
@ -490,7 +490,7 @@ static inline int set_memory_x(unsigned long addr, int numpages) { return 0; }
|
||||||
static inline int set_memory_nx(unsigned long addr, int numpages) { return 0; }
|
static inline int set_memory_nx(unsigned long addr, int numpages) { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
void set_kernel_text_rw(void);
|
void set_kernel_text_rw(void);
|
||||||
void set_kernel_text_ro(void);
|
void set_kernel_text_ro(void);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -24,9 +24,9 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
|
||||||
bool module = !core_kernel_text(uintaddr);
|
bool module = !core_kernel_text(uintaddr);
|
||||||
struct page *page;
|
struct page *page;
|
||||||
|
|
||||||
if (module && IS_ENABLED(CONFIG_DEBUG_SET_MODULE_RONX))
|
if (module && IS_ENABLED(CONFIG_STRICT_MODULE_RWX))
|
||||||
page = vmalloc_to_page(addr);
|
page = vmalloc_to_page(addr);
|
||||||
else if (!module && IS_ENABLED(CONFIG_DEBUG_RODATA))
|
else if (!module && IS_ENABLED(CONFIG_STRICT_KERNEL_RWX))
|
||||||
page = virt_to_page(addr);
|
page = virt_to_page(addr);
|
||||||
else
|
else
|
||||||
return addr;
|
return addr;
|
||||||
|
|
|
@ -97,7 +97,7 @@ SECTIONS
|
||||||
HEAD_TEXT
|
HEAD_TEXT
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
. = ALIGN(1<<SECTION_SHIFT);
|
. = ALIGN(1<<SECTION_SHIFT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ SECTIONS
|
||||||
|
|
||||||
NOTES
|
NOTES
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
. = ALIGN(1<<SECTION_SHIFT);
|
. = ALIGN(1<<SECTION_SHIFT);
|
||||||
#else
|
#else
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
@ -230,7 +230,7 @@ SECTIONS
|
||||||
PERCPU_SECTION(L1_CACHE_BYTES)
|
PERCPU_SECTION(L1_CACHE_BYTES)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
. = ALIGN(1<<SECTION_SHIFT);
|
. = ALIGN(1<<SECTION_SHIFT);
|
||||||
#else
|
#else
|
||||||
. = ALIGN(THREAD_SIZE);
|
. = ALIGN(THREAD_SIZE);
|
||||||
|
@ -325,7 +325,7 @@ SECTIONS
|
||||||
STABS_DEBUG
|
STABS_DEBUG
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
/*
|
/*
|
||||||
* Without CONFIG_DEBUG_ALIGN_RODATA, __start_rodata_section_aligned will
|
* Without CONFIG_DEBUG_ALIGN_RODATA, __start_rodata_section_aligned will
|
||||||
* be the first section-aligned location after __start_rodata. Otherwise,
|
* be the first section-aligned location after __start_rodata. Otherwise,
|
||||||
|
|
|
@ -1051,21 +1051,9 @@ config ARCH_SUPPORTS_BIG_ENDIAN
|
||||||
This option specifies the architecture can support big endian
|
This option specifies the architecture can support big endian
|
||||||
operation.
|
operation.
|
||||||
|
|
||||||
config DEBUG_RODATA
|
|
||||||
bool "Make kernel text and rodata read-only"
|
|
||||||
depends on MMU && !XIP_KERNEL
|
|
||||||
default y if CPU_V7
|
|
||||||
help
|
|
||||||
If this is set, kernel text and rodata memory will be made
|
|
||||||
read-only, and non-text kernel memory will be made non-executable.
|
|
||||||
The tradeoff is that each region is padded to section-size (1MiB)
|
|
||||||
boundaries (because their permissions are different and splitting
|
|
||||||
the 1M pages into 4K ones causes TLB performance problems), which
|
|
||||||
can waste memory.
|
|
||||||
|
|
||||||
config DEBUG_ALIGN_RODATA
|
config DEBUG_ALIGN_RODATA
|
||||||
bool "Make rodata strictly non-executable"
|
bool "Make rodata strictly non-executable"
|
||||||
depends on DEBUG_RODATA
|
depends on STRICT_KERNEL_RWX
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
If this is set, rodata will be made explicitly non-executable. This
|
If this is set, rodata will be made explicitly non-executable. This
|
||||||
|
|
|
@ -572,7 +572,7 @@ void __init mem_init(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
struct section_perm {
|
struct section_perm {
|
||||||
const char *name;
|
const char *name;
|
||||||
unsigned long start;
|
unsigned long start;
|
||||||
|
@ -741,7 +741,7 @@ void set_kernel_text_ro(void)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline void fix_kernmem_perms(void) { }
|
static inline void fix_kernmem_perms(void) { }
|
||||||
#endif /* CONFIG_DEBUG_RODATA */
|
#endif /* CONFIG_STRICT_KERNEL_RWX */
|
||||||
|
|
||||||
void free_tcmmem(void)
|
void free_tcmmem(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,6 +13,8 @@ config ARM64
|
||||||
select ARCH_HAS_GIGANTIC_PAGE
|
select ARCH_HAS_GIGANTIC_PAGE
|
||||||
select ARCH_HAS_KCOV
|
select ARCH_HAS_KCOV
|
||||||
select ARCH_HAS_SG_CHAIN
|
select ARCH_HAS_SG_CHAIN
|
||||||
|
select ARCH_HAS_STRICT_KERNEL_RWX
|
||||||
|
select ARCH_HAS_STRICT_MODULE_RWX
|
||||||
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
||||||
select ARCH_USE_CMPXCHG_LOCKREF
|
select ARCH_USE_CMPXCHG_LOCKREF
|
||||||
select ARCH_SUPPORTS_ATOMIC_RMW
|
select ARCH_SUPPORTS_ATOMIC_RMW
|
||||||
|
@ -123,9 +125,6 @@ config ARCH_PHYS_ADDR_T_64BIT
|
||||||
config MMU
|
config MMU
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
config DEBUG_RODATA
|
|
||||||
def_bool y
|
|
||||||
|
|
||||||
config ARM64_PAGE_SHIFT
|
config ARM64_PAGE_SHIFT
|
||||||
int
|
int
|
||||||
default 16 if ARM64_64K_PAGES
|
default 16 if ARM64_64K_PAGES
|
||||||
|
|
|
@ -71,19 +71,8 @@ config DEBUG_WX
|
||||||
|
|
||||||
If in doubt, say "Y".
|
If in doubt, say "Y".
|
||||||
|
|
||||||
config DEBUG_SET_MODULE_RONX
|
|
||||||
bool "Set loadable kernel module data as NX and text as RO"
|
|
||||||
depends on MODULES
|
|
||||||
default y
|
|
||||||
help
|
|
||||||
Is this is set, kernel module text and rodata will be made read-only.
|
|
||||||
This is to help catch accidental or malicious attempts to change the
|
|
||||||
kernel's executable code.
|
|
||||||
|
|
||||||
If in doubt, say Y.
|
|
||||||
|
|
||||||
config DEBUG_ALIGN_RODATA
|
config DEBUG_ALIGN_RODATA
|
||||||
depends on DEBUG_RODATA
|
depends on STRICT_KERNEL_RWX
|
||||||
bool "Align linker sections up to SECTION_SIZE"
|
bool "Align linker sections up to SECTION_SIZE"
|
||||||
help
|
help
|
||||||
If this option is enabled, sections that may potentially be marked as
|
If this option is enabled, sections that may potentially be marked as
|
||||||
|
|
|
@ -93,7 +93,7 @@ static void __kprobes *patch_map(void *addr, int fixmap)
|
||||||
bool module = !core_kernel_text(uintaddr);
|
bool module = !core_kernel_text(uintaddr);
|
||||||
struct page *page;
|
struct page *page;
|
||||||
|
|
||||||
if (module && IS_ENABLED(CONFIG_DEBUG_SET_MODULE_RONX))
|
if (module && IS_ENABLED(CONFIG_STRICT_MODULE_RWX))
|
||||||
page = vmalloc_to_page(addr);
|
page = vmalloc_to_page(addr);
|
||||||
else if (!module)
|
else if (!module)
|
||||||
page = pfn_to_page(PHYS_PFN(__pa(addr)));
|
page = pfn_to_page(PHYS_PFN(__pa(addr)));
|
||||||
|
|
|
@ -8,6 +8,7 @@ config PARISC
|
||||||
select HAVE_SYSCALL_TRACEPOINTS
|
select HAVE_SYSCALL_TRACEPOINTS
|
||||||
select ARCH_WANT_FRAME_POINTERS
|
select ARCH_WANT_FRAME_POINTERS
|
||||||
select ARCH_HAS_ELF_RANDOMIZE
|
select ARCH_HAS_ELF_RANDOMIZE
|
||||||
|
select ARCH_HAS_STRICT_KERNEL_RWX
|
||||||
select RTC_CLASS
|
select RTC_CLASS
|
||||||
select RTC_DRV_GENERIC
|
select RTC_DRV_GENERIC
|
||||||
select INIT_ALL_POSSIBLE
|
select INIT_ALL_POSSIBLE
|
||||||
|
|
|
@ -5,15 +5,4 @@ source "lib/Kconfig.debug"
|
||||||
config TRACE_IRQFLAGS_SUPPORT
|
config TRACE_IRQFLAGS_SUPPORT
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
config DEBUG_RODATA
|
|
||||||
bool "Write protect kernel read-only data structures"
|
|
||||||
depends on DEBUG_KERNEL
|
|
||||||
default y
|
|
||||||
help
|
|
||||||
Mark the kernel read-only data as write-protected in the pagetables,
|
|
||||||
in order to catch accidental (and incorrect) writes to such const
|
|
||||||
data. This option may have a slight performance impact because a
|
|
||||||
portion of the kernel code won't be covered by a TLB anymore.
|
|
||||||
If in doubt, say "N".
|
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
|
@ -182,7 +182,6 @@ CONFIG_DEBUG_FS=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_DEBUG_MUTEXES=y
|
CONFIG_DEBUG_MUTEXES=y
|
||||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||||
CONFIG_DEBUG_RODATA=y
|
|
||||||
CONFIG_CRYPTO_NULL=m
|
CONFIG_CRYPTO_NULL=m
|
||||||
CONFIG_CRYPTO_TEST=m
|
CONFIG_CRYPTO_TEST=m
|
||||||
CONFIG_CRYPTO_HMAC=y
|
CONFIG_CRYPTO_HMAC=y
|
||||||
|
|
|
@ -166,7 +166,6 @@ CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_DEBUG_MUTEXES=y
|
CONFIG_DEBUG_MUTEXES=y
|
||||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||||
CONFIG_DEBUG_RODATA=y
|
|
||||||
CONFIG_CRYPTO_NULL=m
|
CONFIG_CRYPTO_NULL=m
|
||||||
CONFIG_CRYPTO_TEST=m
|
CONFIG_CRYPTO_TEST=m
|
||||||
CONFIG_CRYPTO_MD5=m
|
CONFIG_CRYPTO_MD5=m
|
||||||
|
|
|
@ -545,7 +545,7 @@ void free_initmem(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
void mark_rodata_ro(void)
|
void mark_rodata_ro(void)
|
||||||
{
|
{
|
||||||
/* rodata memory was already mapped with KERNEL_RO access rights by
|
/* rodata memory was already mapped with KERNEL_RO access rights by
|
||||||
|
|
|
@ -62,9 +62,6 @@ config PCI_QUIRKS
|
||||||
config ARCH_SUPPORTS_UPROBES
|
config ARCH_SUPPORTS_UPROBES
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
config DEBUG_RODATA
|
|
||||||
def_bool y
|
|
||||||
|
|
||||||
config S390
|
config S390
|
||||||
def_bool y
|
def_bool y
|
||||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||||
|
@ -73,6 +70,8 @@ config S390
|
||||||
select ARCH_HAS_GIGANTIC_PAGE
|
select ARCH_HAS_GIGANTIC_PAGE
|
||||||
select ARCH_HAS_KCOV
|
select ARCH_HAS_KCOV
|
||||||
select ARCH_HAS_SG_CHAIN
|
select ARCH_HAS_SG_CHAIN
|
||||||
|
select ARCH_HAS_STRICT_KERNEL_RWX
|
||||||
|
select ARCH_HAS_STRICT_MODULE_RWX
|
||||||
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
||||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||||
select ARCH_INLINE_READ_LOCK
|
select ARCH_INLINE_READ_LOCK
|
||||||
|
|
|
@ -17,7 +17,4 @@ config S390_PTDUMP
|
||||||
kernel.
|
kernel.
|
||||||
If in doubt, say "N"
|
If in doubt, say "N"
|
||||||
|
|
||||||
config DEBUG_SET_MODULE_RONX
|
|
||||||
def_bool y
|
|
||||||
depends on MODULES
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
|
@ -54,6 +54,8 @@ config X86
|
||||||
select ARCH_HAS_MMIO_FLUSH
|
select ARCH_HAS_MMIO_FLUSH
|
||||||
select ARCH_HAS_PMEM_API if X86_64
|
select ARCH_HAS_PMEM_API if X86_64
|
||||||
select ARCH_HAS_SG_CHAIN
|
select ARCH_HAS_SG_CHAIN
|
||||||
|
select ARCH_HAS_STRICT_KERNEL_RWX
|
||||||
|
select ARCH_HAS_STRICT_MODULE_RWX
|
||||||
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
||||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||||
select ARCH_MIGHT_HAVE_ACPI_PDC if ACPI
|
select ARCH_MIGHT_HAVE_ACPI_PDC if ACPI
|
||||||
|
@ -309,9 +311,6 @@ config ARCH_SUPPORTS_UPROBES
|
||||||
config FIX_EARLYCON_MEM
|
config FIX_EARLYCON_MEM
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
config DEBUG_RODATA
|
|
||||||
def_bool y
|
|
||||||
|
|
||||||
config PGTABLE_LEVELS
|
config PGTABLE_LEVELS
|
||||||
int
|
int
|
||||||
default 4 if X86_64
|
default 4 if X86_64
|
||||||
|
|
|
@ -109,17 +109,6 @@ config DEBUG_WX
|
||||||
|
|
||||||
If in doubt, say "Y".
|
If in doubt, say "Y".
|
||||||
|
|
||||||
config DEBUG_SET_MODULE_RONX
|
|
||||||
bool "Set loadable kernel module data as NX and text as RO"
|
|
||||||
depends on MODULES
|
|
||||||
---help---
|
|
||||||
This option helps catch unintended modifications to loadable
|
|
||||||
kernel module's text and read-only data. It also prevents execution
|
|
||||||
of module data. Such protection may interfere with run-time code
|
|
||||||
patching and dynamic kernel tracing - and they might also protect
|
|
||||||
against certain classes of kernel exploits.
|
|
||||||
If in doubt, say "N".
|
|
||||||
|
|
||||||
config DOUBLEFAULT
|
config DOUBLEFAULT
|
||||||
default y
|
default y
|
||||||
bool "Enable doublefault exception handler" if EXPERT
|
bool "Enable doublefault exception handler" if EXPERT
|
||||||
|
|
|
@ -545,7 +545,7 @@ static inline bool bpf_prog_was_classic(const struct bpf_prog *prog)
|
||||||
|
|
||||||
#define bpf_classic_proglen(fprog) (fprog->len * sizeof(fprog->filter[0]))
|
#define bpf_classic_proglen(fprog) (fprog->len * sizeof(fprog->filter[0]))
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_SET_MODULE_RONX
|
#ifdef CONFIG_STRICT_MODULE_RWX
|
||||||
static inline void bpf_prog_lock_ro(struct bpf_prog *fp)
|
static inline void bpf_prog_lock_ro(struct bpf_prog *fp)
|
||||||
{
|
{
|
||||||
set_memory_ro((unsigned long)fp, fp->pages);
|
set_memory_ro((unsigned long)fp, fp->pages);
|
||||||
|
@ -563,7 +563,7 @@ static inline void bpf_prog_lock_ro(struct bpf_prog *fp)
|
||||||
static inline void bpf_prog_unlock_ro(struct bpf_prog *fp)
|
static inline void bpf_prog_unlock_ro(struct bpf_prog *fp)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_DEBUG_SET_MODULE_RONX */
|
#endif /* CONFIG_STRICT_MODULE_RWX */
|
||||||
|
|
||||||
int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap);
|
int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap);
|
||||||
static inline int sk_filter(struct sock *sk, struct sk_buff *skb)
|
static inline int sk_filter(struct sock *sk, struct sk_buff *skb)
|
||||||
|
|
|
@ -126,10 +126,10 @@ void prepare_namespace(void);
|
||||||
void __init load_default_modules(void);
|
void __init load_default_modules(void);
|
||||||
int __init init_rootfs(void);
|
int __init init_rootfs(void);
|
||||||
|
|
||||||
#if defined(CONFIG_DEBUG_RODATA) || defined(CONFIG_DEBUG_SET_MODULE_RONX)
|
#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
|
||||||
extern bool rodata_enabled;
|
extern bool rodata_enabled;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
void mark_rodata_ro(void);
|
void mark_rodata_ro(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -763,7 +763,7 @@ extern int module_sysfs_initialized;
|
||||||
|
|
||||||
#define __MODULE_STRING(x) __stringify(x)
|
#define __MODULE_STRING(x) __stringify(x)
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_SET_MODULE_RONX
|
#ifdef CONFIG_STRICT_MODULE_RWX
|
||||||
extern void set_all_modules_text_rw(void);
|
extern void set_all_modules_text_rw(void);
|
||||||
extern void set_all_modules_text_ro(void);
|
extern void set_all_modules_text_ro(void);
|
||||||
extern void module_enable_ro(const struct module *mod, bool after_init);
|
extern void module_enable_ro(const struct module *mod, bool after_init);
|
||||||
|
|
|
@ -924,7 +924,7 @@ static int try_to_run_init_process(const char *init_filename)
|
||||||
|
|
||||||
static noinline void __init kernel_init_freeable(void);
|
static noinline void __init kernel_init_freeable(void);
|
||||||
|
|
||||||
#if defined(CONFIG_DEBUG_RODATA) || defined(CONFIG_DEBUG_SET_MODULE_RONX)
|
#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
|
||||||
bool rodata_enabled __ro_after_init = true;
|
bool rodata_enabled __ro_after_init = true;
|
||||||
static int __init set_debug_rodata(char *str)
|
static int __init set_debug_rodata(char *str)
|
||||||
{
|
{
|
||||||
|
@ -933,7 +933,7 @@ static int __init set_debug_rodata(char *str)
|
||||||
__setup("rodata=", set_debug_rodata);
|
__setup("rodata=", set_debug_rodata);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
static void mark_readonly(void)
|
static void mark_readonly(void)
|
||||||
{
|
{
|
||||||
if (rodata_enabled)
|
if (rodata_enabled)
|
||||||
|
|
|
@ -11,7 +11,7 @@ CONFIG_BLK_DEV_LOOP=y
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||||
CONFIG_COMPACTION=y
|
CONFIG_COMPACTION=y
|
||||||
CONFIG_DEBUG_RODATA=y
|
CONFIG_STRICT_KERNEL_RWX=y
|
||||||
CONFIG_DM_CRYPT=y
|
CONFIG_DM_CRYPT=y
|
||||||
CONFIG_DM_UEVENT=y
|
CONFIG_DM_UEVENT=y
|
||||||
CONFIG_DM_VERITY=y
|
CONFIG_DM_VERITY=y
|
||||||
|
|
|
@ -76,9 +76,9 @@
|
||||||
/*
|
/*
|
||||||
* Modules' sections will be aligned on page boundaries
|
* Modules' sections will be aligned on page boundaries
|
||||||
* to ensure complete separation of code and data, but
|
* to ensure complete separation of code and data, but
|
||||||
* only when CONFIG_DEBUG_SET_MODULE_RONX=y
|
* only when CONFIG_STRICT_MODULE_RWX=y
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_DEBUG_SET_MODULE_RONX
|
#ifdef CONFIG_STRICT_MODULE_RWX
|
||||||
# define debug_align(X) ALIGN(X, PAGE_SIZE)
|
# define debug_align(X) ALIGN(X, PAGE_SIZE)
|
||||||
#else
|
#else
|
||||||
# define debug_align(X) (X)
|
# define debug_align(X) (X)
|
||||||
|
@ -1846,7 +1846,7 @@ static void mod_sysfs_teardown(struct module *mod)
|
||||||
mod_sysfs_fini(mod);
|
mod_sysfs_fini(mod);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_SET_MODULE_RONX
|
#ifdef CONFIG_STRICT_MODULE_RWX
|
||||||
/*
|
/*
|
||||||
* LKM RO/NX protection: protect module's text/ro-data
|
* LKM RO/NX protection: protect module's text/ro-data
|
||||||
* from modification and any data from execution.
|
* from modification and any data from execution.
|
||||||
|
|
|
@ -1156,7 +1156,7 @@ static int __init hibernate_setup(char *str)
|
||||||
} else if (!strncmp(str, "no", 2)) {
|
} else if (!strncmp(str, "no", 2)) {
|
||||||
noresume = 1;
|
noresume = 1;
|
||||||
nohibernate = 1;
|
nohibernate = 1;
|
||||||
} else if (IS_ENABLED(CONFIG_DEBUG_RODATA)
|
} else if (IS_ENABLED(CONFIG_STRICT_KERNEL_RWX)
|
||||||
&& !strncmp(str, "protect_image", 13)) {
|
&& !strncmp(str, "protect_image", 13)) {
|
||||||
enable_restore_image_protection();
|
enable_restore_image_protection();
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,12 +61,12 @@ extern int hibernation_snapshot(int platform_mode);
|
||||||
extern int hibernation_restore(int platform_mode);
|
extern int hibernation_restore(int platform_mode);
|
||||||
extern int hibernation_platform_enter(void);
|
extern int hibernation_platform_enter(void);
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
/* kernel/power/snapshot.c */
|
/* kernel/power/snapshot.c */
|
||||||
extern void enable_restore_image_protection(void);
|
extern void enable_restore_image_protection(void);
|
||||||
#else
|
#else
|
||||||
static inline void enable_restore_image_protection(void) {}
|
static inline void enable_restore_image_protection(void) {}
|
||||||
#endif /* CONFIG_DEBUG_RODATA */
|
#endif /* CONFIG_STRICT_KERNEL_RWX */
|
||||||
|
|
||||||
#else /* !CONFIG_HIBERNATION */
|
#else /* !CONFIG_HIBERNATION */
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
|
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RODATA
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
static bool hibernate_restore_protection;
|
static bool hibernate_restore_protection;
|
||||||
static bool hibernate_restore_protection_active;
|
static bool hibernate_restore_protection_active;
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ static inline void hibernate_restore_protection_begin(void) {}
|
||||||
static inline void hibernate_restore_protection_end(void) {}
|
static inline void hibernate_restore_protection_end(void) {}
|
||||||
static inline void hibernate_restore_protect_page(void *page_address) {}
|
static inline void hibernate_restore_protect_page(void *page_address) {}
|
||||||
static inline void hibernate_restore_unprotect_page(void *page_address) {}
|
static inline void hibernate_restore_unprotect_page(void *page_address) {}
|
||||||
#endif /* CONFIG_DEBUG_RODATA */
|
#endif /* CONFIG_STRICT_KERNEL_RWX */
|
||||||
|
|
||||||
static int swsusp_page_is_free(struct page *);
|
static int swsusp_page_is_free(struct page *);
|
||||||
static void swsusp_set_page_forbidden(struct page *);
|
static void swsusp_set_page_forbidden(struct page *);
|
||||||
|
|
Loading…
Add table
Reference in a new issue