From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 815263AE1A9 for ; Fri, 10 Jul 2026 20:53:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783716841; cv=none; b=Jekg/zuSCDyvDEnRybU4S9Q3JaJtzaM8zYJzVH8eHevvoL1xTQTyQSwOttpNv6nvtSvzbTAlluVg624kg1mKVXc/9PS0E6eyIiwFkY3HU1/EYGTuSoGot534JLhhbqqtcc6K4Ls1hRTmltFW7TzmZSKdP/4Z2D1k2Vb4/ynujBs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783716841; c=relaxed/simple; bh=URA/PDsEMf5TxxwJjs2xq59Ev+4rkYZbGOd7s095fVM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N/qkzkV4Wgwmit4C5KtEN86JQFuDerJRn65KSYxHv5c4lcJpEE+12iyhHFEH4Y3svLVUxSmFg2iUrG8H+Iy7eqUAFNIX8CxelxkUYJGr/w9I/jxxUn3Yl0eEXg11HfpK3h57lctuACh+FDq3mljN23f5yHw61H2uNBsYofxgwL0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YAAASyZz; arc=none smtp.client-ip=209.85.216.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YAAASyZz" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-38125cebfdaso1930665a91.1 for ; Fri, 10 Jul 2026 13:53:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783716837; x=1784321637; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=H+bYaPwfClCvmZMCpl+tD+9q31JoaywpOhKbQK6CIro=; b=YAAASyZzR40ZEhV5UhnZyaY+f76AnZZESW0RUyZdU1LV0Gm3gPdEEO72ntPyJreTIZ BakEhkLzro82yI8l/4z6792syUyZ/u09eu1dat5Rrd/l+yr+h/zJWJfdhN42ZfTKFYQZ vVXPKiQF6y1w39R5txZKaPdqTqx7oB4paKRnS8VlpMBc6djb/Ctz778KqtzpL2kICUC+ X6njAL+EJEJPcZJm9I88Mh8QeTCqNXRh7Skc+RwJGRBenxbFkw82YdatmD/mrGmgY0Gl 0/g8LufWbWTXhxDxEfw7FLyJktw0nvpwHaLw9cLpJuevydJS36R3WwK9+7+ipV3Pu6E9 rknA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783716837; x=1784321637; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=H+bYaPwfClCvmZMCpl+tD+9q31JoaywpOhKbQK6CIro=; b=drRJHe0Z+jzHILiaWOaR1m0qyhPJWmUhXlpkWZm2VgoFwoRm65R4exM++GHnGQYF3n BofXpvRzSMCyQObu3Mw457bmiVCxnWKTnXdsm/CgbDdXqSFjYfBiFkiqp1X0hCnmtpry C6HGELOzYggqPhvThOkEo1pFp/XzwwoaeQXsaxqoqvfud2ZFeHlFQy5yGdW5esUtAS/R KSRShFxBQXJ3PxZXMZgdn2jBfVUdiqlxg/Mq93nCDOarf6rdcd4klxVn+zkjlCykXaZF rj0XnEkgHXdVHKIKJA1DDTOLGGs6BZku6S6r1IQRMfeFRHcVT2lnDwpINCG5KkB6R6ZP VTbg== X-Forwarded-Encrypted: i=1; AHgh+RrB4WTODWQZh4194vJIOKtp4Mvea8jf1UoYwHoG8l2hSpdSKK4P1uaNNFc+T40+c1LR4Vq5bsRy87TZmdA=@vger.kernel.org X-Gm-Message-State: AOJu0YwtSpVw/SVgwU+OkfB1N+QhrjW3JhfKGByLYe1p/GefcFwjXn68 XEZaWYoSFiFIzFYGF2qeO1COUjxIQqfjHt/WN0wDEqrREILN9yVVsyBp X-Gm-Gg: AfdE7cmbZWSETrtHzkhlgKKc1tLlNEUoV9o49FLJDwjo12B/IryQRFbwzcCkTwpQ6fW MzPCsLMwrzrdYbeC1kt1qWsSynEqnSWLf3EXIYTxw8LwTwigBnx2J8f72TheCNcZVOwsNkFDez+ FDgQ83Kc7FnNSGR5aLP7Z+LcSKhnMP/B+eRwvUr7pEmJh9WBtEQylgaAy78pUd051NxBM8PfbjC gmcdRfl2Y71utn1hfdDn+2bMFlZOEwp9wXBPV8NWYhj/KkMfAWXFSlhKjGdJ1sBAWRh5ymjWuUk LHqOpt1lIbVh3iGkXBTS7jpykS4fmQ12G1dRpEGoiA+W3jjqyP3QIO/OrQwRGdEpMCsXpzitWZJ v38pLudg/7HHZBiaPJ8WifmoLXEMu7DmRykIC4FF9gwApkGcOP8xEkbpvzegbsMYwF2YaTNbSYN os5SgCvIUBmAwXD/+wcTFYfVq+LIG2oZrSxoJs93kItJw77CWOuZcNi58= X-Received: by 2002:a17:90b:33c8:b0:387:e0db:3fb1 with SMTP id 98e67ed59e1d1-38dc77993c3mr515274a91.42.1783716837230; Fri, 10 Jul 2026 13:53:57 -0700 (PDT) Received: from pop-os.scu.edu ([129.210.115.107]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3119c2a7bb5sm21724371eec.25.2026.07.10.13.53.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 13:53:56 -0700 (PDT) From: Cong Wang To: Richard Weinberger , Anton Ivanov , Johannes Berg Cc: Benjamin Berg , linux-um@lists.infradead.org, linux-kernel@vger.kernel.org, Cong Wang Subject: [RFC PATCH 2/6] um: acquire a stub pidfd via CLONE_PIDFD in seccomp mode Date: Fri, 10 Jul 2026 13:53:20 -0700 Message-ID: <20260710205324.1343217-3-xiyou.wangcong@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260710205324.1343217-1-xiyou.wangcong@gmail.com> References: <20260710205324.1343217-1-xiyou.wangcong@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Cong Wang In SECCOMP mode the monitor will install guest mappings into the stub's address space directly via pidfd_mmap(), so it needs a pidfd to the stub. Acquire one atomically at clone() time via CLONE_PIDFD (returned through the legacy-clone parent_tid argument), store it in mm_id->stub_pidfd, and close it on teardown. The ptrace (SKAS0) mode does not use pidfd_mmap and leaves stub_pidfd as -1. Assisted-by: Claude:claude-opus-4.8 Signed-off-by: Cong Wang --- arch/um/include/shared/skas/mm_id.h | 1 + arch/um/kernel/skas/mmu.c | 6 ++++++ arch/um/os-Linux/skas/process.c | 24 ++++++++++++++++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/arch/um/include/shared/skas/mm_id.h b/arch/um/include/shared/skas/mm_id.h index 18c0621430d2..cec97189f12b 100644 --- a/arch/um/include/shared/skas/mm_id.h +++ b/arch/um/include/shared/skas/mm_id.h @@ -16,6 +16,7 @@ struct mm_id { int syscall_data_len; /* Only used with SECCOMP mode */ + int stub_pidfd; /* pidfd to the stub, or -1 */ int sock; int syscall_fd_num; int syscall_fd_map[STUB_MAX_FDS]; diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c index b5017096028b..441dcf94ec9c 100644 --- a/arch/um/kernel/skas/mmu.c +++ b/arch/um/kernel/skas/mmu.c @@ -54,6 +54,7 @@ int init_new_context(struct task_struct *task, struct mm_struct *mm) goto out; new_id->stack = stack; + new_id->stub_pidfd = -1; new_id->syscall_data_len = 0; new_id->syscall_fd_num = 0; @@ -103,6 +104,11 @@ void destroy_context(struct mm_struct *mm) mmu->id.pid = -1; } + if (mmu->id.stub_pidfd >= 0) { + os_close_file(mmu->id.stub_pidfd); + mmu->id.stub_pidfd = -1; + } + if (using_seccomp && mmu->id.sock) os_close_file(mmu->id.sock); diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index d6c22f8aa06d..3dd97ca7999a 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -34,6 +34,10 @@ #include #include "../internal.h" +#ifndef CLONE_PIDFD +#define CLONE_PIDFD 0x00001000 +#endif + int is_skas_winch(int pid, int fd, void *data) { return pid == getpgrp(); @@ -448,6 +452,9 @@ int start_userspace(struct mm_id *mm_id) void *stack; unsigned long sp; int status, n, err; + int stub_pidfd = -1; + + mm_id->stub_pidfd = -1; /* setup a temporary stack page */ stack = mmap(NULL, UM_KERN_PAGE_SIZE, @@ -474,15 +481,25 @@ int start_userspace(struct mm_id *mm_id) if (using_seccomp) proc_data->futex = FUTEX_IN_CHILD; + /* + * In SECCOMP mode, acquire a pidfd to the stub via CLONE_PIDFD (it is + * returned through the legacy-clone parent_tid argument). The monitor + * installs guest mappings into the stub's mm directly via pidfd_mmap(), + * so the stub itself never needs the mmap capability. The ptrace mode + * does not use it and drives the stub directly. + */ mm_id->pid = clone(userspace_tramp, (void *) sp, - CLONE_VFORK | CLONE_VM | SIGCHLD, - (void *)&tramp_data); + CLONE_VFORK | CLONE_VM | (using_seccomp ? CLONE_PIDFD : 0) | + SIGCHLD, + (void *)&tramp_data, &stub_pidfd); if (mm_id->pid < 0) { err = -errno; printk(UM_KERN_ERR "%s : clone failed, errno = %d\n", __func__, errno); goto out_close; } + if (using_seccomp) + mm_id->stub_pidfd = stub_pidfd; if (using_seccomp) { wait_stub_done_seccomp(mm_id, 1, 1); @@ -534,8 +551,11 @@ int start_userspace(struct mm_id *mm_id) out_close: close(tramp_data.sockpair[0]); close(tramp_data.sockpair[1]); + if (stub_pidfd >= 0) + close(stub_pidfd); mm_id->pid = -1; + mm_id->stub_pidfd = -1; return err; } -- 2.43.0