Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3046019imu; Wed, 7 Nov 2018 04:13:39 -0800 (PST) X-Google-Smtp-Source: AJdET5cGTIVXEJDxr0Fz1jCgv+xIvXskXH+DqbqMaDkZpiC8xblmOLeY5qeC1iLe936uzhERrWXI X-Received: by 2002:a63:3c44:: with SMTP id i4mr1328043pgn.286.1541592819020; Wed, 07 Nov 2018 04:13:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541592818; cv=none; d=google.com; s=arc-20160816; b=ABnY1UqpdAWsaebec8Rqsl9udBo89WpKuNdtGXz2e+w7xfkVzQKqah73mV/tRchan1 k/rnvi3poFLCT2WqUxdaIwjGCo4lujn88BILJSNOocuEzdjuIw1JJbC8ddiokxbHFnMj TedtA2LNqgv7EnzP2jybDyUaotco0JpyLSuzfCQKzvllApv68SuEamX/hBV0zY+LfIOl QYkvrxJOJi9pNRflwpFPzbuc7c7SnOK5xD8deFWKOsxB4IrRs3GZMTH6nrjTHkYjT2h8 IQMDLU277uUjru/fiH0IjNY02nRChLVd9H/oKjaDuW5yXoHAG9Pm68KNCZCB/3SP5UtC tr1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=aB5qDRcyCc9OVs3+Q+fAkU1oZH440fKJw2E42sj/8bM=; b=dZ10zI4Py1hSG1g47KDz58ndOOY2wAISpbw4Bpq9RCT/L/42SkcnqR0j1bSUN0dV4k BWR/8MUfixQoy1v1WyYNLLXdGUSFeaBMRPC/OAMWykETZVUc6DWlfkMUvCId3oQ9HilQ KULhkrLFQpbduLFkQLGEfeo7pkLN2eg3cFvsMfRNLt/x7w7h7gRDeapNcnwGXKia5HEN s+os/B2xmaqq1vyOJfW8KefkPNPm0zoAlaE+8Hl5I0030nB2elPl/Z6D8G7zYa/D+ayv VIZp1DozAq5iDh4fFMwrhWs1Hn9YpaJM/8kBSeecLIwDxICow80KGWJ1XjfkrVAjj2Mp d21Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@synopsys.com header.s=mail header.b=eUjygNn9; 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=pass (p=NONE sp=NONE dis=NONE) header.from=synopsys.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 88-v6si496326plb.57.2018.11.07.04.13.23; Wed, 07 Nov 2018 04:13:38 -0800 (PST) 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; dkim=pass header.i=@synopsys.com header.s=mail header.b=eUjygNn9; 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=pass (p=NONE sp=NONE dis=NONE) header.from=synopsys.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726825AbeKGVnE (ORCPT + 99 others); Wed, 7 Nov 2018 16:43:04 -0500 Received: from smtprelay.synopsys.com ([198.182.47.9]:39538 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726392AbeKGVnE (ORCPT ); Wed, 7 Nov 2018 16:43:04 -0500 Received: from mailhost.synopsys.com (mailhost3.synopsys.com [10.12.238.238]) by smtprelay.synopsys.com (Postfix) with ESMTP id 6AD6624E08C0; Wed, 7 Nov 2018 04:12:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=synopsys.com; s=mail; t=1541592777; bh=yR843m6vL0pXhhayWnDu07VSpOEDMWpoF12HcchvL1k=; h=From:To:Cc:Subject:Date:From; b=eUjygNn9uBfN4I07ttFrd2Z+hpRhLSyfSygkcREKcfamFZeVoUMdiasE4IkYeHys7 Ya/D9LNLzyQRG67ra+VC3rysO6E+wFE+UgfKDqNLgBDAX22JrHPEO91QMlSnIso2li L5Qg7b7k3Nz1nzpPd1cEDP4plP0p1spDP29CeEFTXSe5jMS7LcZvMwDwOfOCOG1Wvr qVQ9HMy6SDQjdyh3taqjKooEtP56AQI5IKnpdQk/hnnLWn1kZVWpDYu1DXFFjZm7eZ qGEKYRBPX4K6tFV9DMrBETHOehkzk4+Pe2Zq+Q0ejz5aIfYl7un8ON4q8ZAJbL+/iO 4xuK+3ldB0MBw== Received: from paltsev-e7480.internal.synopsys.com (paltsev-e7480.internal.synopsys.com [10.121.3.66]) by mailhost.synopsys.com (Postfix) with ESMTP id A9E163AB5; Wed, 7 Nov 2018 04:12:53 -0800 (PST) From: Eugeniy Paltsev To: linux-snps-arc@lists.infradead.org, Vineet Gupta Cc: linux-kernel@vger.kernel.org, Alexey Brodkin , "Eric W . Biederman" , linux-arch@vger.kernel.org, Eugeniy Paltsev Subject: [PATCH] ARC: MM: fix UB and kernel resourse leak in do_page_fault Date: Wed, 7 Nov 2018 15:12:49 +0300 Message-Id: <20181107121249.6657-1-Eugeniy.Paltsev@synopsys.com> X-Mailer: git-send-email 2.14.5 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit 15773ae938d8 ("signal/arc: Use force_sig_fault where appropriate") adds undefined behaviour and kernel resource leak to userspace in ARC do_page_fault() implementation. This happens because we don't initialize si_code variable after we switch to force_sig_fault using. si_code (as a part of siginfo_t structure) was previously initialized by clear_siginfo(&info) call which was removed. Undefined behaviour path: -------------------->8--------------------------- }}} a/arch/arc/mm/fault.c !! -67,6 +67,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) struct task_struct *tsk = current; struct mm_struct *mm = tsk->mm; + /// >>> si_code - uninitialized int si_code; int ret; vm_fault_t fault; int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */ !! -81,8 +82,10 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) * only copy the information from the master page table, * nothing more. */ + /// >>> take true branch if (address >= VMALLOC_START) { ret = handle_kernel_vaddr_fault(address); + /// >>> take true branch if (unlikely(ret)) + /// >>> jump to label "bad_area_nosemaphore" goto bad_area_nosemaphore; else !! -193,10 +196,13 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) bad_area: up_read(&mm->mmap_sem); + /// >>> reach label "bad_area_nosemaphore" bad_area_nosemaphore: /* User mode accesses just cause a SIGSEGV */ + /// >>> take true branch if (user_mode(regs)) { tsk->thread.fault_address = address; + /// >>> Ooops: + /// >>> use uninitialized value "si_code" + /// >>> when calling "force_sig_fault" force_sig_fault(SIGSEGV, si_code, (void __user *)address, tsk); return; } -------------------->8--------------------------- Fixes: 15773ae938d8 ("signal/arc: Use force_sig_fault where appropriate") Signed-off-by: Eugeniy Paltsev --- arch/arc/mm/fault.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c index c9da6102eb4f..e2d9fc3fea01 100644 --- a/arch/arc/mm/fault.c +++ b/arch/arc/mm/fault.c @@ -66,7 +66,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) struct vm_area_struct *vma = NULL; struct task_struct *tsk = current; struct mm_struct *mm = tsk->mm; - int si_code; + int si_code = 0; int ret; vm_fault_t fault; int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */ -- 2.14.5