[PATCH] pidfd: restrict task access ioctls to the caller's pid namespace
DORMANTno replies
From: Chen Linxuan via B4 Relay <devnull+me.black-desk.cn@kernel.org>
Date: 2026-10-27 08:22:33
Also in:
b4-sent, linux-fsdevel, lkml
Subsystem:
filesystems (vfs and infrastructure), the rest · Maintainers:
Alexander Viro, Christian Brauner, Linus Torvalds
From: Chen Linxuan <redacted> pidfds can cross pid namespace boundaries: a task may obtain one for a process outside of its own pid namespace hierarchy through SO_PASSPIDFD or SO_PEERPIDFD, via SCM_RIGHTS, or through file descriptor inheritance. The namespace ioctls gate access with a ptrace check against the target's credentials only. That check does not account for the pid namespace relationship between the caller and the target, so a task inside a pid namespace can use a pidfd obtained across that boundary to acquire namespace file descriptors of a task outside of its hierarchy. procfs exposes the equivalent information only for tasks visible in the reader's pid namespace, and PIDFD_GET_INFO already answers with -EREMOTE for targets outside the caller's hierarchy. Extend that policy to the namespace ioctls: fail with -EREMOTE unless the target is visible in the caller's active pid namespace. Callers in ancestor pid namespaces are unaffected. Unlike PIDFD_GET_INFO, the visibility check is performed after the task lookup here, so reaped targets outside of the caller's pid namespace hierarchy answer -ESRCH instead of -EREMOTE. Link: https://lore.kernel.org/all/CAG48ez1T5-tUHVK_iHsgUtWa-inVdrZxA3E-ZCW0iENJvasKfg@mail.gmail.com (local) Link: https://lore.kernel.org/all/20260925-gewischt-auftrag-tierzucht-c153cb3f9f74@brauner (local) Suggested-by: Jann Horn <jannh@google.com> Suggested-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Chen Linxuan <redacted> --- This patch was previously submitted as patch 1/4 of the task path ioctl series v3. It is now submitted independently because it changes access to existing namespace ioctls and does not depend on the new path ioctls. The code and commit message are unchanged from v3 1/4. The patch has been rebased onto current mainline. A revised task path ioctl series will follow separately and depend on this patch. Previous submission: https://lore.kernel.org/all/20261010-pidfd-get-paths-v3-1-f245440b2b30@black-desk.cn/ (local) --- fs/pidfs.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/fs/pidfs.c b/fs/pidfs.c
index 7f8c323ce6cb..cfb93c4ccf23 100644
--- a/fs/pidfs.c
+++ b/fs/pidfs.c@@ -556,6 +556,14 @@ static long pidfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (arg) return -EINVAL; + /* + * Require the target to be visible in the caller's pid namespace + * for operations that grant access to its resources, mirroring + * procfs and PIDFD_GET_INFO. + */ + if (!pid_in_current_pidns(pidfd_pid(file))) + return -EREMOTE; + /* * We're trying to open a file descriptor to the namespace so perform a * filesystem cred ptrace check. Hold @task's exec_update_lock for the
--- base-commit: d135ab453a7400a34930bdda1ef4bdc8acfac80e change-id: 20261027-pidfd-task-access-b797ecb260a4 Best regards, -- Chen Linxuan [off-list ref]