On Tue, Dec 17, 2019 at 2:00 AM Sargun Dhillon [off-list ref] wrote:
This adds an ioctl which allows file descriptors to be extracted
from processes based on their pidfd.
[...]
You must have the ability to ptrace the process in order to extract any
file descriptors from it. ptrace can already be used to extract file
descriptors based on parasitic code injections, so the permissions
model is aligned.
[...]
quoted hunk ↗ jump to hunk
+ task = get_pid_task(pid, PIDTYPE_PID);
+ if (!task)
+ return -ESRCH;
+ ret = -EPERM;
Please add something like
if (mutex_lock_killable(&task->signal->cred_guard_mutex))
goto out;
here, and drop the mutex after fget_task().
quoted hunk ↗ jump to hunk
+ if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS))
+ goto out;
+ ret = -EBADF;
+ file = fget_task(task, args.fd);
+ if (!file)
+ goto out;
+
+ fd = get_unused_fd_flags(fd_flags);
+ if (fd < 0) {
+ ret = fd;
+ goto out_put_file;
+ }
+ /*
+ * security_file_receive must come last since it may have side effects
+ * and cannot be reversed.
+ */
+ ret = security_file_receive(file);
+ if (ret)
+ goto out_put_fd;
+
+ fd_install(fd, file);
+ put_task_struct(task);
+ return fd;
+
+out_put_fd:
+ put_unused_fd(fd);
+out_put_file:
+ fput(file);
+out:
+ put_task_struct(task);
+ return ret;
+}