Received: by 10.213.65.68 with SMTP id h4csp39217imn; Mon, 19 Mar 2018 18:49:50 -0700 (PDT) X-Google-Smtp-Source: AG47ELvtL8QWlLu60Cdq1L74HD6IEieyZU/Mim7YxZbokNmbzODK9TEGwL2NJfj5V2x0TK8jBYVH X-Received: by 10.167.128.2 with SMTP id j2mr12080426pfi.179.1521510590142; Mon, 19 Mar 2018 18:49:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521510590; cv=none; d=google.com; s=arc-20160816; b=ECNx7qFdGzmJM75YDVHChgFoCnne36rpjsIfZDZzE5JG+dll1Zjcbi/4T/enrIJ1Hr 2vt1IoA3m2PBdyl0IzEqt5bk3nbi9322mCa7HpLLGWKWe1Ti0whawyOtSIdtfYGzbTB+ vnc1SSxAHH7ZYMrwRU6QcNa0un7gZBEy7CSyXsaurSB4ZS7TVViuNUZMdeUYyvKbp9Iw BH1QDH6BUs+1r+AjgVp2mrVw5g4BJl5UvMNhbJCzrybYQJtTeQ31N5Y21EtYT2uueZSH XuUnueQCD2pjx3kStYxo6lx2ZPYQfdb5oK/IYsz6J+McqRIgV+kkeCNMvAdydJD7ANpm 3tNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=NB1RTFjIlQ8wmbh3lBvu0FufAsUiwKcYTVkEIU8Oj4w=; b=wKtMxZ93fZ+oCiAwEyGxGPibAhVt9FMfh5NWYs6Iwo13aRVe4+FXXJPIokftbDRs6r VGCYKtuR0h9aFu6lwkpwgpJsfUThi+7/aQWAAJafC0baEUpaN+N9C2OIBPvsFmtmH4vO TreW3/CU8TtAr2hrHY/lSzwWJPjeBpHykyZyaD2gIwCxVtSToQH5bU0qlHnDgz4uv9oR NbrHpKgNmwoaCuyXESyWCAe6oV3zRTMo3T9NCxh/sS2lCXWDv8lwu8aBEzu+BCnAzcWm T0+PGaL5iArWeseIGI5faHRBH+JiPC9kQIAvE9SVqqHt/HMzSsD0eqJtpzthho1uW5k0 Ed4Q== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a4-v6si561302plm.660.2018.03.19.18.49.36; Mon, 19 Mar 2018 18:49:50 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S971229AbeCSUMC (ORCPT + 99 others); Mon, 19 Mar 2018 16:12:02 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:45240 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030782AbeCSSQl (ORCPT ); Mon, 19 Mar 2018 14:16:41 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id CC0D01232; Mon, 19 Mar 2018 18:16:40 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Andrey Ryabinin , Masami Hiramatsu , Ananth N Mavinakayanahalli , Anil S Keshavamurthy , Borislav Petkov , Brian Gerst , "David S . Miller" , Denys Vlasenko , "H. Peter Anvin" , Josh Poimboeuf , Linus Torvalds , Peter Zijlstra , Thomas Gleixner , Ye Xiaolong , Ingo Molnar , Sasha Levin Subject: [PATCH 4.4 076/134] kprobes/x86: Set kprobes pages read-only Date: Mon, 19 Mar 2018 19:05:59 +0100 Message-Id: <20180319171900.247219741@linuxfoundation.org> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180319171849.024066323@linuxfoundation.org> References: <20180319171849.024066323@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.4-stable review patch. If anyone has any objections, please let me know. ------------------ From: Masami Hiramatsu [ Upstream commit d0381c81c2f782fa2131178d11e0cfb23d50d631 ] Set the pages which is used for kprobes' singlestep buffer and optprobe's trampoline instruction buffer to readonly. This can prevent unexpected (or unintended) instruction modification. This also passes rodata_test as below. Without this patch, rodata_test shows a warning: WARNING: CPU: 0 PID: 1 at arch/x86/mm/dump_pagetables.c:235 note_page+0x7a9/0xa20 x86/mm: Found insecure W+X mapping at address ffffffffa0000000/0xffffffffa0000000 With this fix, no W+X pages are found: x86/mm: Checked W+X mappings: passed, no W+X pages found. rodata_test: all tests were successful Reported-by: Andrey Ryabinin Signed-off-by: Masami Hiramatsu Cc: Ananth N Mavinakayanahalli Cc: Anil S Keshavamurthy Cc: Borislav Petkov Cc: Brian Gerst Cc: David S . Miller Cc: Denys Vlasenko Cc: H. Peter Anvin Cc: Josh Poimboeuf Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Ye Xiaolong Link: http://lkml.kernel.org/r/149076375592.22469.14174394514338612247.stgit@devbox Signed-off-by: Ingo Molnar Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- arch/x86/kernel/kprobes/core.c | 4 ++++ arch/x86/kernel/kprobes/opt.c | 3 +++ 2 files changed, 7 insertions(+) --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c @@ -406,6 +406,8 @@ static int arch_copy_kprobe(struct kprob { int ret; + set_memory_rw((unsigned long)p->ainsn.insn & PAGE_MASK, 1); + /* Copy an instruction with recovering if other optprobe modifies it.*/ ret = __copy_instruction(p->ainsn.insn, p->addr); if (!ret) @@ -420,6 +422,8 @@ static int arch_copy_kprobe(struct kprob else p->ainsn.boostable = -1; + set_memory_ro((unsigned long)p->ainsn.insn & PAGE_MASK, 1); + /* Check whether the instruction modifies Interrupt Flag or not */ p->ainsn.if_modifier = is_IF_modifier(p->ainsn.insn); --- a/arch/x86/kernel/kprobes/opt.c +++ b/arch/x86/kernel/kprobes/opt.c @@ -370,6 +370,7 @@ int arch_prepare_optimized_kprobe(struct } buf = (u8 *)op->optinsn.insn; + set_memory_rw((unsigned long)buf & PAGE_MASK, 1); /* Copy instructions into the out-of-line buffer */ ret = copy_optimized_instructions(buf + TMPL_END_IDX, op->kp.addr); @@ -392,6 +393,8 @@ int arch_prepare_optimized_kprobe(struct synthesize_reljump(buf + TMPL_END_IDX + op->optinsn.size, (u8 *)op->kp.addr + op->optinsn.size); + set_memory_ro((unsigned long)buf & PAGE_MASK, 1); + flush_icache_range((unsigned long) buf, (unsigned long) buf + TMPL_END_IDX + op->optinsn.size + RELATIVEJUMP_SIZE);