Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp288241pxk; Wed, 2 Sep 2020 22:49:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw++knXqI7YVwJNSqUQSjNGM0r1PtiyDYCOLt4p1G3s+mPFXsIOhrlv7/nXb/nJAO4IRvSB X-Received: by 2002:a17:906:380d:: with SMTP id v13mr469972ejc.152.1599112142200; Wed, 02 Sep 2020 22:49:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599112142; cv=none; d=google.com; s=arc-20160816; b=QClI7WLctNXJz5U5E1eBJ2m2WztSd16z+GrtaqyXYPimXugIDHtgRpob2R4hjX7Ojs k8JvKINH9VIVqQgwaIyfcy7GaGWVQqoWgIvXcDi+m39z0M0fKNPq9bFCC4l4r9XPFopb 5ZjAKgbauOrRyozy4egrA1Q7qt7obXHdooA+KLdpVAEYwLoiz4Zry/W0FMTLGFphVC4n 9gr1gBQJSHfBd/c1Q3ea8qlWBLPdNe0njChcBUBHDNYMfJKL0fzuMK9VBjkIUSbmNvgJ V/CkMZPzaMxuI0cNNjSWXEAzcWbbuEUXe+yR/pMFIcudfoyvYR3g3eoia/JYmQ8YXBe7 AXug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:content-disposition :mime-version:message-id:subject:cc:to:from:date; bh=sN5EN/oGwdo511cs7tSVEWXi4Tpc97Crb5PvPjwyXA4=; b=in4mPebtonwypNy7OF7zNwdO5HCZ8N1tbWAr8YPGESjVQNF9nbWlIwDWTDZIZaeieR wTWgQYDYvcncxM0f8nbpw8QBer/5l4uMe/eaYvEB4OvB3htfh1p6tOIuN38mSRohOARJ wYYGWDU0qDUrBCu5kRff9hnat1xlLNElkaYKDPTFrh8Q/Ch1zkjvWp0DpfNaE4xVyksO hY2OMK74pZzpLXTR4QJG3IdcaYkZrhWYRP9twkTtzF+crrND4qOYf3gfeuSQm9VZbMnr 0UjMHIc3cJCwmcxeGrmeBZ5Wml0QjoNgZ/jlSVb3RGYRARfPNP1civ8gk8CglhK4ZlRf tD3w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q9si1005307edt.122.2020.09.02.22.48.38; Wed, 02 Sep 2020 22:49:02 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726686AbgICFsI (ORCPT + 99 others); Thu, 3 Sep 2020 01:48:08 -0400 Received: from brightrain.aerifal.cx ([216.12.86.13]:49124 "EHLO brightrain.aerifal.cx" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726221AbgICFsH (ORCPT ); Thu, 3 Sep 2020 01:48:07 -0400 Date: Thu, 3 Sep 2020 01:48:07 -0400 From: Rich Felker To: linux-sh@vger.kernel.org Cc: John Paul Adrian Glaubitz , Michael Karcher , linux-kernel@vger.kernel.org, Yoshinori Sato Subject: [PATCH] sh: fix syscall tracing Message-ID: <20200903054803.GX3265@brightrain.aerifal.cx> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Addition of SECCOMP_FILTER exposed a longstanding bug in do_syscall_trace_enter, whereby r0 (the 5th argument register) was mistakenly used where r3 (syscall_nr) was intended. By overwriting r0 rather than r3 with -1 when attempting to block a syscall, the existing code would instead have caused the syscall to execute with an argument clobbered. Commit 0bb605c2c7f2b4b3 then introduced skipping of the syscall when do_syscall_trace_enter returns -1, so that the return value set by seccomp filters would not be clobbered by -ENOSYS. This eliminated the clobbering of the 5th argument register, but instead caused syscalls made with a 5th argument of -1 to be misinterpreted as a request by do_syscall_trace_enter to suppress the syscall. Fixes: 0bb605c2c7f2b4b3 ("sh: Add SECCOMP_FILTER") Fixes: ab99c733ae73cce3 ("sh: Make syscall tracer use tracehook notifiers, add TIF_NOTIFY_RESUME.") Signed-off-by: Rich Felker --- arch/sh/kernel/entry-common.S | 1 - arch/sh/kernel/ptrace_32.c | 15 +++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index ad963104d22d..91ab2607a1ff 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S @@ -370,7 +370,6 @@ syscall_trace_entry: nop cmp/eq #-1, r0 bt syscall_exit - mov.l r0, @(OFF_R0,r15) ! Save return value ! Reload R0-R4 from kernel stack, where the ! parent may have modified them using ! ptrace(POKEUSR). (Note that R0-R2 are diff --git a/arch/sh/kernel/ptrace_32.c b/arch/sh/kernel/ptrace_32.c index b05bf92f9c32..5281685f6ad1 100644 --- a/arch/sh/kernel/ptrace_32.c +++ b/arch/sh/kernel/ptrace_32.c @@ -455,16 +455,11 @@ long arch_ptrace(struct task_struct *child, long request, asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) { - long ret = 0; - if (test_thread_flag(TIF_SYSCALL_TRACE) && - tracehook_report_syscall_entry(regs)) - /* - * Tracing decided this syscall should not happen. - * We'll return a bogus call number to get an ENOSYS - * error, but leave the original number in regs->regs[0]. - */ - ret = -1L; + tracehook_report_syscall_entry(regs)) { + regs->regs[0] = -ENOSYS; + return -1; + } if (secure_computing() == -1) return -1; @@ -475,7 +470,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) audit_syscall_entry(regs->regs[3], regs->regs[4], regs->regs[5], regs->regs[6], regs->regs[7]); - return ret ?: regs->regs[0]; + return 0; } asmlinkage void do_syscall_trace_leave(struct pt_regs *regs) -- 2.21.0