Skip to content

Commit 97db577

Browse files
keesbroonie
authored andcommitted
mm/init: Add 'rodata=off' boot cmdline parameter to disable read-only kernel mappings
commit d2aa1acad22f1bdd0cfa67b3861800e392254454 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: H. Peter Anvin <hpa@zytor.com> Signed-off-by: Kees 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: Ingo Molnar <mingo@kernel.org> Signed-off-by: David Brown <david.brown@linaro.org> Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 5259625 commit 97db577

3 files changed

Lines changed: 28 additions & 7 deletions

File tree

Documentation/kernel-parameters.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3409,6 +3409,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
34093409

34103410
ro [KNL] Mount root device read-only on boot
34113411

3412+
rodata= [KNL]
3413+
on Mark read-only kernel memory as read-only (default).
3414+
off Leave read-only kernel memory writable for debugging.
3415+
34123416
root= [KNL] Root filesystem
34133417
See name_to_dev_t comment in init/do_mounts.c.
34143418

init/main.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,6 @@ static int kernel_init(void *);
9393
extern void init_IRQ(void);
9494
extern void fork_init(void);
9595
extern void radix_tree_init(void);
96-
#ifndef CONFIG_DEBUG_RODATA
97-
static inline void mark_rodata_ro(void) { }
98-
#endif
9996

10097
/*
10198
* Debug helper: via this flag we know that we are in 'early bootup code'
@@ -929,6 +926,28 @@ static int try_to_run_init_process(const char *init_filename)
929926

930927
static noinline void __init kernel_init_freeable(void);
931928

929+
#ifdef CONFIG_DEBUG_RODATA
930+
static bool rodata_enabled = true;
931+
static int __init set_debug_rodata(char *str)
932+
{
933+
return strtobool(str, &rodata_enabled);
934+
}
935+
__setup("rodata=", set_debug_rodata);
936+
937+
static void mark_readonly(void)
938+
{
939+
if (rodata_enabled)
940+
mark_rodata_ro();
941+
else
942+
pr_info("Kernel memory protection disabled.\n");
943+
}
944+
#else
945+
static inline void mark_readonly(void)
946+
{
947+
pr_warn("This architecture does not have kernel memory protection.\n");
948+
}
949+
#endif
950+
932951
static int __ref kernel_init(void *unused)
933952
{
934953
int ret;
@@ -937,7 +956,7 @@ static int __ref kernel_init(void *unused)
937956
/* need to finish all async __init code before freeing the memory */
938957
async_synchronize_full();
939958
free_initmem();
940-
mark_rodata_ro();
959+
mark_readonly();
941960
system_state = SYSTEM_RUNNING;
942961
numa_default_policy();
943962

kernel/debug/kdb/kdb_bp.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,11 @@ static int _kdb_bp_install(struct pt_regs *regs, kdb_bp_t *bp)
153153
} else {
154154
kdb_printf("%s: failed to set breakpoint at 0x%lx\n",
155155
__func__, bp->bp_addr);
156-
#ifdef CONFIG_DEBUG_RODATA
157156
if (!bp->bp_type) {
158157
kdb_printf("Software breakpoints are unavailable.\n"
159-
" Change the kernel CONFIG_DEBUG_RODATA=n\n"
158+
" Boot the kernel with rodata=off\n"
160159
" OR use hw breaks: help bph\n");
161160
}
162-
#endif
163161
return 1;
164162
}
165163
return 0;

0 commit comments

Comments
 (0)