FAILED: patch "[PATCH] cgroup: Use open-time credentials for process migraton perm" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-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]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 1756d7994ad85c2479af6ae5a9750b92324685af Mon Sep 17 00:00:00 2001
From: Tejun Heo <[email protected]>
Date: Thu, 6 Jan 2022 11:02:28 -1000
Subject: [PATCH] cgroup: Use open-time credentials for process migraton perm
checks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
cgroup process migration permission checks are performed at write time as whether a given operation is allowed or not is dependent on the content of the write - the PID. This currently uses current's credentials which is a potential security weakness as it may allow scenarios where a less privileged process tricks a more privileged one into writing into a fd that it created.
This patch makes both cgroup2 and cgroup1 process migration interfaces to use the credentials saved at the time of open (file->f_cred) instead of current's.
kernel/cgroup/cgroup-v1.c +4 -3
@@ -504,10 +504,11 @@ static ssize_t __cgroup1_procs_write(struct kernfs_open_file *of, goto out_unlock;/* -* Even if we're attaching all tasks in the thread group, we only -* need to check permissions on one of them. +* Even if we're attaching all tasks in the thread group, we only need +* to check permissions on one of them. Check permissions using the +* credentials from file open to protect against inherited fd attacks. */ - cred =current_cred (); + cred = of->file->f_cred; tcred =get_task_cred (task); if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) && !uid_eq(cred->euid, tcred->uid) &&
kernel/cgroup/cgroup.c +8 -1
@@ -4892,6 +4892,7 @@ static ssize_t __cgroup_procs_write(struct kernfs_open_file *of, char *buf, {struct cgroup *src_cgrp, *dst_cgrp;struct task_struct *task; +const struct cred *saved_cred;ssize_t ret;bool locked;
@@ -4909,9 +4910,15 @@ static ssize_t __cgroup_procs_write(struct kernfs_open_file *of, char *buf, src_cgrp =task_cgroup_from_root (task, &cgrp_dfl_root);spin_unlock_irq (&css_set_lock); -/* process and thread migrations follow same delegation rule */ +/* +* Process and thread migrations follow same delegation rule. Check +* permissions using the credentials from file open to protect against +* inherited fd attacks. +*/ + saved_cred =override_creds (of->file->f_cred); ret =cgroup_attach_permissions (src_cgrp, dst_cgrp, of->file->f_path.dentry->d_sb, threadgroup); +revert_creds (saved_cred);if (ret) goto out_finish;