Borislav Petkov 57949a
From: Eric Dumazet <edumazet@google.com>
Borislav Petkov 57949a
Date: Fri, 14 Aug 2020 11:16:17 -0700
Borislav Petkov 57949a
Subject: x86/fsgsbase/64: Fix NULL deref in 86_fsgsbase_read_task
Borislav Petkov 57949a
Git-commit: 8ab49526b53d3172d1d8dd03a75c7d1f5bd21239
Borislav Petkov 57949a
Patch-mainline: v5.9-rc1
Borislav Petkov 57949a
References: bsc#1112178
Borislav Petkov 57949a
Borislav Petkov 57949a
syzbot found its way in 86_fsgsbase_read_task() and triggered this oops:
Borislav Petkov 57949a
Borislav Petkov 57949a
   KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
Borislav Petkov 57949a
   CPU: 0 PID: 6866 Comm: syz-executor262 Not tainted 5.8.0-syzkaller #0
Borislav Petkov 57949a
   RIP: 0010:x86_fsgsbase_read_task+0x16d/0x310 arch/x86/kernel/process_64.c:393
Borislav Petkov 57949a
   Call Trace:
Borislav Petkov 57949a
     putreg32+0x3ab/0x530 arch/x86/kernel/ptrace.c:876
Borislav Petkov 57949a
     genregs32_set arch/x86/kernel/ptrace.c:1026 [inline]
Borislav Petkov 57949a
     genregs32_set+0xa4/0x100 arch/x86/kernel/ptrace.c:1006
Borislav Petkov 57949a
     copy_regset_from_user include/linux/regset.h:326 [inline]
Borislav Petkov 57949a
     ia32_arch_ptrace arch/x86/kernel/ptrace.c:1061 [inline]
Borislav Petkov 57949a
     compat_arch_ptrace+0x36c/0xd90 arch/x86/kernel/ptrace.c:1198
Borislav Petkov 57949a
     __do_compat_sys_ptrace kernel/ptrace.c:1420 [inline]
Borislav Petkov 57949a
     __se_compat_sys_ptrace kernel/ptrace.c:1389 [inline]
Borislav Petkov 57949a
     __ia32_compat_sys_ptrace+0x220/0x2f0 kernel/ptrace.c:1389
Borislav Petkov 57949a
     do_syscall_32_irqs_on arch/x86/entry/common.c:84 [inline]
Borislav Petkov 57949a
     __do_fast_syscall_32+0x57/0x80 arch/x86/entry/common.c:126
Borislav Petkov 57949a
     do_fast_syscall_32+0x2f/0x70 arch/x86/entry/common.c:149
Borislav Petkov 57949a
     entry_SYSENTER_compat_after_hwframe+0x4d/0x5c
Borislav Petkov 57949a
Borislav Petkov 57949a
This can happen if ptrace() or sigreturn() pokes an LDT selector into FS
Borislav Petkov 57949a
or GS for a task with no LDT and something tries to read the base before
Borislav Petkov 57949a
a return to usermode notices the bad selector and fixes it.
Borislav Petkov 57949a
Borislav Petkov 57949a
The fix is to make sure ldt pointer is not NULL.
Borislav Petkov 57949a
Borislav Petkov 57949a
Fixes: 07e1d88adaae ("x86/fsgsbase/64: Fix ptrace() to read the FS/GS base accurately")
Borislav Petkov 57949a
Co-developed-by: Jann Horn <jannh@google.com>
Borislav Petkov 57949a
Signed-off-by: Eric Dumazet <edumazet@google.com>
Borislav Petkov 57949a
Reported-by: syzbot <syzkaller@googlegroups.com>
Borislav Petkov 57949a
Acked-by: Andy Lutomirski <luto@kernel.org>
Borislav Petkov 57949a
Cc: Chang S. Bae <chang.seok.bae@intel.com>
Borislav Petkov 57949a
Cc: Andy Lutomirski <luto@amacapital.net>
Borislav Petkov 57949a
Cc: Borislav Petkov <bp@alien8.de>
Borislav Petkov 57949a
Cc: Brian Gerst <brgerst@gmail.com>
Borislav Petkov 57949a
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Borislav Petkov 57949a
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Borislav Petkov 57949a
Cc: H. Peter Anvin <hpa@zytor.com>
Borislav Petkov 57949a
Cc: Markus T Metzger <markus.t.metzger@intel.com>
Borislav Petkov 57949a
Cc: Peter Zijlstra <peterz@infradead.org>
Borislav Petkov 57949a
Cc: Ravi Shankar <ravi.v.shankar@intel.com>
Borislav Petkov 57949a
Cc: Rik van Riel <riel@surriel.com>
Borislav Petkov 57949a
Cc: Thomas Gleixner <tglx@linutronix.de>
Borislav Petkov 57949a
Cc: Ingo Molnar <mingo@kernel.org>
Borislav Petkov 57949a
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Borislav Petkov 57949a
Acked-by: Borislav Petkov <bp@suse.de>
Borislav Petkov 57949a
---
Borislav Petkov 57949a
 arch/x86/kernel/process_64.c | 2 +-
Borislav Petkov 57949a
 1 file changed, 1 insertion(+), 1 deletion(-)
Borislav Petkov 57949a
Borislav Petkov 57949a
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
Borislav Petkov 57949a
index d6f946707270..9afefe325acb 100644
Borislav Petkov 57949a
--- a/arch/x86/kernel/process_64.c
Borislav Petkov 57949a
+++ b/arch/x86/kernel/process_64.c
Borislav Petkov 57949a
@@ -390,7 +390,7 @@ unsigned long x86_fsgsbase_read_task(struct task_struct *task,
Borislav Petkov 57949a
 		 */
Borislav Petkov 57949a
 		mutex_lock(&task->mm->context.lock);
Borislav Petkov 57949a
 		ldt = task->mm->context.ldt;
Borislav Petkov 57949a
-		if (unlikely(idx >= ldt->nr_entries))
Borislav Petkov 57949a
+		if (unlikely(!ldt || idx >= ldt->nr_entries))
Borislav Petkov 57949a
 			base = 0;
Borislav Petkov 57949a
 		else
Borislav Petkov 57949a
 			base = get_desc_base(ldt->entries + idx);
Borislav Petkov 57949a