mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
scm: Don't use struct ucred in NETLINK_CB and struct scm_cookie.
Passing uids and gids on NETLINK_CB from a process in one user namespace to a process in another user namespace can result in the wrong uid or gid being presented to userspace. Avoid that problem by passing kuids and kgids instead. - define struct scm_creds for use in scm_cookie and netlink_skb_parms that holds uid and gid information in kuid_t and kgid_t. - Modify scm_set_cred to fill out scm_creds by heand instead of using cred_to_ucred to fill out struct ucred. This conversion ensures userspace does not get incorrect uid or gid values to look at. - Modify scm_recv to convert from struct scm_creds to struct ucred before copying credential values to userspace. - Modify __scm_send to populate struct scm_creds on in the scm_cookie, instead of just copying struct ucred from userspace. - Modify netlink_sendmsg to copy scm_creds instead of struct ucred into the NETLINK_CB. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d679c5324d
commit
dbe9a4173e
4 changed files with 33 additions and 12 deletions
|
@ -155,19 +155,21 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p)
|
|||
break;
|
||||
case SCM_CREDENTIALS:
|
||||
{
|
||||
struct ucred creds;
|
||||
kuid_t uid;
|
||||
kgid_t gid;
|
||||
if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct ucred)))
|
||||
goto error;
|
||||
memcpy(&p->creds, CMSG_DATA(cmsg), sizeof(struct ucred));
|
||||
err = scm_check_creds(&p->creds);
|
||||
memcpy(&creds, CMSG_DATA(cmsg), sizeof(struct ucred));
|
||||
err = scm_check_creds(&creds);
|
||||
if (err)
|
||||
goto error;
|
||||
|
||||
if (!p->pid || pid_vnr(p->pid) != p->creds.pid) {
|
||||
p->creds.pid = creds.pid;
|
||||
if (!p->pid || pid_vnr(p->pid) != creds.pid) {
|
||||
struct pid *pid;
|
||||
err = -ESRCH;
|
||||
pid = find_get_pid(p->creds.pid);
|
||||
pid = find_get_pid(creds.pid);
|
||||
if (!pid)
|
||||
goto error;
|
||||
put_pid(p->pid);
|
||||
|
@ -175,11 +177,14 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p)
|
|||
}
|
||||
|
||||
err = -EINVAL;
|
||||
uid = make_kuid(current_user_ns(), p->creds.uid);
|
||||
gid = make_kgid(current_user_ns(), p->creds.gid);
|
||||
uid = make_kuid(current_user_ns(), creds.uid);
|
||||
gid = make_kgid(current_user_ns(), creds.gid);
|
||||
if (!uid_valid(uid) || !gid_valid(gid))
|
||||
goto error;
|
||||
|
||||
p->creds.uid = uid;
|
||||
p->creds.gid = gid;
|
||||
|
||||
if (!p->cred ||
|
||||
!uid_eq(p->cred->euid, uid) ||
|
||||
!gid_eq(p->cred->egid, gid)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue