Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp2140282ybt; Fri, 3 Jul 2020 01:42:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw8s1rGOUqdkL22G4IbugTcDGRqtwhZzFcorO39fVX9MMsRePzNGnrxZ4T7jgugG8RO2jhz X-Received: by 2002:a17:906:7c54:: with SMTP id g20mr31902230ejp.460.1593765762848; Fri, 03 Jul 2020 01:42:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593765762; cv=none; d=google.com; s=arc-20160816; b=a4dBdT3hvmMwFz4BRx4s0O7xoFcpkMYsyFGwaGY2tBKkCwcX2EWAcciuphn0ZX0y/G MhqILMdMey+TLwCCffTmkEDg6rQXmIJasBcrSqDv4/IGrICOSF1fs9QnPcGPHjt0/oP6 oSTPRuTU0VIjf/0BVGcn01HlCDQ4VBFKd6xL3MWReEr+CAgWkL8wbnUyj69Epld5puvp xYuuXCNfx1tK1ezmBdQR8uEg148yXB+NH1XYEkcUQeLzp9atMGIxiBHQKXXukR0FdTFi 4MldL3I3Mr5qAPX7p4+qMEM29T8i0B73KramsDrIOZ8TwGoiKjpStyoVZmqBt9Pr6ZOi FerA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=CoIwhcKKJslE3cYt/Ls/FYtmSNNXp5si/kaIAxr4fz0=; b=nKP8KUttRZW0lPuG1b4qHP7qPgStwrTFH3yEUBqfIxBfE41AFQT2hZU6WP18B+AG+/ e9xDGgNgrxFHyYja4wu9Tb1aKywfR7lVA6ejaA0hSKHs4WKu6yj8ydrWcOsHjorUNhzP cTc6cr8SF3Sw1keaH8qjQpYVvfyE7RyNKuLIvlm3NKgJnQMmRjWT0X+TsL87xXQj/gCc YQSfCdJjO9pAoYfqNWF5sL8m4br2MamLp0CSiCO+fh9aH5bo+K0NsE+52i8Z9TFKTjiV LVmuXXPl83YzNm5uK8pfGgN79sT8LpfYshyDCR1vYqKSXnjBIj11FHO/H28OBfqUZ3jp /I6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1odqj4HK; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l15si7083291eji.501.2020.07.03.01.42.19; Fri, 03 Jul 2020 01:42:42 -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; dkim=pass header.i=@kernel.org header.s=default header.b=1odqj4HK; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726343AbgGCIjU (ORCPT + 99 others); Fri, 3 Jul 2020 04:39:20 -0400 Received: from mail.kernel.org ([198.145.29.99]:53814 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725648AbgGCIjT (ORCPT ); Fri, 3 Jul 2020 04:39:19 -0400 Received: from willie-the-truck (236.31.169.217.in-addr.arpa [217.169.31.236]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 23E57206DF; Fri, 3 Jul 2020 08:39:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593765559; bh=MvXrb6r67qib7/+nzgg82KcxzQJ/w/+5fImFL7ixVXw=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=1odqj4HK1/iPAdyy6hPR85RJNmhvOSqeJj0AoSlxcxvwXLmgdDm4KVPy2NoOPuhKD ZfzXhNoNv9YqTrL8/QU9WZe35bgzjVj3yyuKx04MjDdx9j1JZh7EWr2MBiP4lo76LM ryzdngx7FCwDMwXW/NtAxhCxP0c+eklbSHDza558= Date: Fri, 3 Jul 2020 09:39:14 +0100 From: Will Deacon To: Keno Fischer Cc: Linux Kernel Mailing List , Oleg Nesterov , Kees Cook , Andy Lutomirski , Will Drewry Subject: Re: ptrace: seccomp: Return value when the call was already invalid Message-ID: <20200703083914.GA18516@willie-the-truck> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Keno, On Fri, May 22, 2020 at 09:01:01PM -0400, Keno Fischer wrote: > I'm seeing the following while porting a ptracer from > x86_64 to arm64 (cc'ing arm64 folks, but in this case > x86_64 is the odd one out, I think other archs would > be consistent with arm64). > > Consider userspace code like the following: > ``` > int ret = syscall(-10, 0); > assert(ret == -ENOSYS); > ``` > > (Never mind the fact that this is something userspace > shouldn't do, I saw this in our test suite that tests > corner cases where the ptracer shouldn't affect behavior). > > Now, if we have a seccomp filter that simply does > SECCOMP_RET_TRACE, and a ptracer that simply > does PTRACE_CONT Ok, so this means that we're _skipping_ the system call, right? > then the assert will fire/fail on arm64, but not on x86_64. It feels weird to me that skipping the system call has any effect on the tracee registers... > Interestingly, arm64 does do something different > if the syscall is -1 rather than -10, where early > in the ptrace stop it does. > ``` > /* set default errno for user-issued syscall(-1) */ > if (scno == NO_SYSCALL) > regs->regs[0] = -ENOSYS; ... so I think this should be fixed too. How about the diff below? Will --->8 diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 68b7f34a08f5..cb3f653c9688 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -1833,12 +1833,12 @@ int syscall_trace_enter(struct pt_regs *regs) if (flags & (_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE)) { tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER); if (!in_syscall(regs) || (flags & _TIF_SYSCALL_EMU)) - return -1; + return -ENOSYS; } /* Do the secure computing after ptrace; failures should be fast. */ if (secure_computing() == -1) - return -1; + return -ENOSYS; if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) trace_sys_enter(regs, regs->syscallno); @@ -1846,7 +1846,7 @@ int syscall_trace_enter(struct pt_regs *regs) audit_syscall_entry(regs->syscallno, regs->orig_x0, regs->regs[1], regs->regs[2], regs->regs[3]); - return regs->syscallno; + return 0; } void syscall_trace_exit(struct pt_regs *regs) diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c index 5f5b868292f5..a13661f44818 100644 --- a/arch/arm64/kernel/syscall.c +++ b/arch/arm64/kernel/syscall.c @@ -121,12 +121,10 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, user_exit(); if (has_syscall_work(flags)) { - /* set default errno for user-issued syscall(-1) */ - if (scno == NO_SYSCALL) - regs->regs[0] = -ENOSYS; - scno = syscall_trace_enter(regs); - if (scno == NO_SYSCALL) + if (syscall_trace_enter(regs)) goto trace_exit; + + scno = regs->syscallno; } invoke_syscall(regs, scno, sc_nr, syscall_table);