linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] x86: make IDT read-only
@ 2013-04-08 22:43 Kees Cook
  2013-04-08 22:47 ` H. Peter Anvin
                   ` (2 more replies)
  0 siblings, 3 replies; 32+ messages in thread
From: Kees Cook @ 2013-04-08 22:43 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Thomas Gleixner, H. Peter Anvin, x86,
	Konrad Rzeszutek Wilk, Jeremy Fitzhardinge, Kees Cook,
	Marcelo Tosatti, Alex Shi, Borislav Petkov, Alexander Duyck,
	Frederic Weisbecker, Steven Rostedt, Paul E. McKenney, xen-devel,
	virtualization, kernel-hardening, Dan Rosenberg, Julien Tinnes,
	Will Drewry, Eric Northup

This makes the IDT unconditionally read-only. This primarily removes
the IDT from being a target for arbitrary memory write attacks. It has
an added benefit of also not leaking (via the "sidt" instruction) the
kernel base offset, if it has been relocated.

Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: Eric Northup <digitaleric@google.com>
---
 arch/x86/include/asm/fixmap.h |    4 +---
 arch/x86/kernel/cpu/intel.c   |   15 ---------------
 arch/x86/kernel/traps.c       |    8 ++++++++
 arch/x86/xen/mmu.c            |    4 +---
 4 files changed, 10 insertions(+), 21 deletions(-)

diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h
index a09c285..51b9e32 100644
--- a/arch/x86/include/asm/fixmap.h
+++ b/arch/x86/include/asm/fixmap.h
@@ -104,9 +104,7 @@ enum fixed_addresses {
 	FIX_LI_PCIA,	/* Lithium PCI Bridge A */
 	FIX_LI_PCIB,	/* Lithium PCI Bridge B */
 #endif
-#ifdef CONFIG_X86_F00F_BUG
-	FIX_F00F_IDT,	/* Virtual mapping for IDT */
-#endif
+	FIX_RO_IDT,	/* Virtual mapping for read-only IDT */
 #ifdef CONFIG_X86_CYCLONE_TIMER
 	FIX_CYCLONE_TIMER, /*cyclone timer register*/
 #endif
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 1905ce9..76148a3 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -164,20 +164,6 @@ int __cpuinit ppro_with_ram_bug(void)
 	return 0;
 }
 
-#ifdef CONFIG_X86_F00F_BUG
-static void __cpuinit trap_init_f00f_bug(void)
-{
-	__set_fixmap(FIX_F00F_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO);
-
-	/*
-	 * Update the IDT descriptor and reload the IDT so that
-	 * it uses the read-only mapped virtual address.
-	 */
-	idt_descr.address = fix_to_virt(FIX_F00F_IDT);
-	load_idt(&idt_descr);
-}
-#endif
-
 static void __cpuinit intel_smp_check(struct cpuinfo_x86 *c)
 {
 	/* calling is from identify_secondary_cpu() ? */
@@ -215,7 +201,6 @@ static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c)
 
 		c->f00f_bug = 1;
 		if (!f00f_workaround_enabled) {
-			trap_init_f00f_bug();
 			printk(KERN_NOTICE "Intel Pentium with F0 0F bug - workaround enabled.\n");
 			f00f_workaround_enabled = 1;
 		}
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 68bda7a..a2a9b78 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -753,6 +753,14 @@ void __init trap_init(void)
 #endif
 
 	/*
+	 * Set the IDT descriptor to a fixed read-only location, so that the
+	 * "sidt" instruction will not leak the location of the kernel, and
+	 * to defend the IDT against arbitrary memory write vulnerabilities.
+	 * It will be reloaded in cpu_init() */
+	__set_fixmap(FIX_RO_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO);
+	idt_descr.address = fix_to_virt(FIX_RO_IDT);
+
+	/*
 	 * Should be a barrier for any external CPU state:
 	 */
 	cpu_init();
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index 6afbb2c..8bc4dec 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -2039,9 +2039,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
 
 	switch (idx) {
 	case FIX_BTMAP_END ... FIX_BTMAP_BEGIN:
-#ifdef CONFIG_X86_F00F_BUG
-	case FIX_F00F_IDT:
-#endif
+	case FIX_RO_IDT:
 #ifdef CONFIG_X86_32
 	case FIX_WP_TEST:
 	case FIX_VDSO:
-- 
1.7.9.5


-- 
Kees Cook
Chrome OS Security

^ permalink raw reply related	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2013-04-10 18:33 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-04-08 22:43 [PATCH] x86: make IDT read-only Kees Cook
2013-04-08 22:47 ` H. Peter Anvin
2013-04-08 22:55   ` Kees Cook
2013-04-08 22:48 ` H. Peter Anvin
2013-04-09  9:23   ` Thomas Gleixner
2013-04-09 18:22     ` [kernel-hardening] " Kees Cook
2013-04-09 18:26       ` H. Peter Anvin
2013-04-09 18:31         ` Kees Cook
2013-04-09 18:39           ` H. Peter Anvin
2013-04-09 18:46             ` Kees Cook
2013-04-09 18:50               ` H. Peter Anvin
2013-04-09 18:53                 ` Kees Cook
2013-04-09 18:54               ` Eric Northup
2013-04-09 18:59                 ` H. Peter Anvin
2013-04-10  0:43                 ` Readonly GDT H. Peter Anvin
2013-04-10  0:53                   ` Steven Rostedt
2013-04-10  0:58                     ` H. Peter Anvin
2013-04-10  9:42                   ` [Xen-devel] " Jan Beulich
2013-04-10 14:16                     ` H. Peter Anvin
2013-04-10 18:28                     ` H. Peter Anvin
2013-04-10  9:41               ` [kernel-hardening] Re: [PATCH] x86: make IDT read-only Ingo Molnar
2013-04-10  0:03       ` H. Peter Anvin
2013-04-10  9:52         ` Ingo Molnar
2013-04-09  9:45   ` Eric W. Biederman
2013-04-10  9:57     ` Ingo Molnar
2013-04-10 10:40       ` Eric W. Biederman
2013-04-10 16:31         ` Eric Northup
2013-04-10 16:48           ` H. Peter Anvin
2013-04-08 22:56 ` Maciej W. Rozycki
2013-04-08 23:00   ` Kees Cook
2013-04-08 23:05   ` Kees Cook
2013-04-08 23:42     ` Maciej W. Rozycki

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).