All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] arm64: syscall: Ensure saved x0 is kept in-sync with tracer updates
@ 2026-07-14 14:35 Will Deacon
  2026-07-15 11:39 ` Jinjie Ruan
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Will Deacon @ 2026-07-14 14:35 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Will Deacon, Kees Cook, Jinjie Ruan, Mark Rutland,
	Yiqi Sun, Catalin Marinas

When seccomp support was originally added to arm64 in a1ae65b21941
("arm64: add seccomp support"), seccomp was erroneously called _before_
the ptrace syscall-enter-stop and therefore the tracer could trivially
manipulate the syscall register state after the seccomp check had
passed. This was subsequently fixed in a5cd110cb836 ("arm64/ptrace: run
seccomp after ptrace") by moving the seccomp check after the tracer has
run. Unfortunately, a decade later, that fix has been reported to be
incomplete.

On arm64, both the first argument to a syscall and its eventual return
value are allocated to register x0. In order to facilitate syscall
restarting and querying of syscall arguments on the syscall exit path,
the original value of x0 is stashed in 'struct pt_regs::orig_x0' early
during the syscall entry path and is returned for the first argument by
syscall_get_arguments(). Unlike 32-bit Arm, this stashed value is not
directly exposed via ptrace() and so changes to register x0 made by the
tracer on a syscall-enter-stop are not reflected in 'orig_x0'. This
means that seccomp and audit can observe a stale value for the register
compared to the argument that will be observed by the actual syscall.

Re-sync 'orig_x0' from x0 on the syscall entry path following a
potential ptrace stop (i.e. PTRACE_EVENTMSG_SYSCALL_ENTRY or
SECCOMP_RET_TRACE). This behaviour is limited to native tasks (because
compat tasks expose 'orig_r0' to ptrace) where the syscall is not being
skipped (because x0 is updated to hold the return value of -ENOSYS in
that case).

Cc: Kees Cook <kees@kernel.org>
Cc: Jinjie Ruan <ruanjinjie@huawei.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Reported-by: Yiqi Sun <sunyiqixm@gmail.com>
Link: https://lore.kernel.org/all/20260529065444.1336608-1-sunyiqixm@gmail.com/
Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
Fixes: a5cd110cb836 ("arm64/ptrace: run seccomp after ptrace")
Signed-off-by: Will Deacon <will@kernel.org>
---
 arch/arm64/kernel/ptrace.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c
index 4d08598e2891..57e8c6714d44 100644
--- a/arch/arm64/kernel/ptrace.c
+++ b/arch/arm64/kernel/ptrace.c
@@ -2408,6 +2408,21 @@ static void report_syscall_exit(struct pt_regs *regs)
 	}
 }
 
+static void update_syscall_orig_x0_after_ptrace(struct pt_regs *regs)
+{
+	/*
+	 * Keep orig_x0 authoritative so that seccomp (via
+	 * syscall_get_arguments()), audit and the restart path all see the same
+	 * first argument the syscall is dispatched with, even if it has been
+	 * updated by a tracer. Skip this for NO_SYSCALL (set either by the user
+	 * or the tracer), as regs[0] holds the return value (see the comment in
+	 * el0_svc_common()) and can be unwound using syscall_rollback().
+	 * For compat tasks, orig_r0 is provided directly through GPR index 17.
+	 */
+	if (!is_compat_task() && regs->syscallno != NO_SYSCALL)
+		regs->orig_x0 = regs->regs[0];
+}
+
 int syscall_trace_enter(struct pt_regs *regs)
 {
 	unsigned long flags = read_thread_flags();
@@ -2417,12 +2432,21 @@ int syscall_trace_enter(struct pt_regs *regs)
 		ret = report_syscall_entry(regs);
 		if (ret || (flags & _TIF_SYSCALL_EMU))
 			return NO_SYSCALL;
+
+		/*
+		 * Ensure ptrace changes to x0 are visible to seccomp
+		 * ptrace exits (SECCOMP_RET_TRACE).
+		 */
+		update_syscall_orig_x0_after_ptrace(regs);
 	}
 
 	/* Do the secure computing after ptrace; failures should be fast. */
 	if (secure_computing() == -1)
 		return NO_SYSCALL;
 
+	/* Ensure seccomp updates to x0 are visible to audit. */
+	update_syscall_orig_x0_after_ptrace(regs);
+
 	if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
 		trace_sys_enter(regs, regs->syscallno);
 
-- 
2.55.0.795.g602f6c329a-goog



^ permalink raw reply related	[flat|nested] 13+ messages in thread
* Re: [PATCH] arm64: syscall: Ensure saved x0 is kept in-sync with tracer updates
@ 2026-08-17  6:21 kernel test robot
  0 siblings, 0 replies; 13+ messages in thread
From: kernel test robot @ 2026-08-17  6:21 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp

:::::: 
:::::: Manual check reason: "low confidence bisect report"
:::::: 

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20260714143600.23853-1-will@kernel.org>
References: <20260714143600.23853-1-will@kernel.org>
TO: Will Deacon <will@kernel.org>
TO: linux-arm-kernel@lists.infradead.org
CC: linux-kernel@vger.kernel.org
CC: Will Deacon <will@kernel.org>
CC: Kees Cook <kees@kernel.org>
CC: Jinjie Ruan <ruanjinjie@huawei.com>
CC: Mark Rutland <mark.rutland@arm.com>
CC: Yiqi Sun <sunyiqixm@gmail.com>
CC: Catalin Marinas <catalin.marinas@arm.com>

Hi Will,

kernel test robot noticed the following build errors:

[auto build test ERROR on linux-review/Yiqi-Sun/arm64-ptrace-use-live-x0-for-seccomp-and-audit-after-ptrace/20260815-210721]

url:    https://github.com/intel-lab-lkp/linux/commits/Will-Deacon/arm64-syscall-Ensure-saved-x0-is-kept-in-sync-with-tracer-updates/20260815-220235
base:   https://github.com/intel-lab-lkp/linux Yiqi-Sun/arm64-ptrace-use-live-x0-for-seccomp-and-audit-after-ptrace/20260815-210721
patch link:    https://lore.kernel.org/r/20260714143600.23853-1-will%40kernel.org
patch subject: [PATCH] arm64: syscall: Ensure saved x0 is kept in-sync with tracer updates
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: arm64-allnoconfig-bpf (https://download.01.org/0day-ci/archive/20260817/202608170808.txxj5kR9-lkp@intel.com/config)
compiler: aarch64-linux-gnu-gcc (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260817/202608170808.txxj5kR9-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/r/202608170808.txxj5kR9-lkp@intel.com/

All errors (new ones prefixed by >>):

>> arch/arm64/kernel/ptrace.c:2461:13: error: conflicting types for 'update_syscall_orig_x0_after_ptrace'; have 'void(struct pt_regs *)'
    2461 | static void update_syscall_orig_x0_after_ptrace(struct pt_regs *regs)
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/arm64/kernel/ptrace.c:563:13: note: previous definition of 'update_syscall_orig_x0_after_ptrace' with type 'void(struct task_struct *)'
     563 | static void update_syscall_orig_x0_after_ptrace(struct task_struct *target)
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


vim +2461 arch/arm64/kernel/ptrace.c

3157858feff8919 AKASHI Takahiro 2014-04-30  2460  
f579bf33f3c09c9 Will Deacon     2026-07-14 @2461  static void update_syscall_orig_x0_after_ptrace(struct pt_regs *regs)
f579bf33f3c09c9 Will Deacon     2026-07-14  2462  {
f579bf33f3c09c9 Will Deacon     2026-07-14  2463  	/*
f579bf33f3c09c9 Will Deacon     2026-07-14  2464  	 * Keep orig_x0 authoritative so that seccomp (via
f579bf33f3c09c9 Will Deacon     2026-07-14  2465  	 * syscall_get_arguments()), audit and the restart path all see the same
f579bf33f3c09c9 Will Deacon     2026-07-14  2466  	 * first argument the syscall is dispatched with, even if it has been
f579bf33f3c09c9 Will Deacon     2026-07-14  2467  	 * updated by a tracer. Skip this for NO_SYSCALL (set either by the user
f579bf33f3c09c9 Will Deacon     2026-07-14  2468  	 * or the tracer), as regs[0] holds the return value (see the comment in
f579bf33f3c09c9 Will Deacon     2026-07-14  2469  	 * el0_svc_common()) and can be unwound using syscall_rollback().
f579bf33f3c09c9 Will Deacon     2026-07-14  2470  	 * For compat tasks, orig_r0 is provided directly through GPR index 17.
f579bf33f3c09c9 Will Deacon     2026-07-14  2471  	 */
f579bf33f3c09c9 Will Deacon     2026-07-14  2472  	if (!is_compat_task() && regs->syscallno != NO_SYSCALL)
f579bf33f3c09c9 Will Deacon     2026-07-14  2473  		regs->orig_x0 = regs->regs[0];
f579bf33f3c09c9 Will Deacon     2026-07-14  2474  }
f579bf33f3c09c9 Will Deacon     2026-07-14  2475  

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2026-08-20 11:26 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-14 14:35 [PATCH] arm64: syscall: Ensure saved x0 is kept in-sync with tracer updates Will Deacon
2026-07-15 11:39 ` Jinjie Ruan
2026-07-15 13:16   ` Will Deacon
2026-07-16  2:09     ` Jinjie Ruan
2026-07-16 11:50       ` Will Deacon
2026-07-16  2:57 ` Jinjie Ruan
2026-07-16  3:05   ` Kees Cook
2026-07-16  3:25     ` Jinjie Ruan
2026-07-16 11:53   ` Will Deacon
2026-07-16 12:04     ` Jinjie Ruan
2026-08-20  6:54 ` kernel test robot
2026-08-20 11:25 ` kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2026-08-17  6:21 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.