FAILED: patch "[PATCH] nsfs: tighten permission checks for ns iteration ioctls" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x e6b899f08066e744f89df16ceb782e06868bd148
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026031747-sweat-levitate-59b2@gregkh' --subject-prefix 'PATCH 6.18.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e6b899f08066e744f89df16ceb782e06868bd148 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Thu, 26 Feb 2026 14:50:09 +0100
Subject: [PATCH] nsfs: tighten permission checks for ns iteration ioctls
Even privileged services should not necessarily be able to see other privileged service's namespaces so they can't leak information to each other. Use may_see_all_namespaces() helper that centralizes this policy until the nstree adapts.
fs/nsfs.c +13 -0
@@ -199,6 +199,17 @@ static bool nsfs_ioctl_valid(unsigned int cmd)return false; } +static bool may_use_nsfs_ioctl (unsigned int cmd) +{ +switch (_IOC_NR (cmd)) { +case _IOC_NR (NS_MNT_GET_NEXT ): + fallthrough; +case _IOC_NR (NS_MNT_GET_PREV ): +return may_see_all_namespaces (); + } +return true; +} +static long ns_ioctl (struct file *filp,unsigned int ioctl,unsigned long arg) {
@@ -214,6 +225,8 @@ static long ns_ioctl(struct file *filp, unsigned int ioctl,if (!nsfs_ioctl_valid (ioctl))return -ENOIOCTLCMD ; +if (!may_use_nsfs_ioctl (ioctl)) +return -EPERM ; ns =get_proc_ns (file_inode (filp));switch (ioctl) {
include/linux/ns_common.h +2 -0
@@ -55,6 +55,8 @@ static __always_inline bool is_ns_init_id(const struct ns_common *ns)#define ns_common_free (__ns) __ns_common_free(to_ns_common((__ns))) +bool may_see_all_namespaces (void ); + static __always_inline __must_check int __ns_ref_active_read(const struct ns_common *ns) {return atomic_read (&ns->__ns_ref_active);
kernel/nscommon.c +6 -0
@@ -309,3 +309,9 @@ void __ns_ref_active_get(struct ns_common *ns)return ; } } + +bool may_see_all_namespaces (void ) +{ +return (task_active_pid_ns (current) == &init_pid_ns) && +ns_capable_noaudit (init_pid_ns.user_ns,CAP_SYS_ADMIN ); +}
Sasha Levin
maintainerPATCH 1/1 nsfs: tighten permission checks for ns iteration ioctls
From: Christian Brauner <[email protected]>
[ Upstream commit e6b899f08066e744f89df16ceb782e06868bd148 ]
Even privileged services should not necessarily be able to see other privileged service's namespaces so they can't leak information to each other. Use may_see_all_namespaces() helper that centralizes this policy until the nstree adapts.
--- fs/nsfs.c | 13 +++++++++++++ include/linux/ns_common.h | 2 ++ kernel/nscommon.c | 6 ++++++ 3 files changed, 21 insertions(+)
fs/nsfs.c +13 -0
@@ -194,6 +194,17 @@ static bool nsfs_ioctl_valid(unsigned int cmd)return false; } +static bool may_use_nsfs_ioctl (unsigned int cmd) +{ +switch (_IOC_NR (cmd)) { +case _IOC_NR (NS_MNT_GET_NEXT ): + fallthrough; +case _IOC_NR (NS_MNT_GET_PREV ): +return may_see_all_namespaces (); + } +return true; +} +static long ns_ioctl (struct file *filp,unsigned int ioctl,unsigned long arg) {
@@ -209,6 +220,8 @@ static long ns_ioctl(struct file *filp, unsigned int ioctl,if (!nsfs_ioctl_valid (ioctl))return -ENOIOCTLCMD ; +if (!may_use_nsfs_ioctl (ioctl)) +return -EPERM ; ns =get_proc_ns (file_inode (filp));switch (ioctl) {
include/linux/ns_common.h +2 -0
@@ -144,6 +144,8 @@ void __ns_common_free(struct ns_common *ns);#define ns_common_free (__ns) __ns_common_free(to_ns_common((__ns))) +bool may_see_all_namespaces (void ); + static __always_inline __must_check bool __ns_ref_put(struct ns_common *ns) {return refcount_dec_and_test (&ns->__ns_ref);
kernel/nscommon.c +6 -0
@@ -75,3 +75,9 @@ void __ns_common_free(struct ns_common *ns) {proc_free_inum (ns->inum); } + +bool may_see_all_namespaces (void ) +{ +return (task_active_pid_ns (current) == &init_pid_ns) && +ns_capable_noaudit (init_pid_ns.user_ns,CAP_SYS_ADMIN ); +}
Signature · 1 line
2.51.0