Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp7136imd; Fri, 2 Nov 2018 16:32:54 -0700 (PDT) X-Google-Smtp-Source: AJdET5capweXKRqkkAMD1ZiyobdoAnChbRoETUs+izytiv/fq7h/oQNEvyd7Xv6uAFfhkcTeaXvE X-Received: by 2002:a17:902:145:: with SMTP id 63-v6mr4036216plb.276.1541201574839; Fri, 02 Nov 2018 16:32:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1541201574; cv=none; d=google.com; s=arc-20160816; b=mj+B9Zou9jeVxzA9beCit19M7ZW9EXBq+iSQRJ49KH4kZHKPIS6hwp+EZM7xt2+SIf 8nxq2sVUsyptNjVXH0gpi7eGQEHAZ7h/KupqtiNRqSA6WREOJeufOsXLzYft1xXj8Etj VLCCwUuoZVanoDl4m6lf2BgL/dvxzzZeo96c3i9pYsjc9saddk/UzG3qMir8mS9v2LzO sp90hY7TgEBV6uiFbpcYalAt7SGd5TpuWC/xnuQLcYzaLTXNLvVC1sphciDeUP3sYG8l Ms2a5aiHDzjET1G8SNI2EOuqwYvbVZtIVm97of66OjtNmszG2pmTTTsiJVcCKKad1vku Zj0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from; bh=uenhStYmJ+dErnR3Ej3SFkT9xoLeJf/iBaIovNWNGNM=; b=bxN1HtDGLFg4nC3Rwv1Cof8R1DXxGzexsMdbL+lpsu0tJ3D7y/3/0S4+tP8pg08rer /c5c36MAAZuIjWLr6o30lH9gyh0WNwwaI0j5AA+8RE9vcI6Jx7gx/QpWFROrlLPUeQ6K BEC9StqCfzj7HTrZ9raUWA1ufSJGi1eBdrscO7QLCj9EvY4gkl5jvhcA8AoQ/y5Pw4kR yVPEnW3gQQugVLSTMRwMFpZNEJ9XHIHyS+Qd7IEqHvweI7z/4mXTESf6wCSEIXp7XbRY 7zKhJrj/4aTDWzA0WZeGGwMHFIF7qoqtSUD8Alq1DrNTquQXbDQGEty0CpIiD7cPn1BF bjJA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vmware.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u128-v6si18657167pfc.145.2018.11.02.16.32.40; Fri, 02 Nov 2018 16:32:54 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vmware.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728554AbeKCIk5 (ORCPT + 99 others); Sat, 3 Nov 2018 04:40:57 -0400 Received: from ex13-edg-ou-001.vmware.com ([208.91.0.189]:8611 "EHLO EX13-EDG-OU-001.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728485AbeKCIk4 (ORCPT ); Sat, 3 Nov 2018 04:40:56 -0400 Received: from sc9-mailhost2.vmware.com (10.113.161.72) by EX13-EDG-OU-001.vmware.com (10.113.208.155) with Microsoft SMTP Server id 15.0.1156.6; Fri, 2 Nov 2018 16:31:32 -0700 Received: from sc2-haas01-esx0118.eng.vmware.com (sc2-haas01-esx0118.eng.vmware.com [10.172.44.118]) by sc9-mailhost2.vmware.com (Postfix) with ESMTP id 7DBC1B14C8; Fri, 2 Nov 2018 19:31:42 -0400 (EDT) From: Nadav Amit To: Ingo Molnar CC: , , "H. Peter Anvin" , Thomas Gleixner , Borislav Petkov , Dave Hansen , Nadav Amit , Jiri Kosina , Andy Lutomirski , Masami Hiramatsu , Kees Cook , Peter Zijlstra Subject: [PATCH v3 0/7] x86/alternatives: text_poke() fixes Date: Fri, 2 Nov 2018 16:29:39 -0700 Message-ID: <20181102232946.98461-1-namit@vmware.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain Received-SPF: None (EX13-EDG-OU-001.vmware.com: namit@vmware.com does not designate permitted sender hosts) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch-set addresses some issues that were raised in a recent correspondence and might affect the security and the correctness of code patching. (Note that patching performance is not addressed by this patch-set). The main issue that the patches deal with is the fact that the fixmap PTEs that are used for patching are available for access from other cores and might be exploited. They are not even flushed from the TLB in remote cores, so the risk is even higher. Address this issue by introducing a temporary mm that is only used during patching. Unfortunately, due to init ordering, fixmap is still used during boot-time patching. Future patches can eliminate the need for it. To do so, we need to avoid using text_poke() before the poking-mm is initialized and instead use text_poke_early(). The second issue is the lockdep assertion that ensures the text_mutex is taken. It is actually not taken by kgdb. I did not find an easy solution, as mutex_trylock() should not be called from an IRQ context. Instead, remove the assertion. Finally, try to be more conservative and to map a single page, instead of two, when possible. This helps both security and performance. In addition, there is some cleanup of the patching code to make it more readable. v2->v3: - Remove the fallback path in text_poke() [peterZ] - poking_init() was broken due to the local variable poking_addr - Preallocate tables for the temporary-mm to avoid sleep-in-atomic - Prevent KASAN from yelling at text_poke() v1->v2: - Partial revert of 9222f606506c added to 1/6 [masami] - Added Masami's reviewed-by tag RFC->v1: - Added handling of error in get_locked_pte() - Remove lockdep assertion, clarify text_mutex use instead [masami] - Comment fix [peterz] - Removed remainders of text_poke return value [masami] - Use __weak for poking_init instead of macros [masami] - Simplify error handling in poking_init [masami] Cc: Jiri Kosina Cc: Andy Lutomirski Cc: Masami Hiramatsu Cc: Kees Cook Cc: Peter Zijlstra Andy Lutomirski (1): x86/mm: temporary mm struct Nadav Amit (6): Fix "x86/alternatives: Lockdep-enforce text_mutex in text_poke*()" x86/jump_label: Use text_poke_early() during early_init fork: provide a function for copying init_mm x86/alternatives: initializing temporary mm for patching x86/alternatives: use temporary mm for text poking x86/alternatives: remove text_poke() return value arch/x86/include/asm/fixmap.h | 2 - arch/x86/include/asm/mmu_context.h | 20 +++++ arch/x86/include/asm/pgtable.h | 3 + arch/x86/include/asm/text-patching.h | 4 +- arch/x86/kernel/alternative.c | 125 +++++++++++++++++++++------ arch/x86/kernel/jump_label.c | 8 +- arch/x86/mm/init_64.c | 39 +++++++++ include/linux/kernel.h | 1 + include/linux/sched/task.h | 1 + init/main.c | 7 ++ kernel/fork.c | 24 +++-- 11 files changed, 199 insertions(+), 35 deletions(-) -- 2.17.1