mcstransd: don't reinvent getpeercon, badly.

libselinux provides a proper getpeercon() implementation that uses
getsockopt with SO_PEERSEC to reliably obtain the peer's security
context from the kernel.  mcstransd for reasons unknown rolled its
own get_peer_con() function that uses getsockopt SO_PEERCRED
to obtain the peer PID and then calls getpidcon_raw().  That's
less efficient and less secure (subject to races; peer context
may have changed since connect).  Don't do that.

The peer context doesn't appear to be used for anything currently,
although there is a comment suggesting adding a permission check to
see if the requester dominates the label to be translated to control
what labels can be translated by what peers.  Could likely dispense
with it altogether.

Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
This commit is contained in:
Stephen Smalley 2015-05-14 12:51:31 -04:00
parent 85bb06b31c
commit dcc55dba56
1 changed files with 2 additions and 20 deletions

View File

@ -138,24 +138,6 @@ get_peer_pid(int fd, pid_t *pid)
} }
static int
get_peer_con(int fd, char **peercon)
{
int ret;
pid_t pid;
ret = get_peer_pid(fd, &pid);
if (ret)
return -1;
ret = getpidcon_raw(pid, peercon);
if (ret) {
syslog(LOG_ERR,
"Failed to get context of client process (pid=%u)",
pid);
return -1;
}
return 0;
}
static int static int
process_request(int fd, uint32_t function, char *data1, char *UNUSED(data2)) process_request(int fd, uint32_t function, char *data1, char *UNUSED(data2))
{ {
@ -164,8 +146,8 @@ process_request(int fd, uint32_t function, char *data1, char *UNUSED(data2))
char *peercon = NULL; char *peercon = NULL;
int ret; int ret;
ret = get_peer_con(fd, &peercon); ret = getpeercon_raw(fd, &peercon);
if (ret) if (ret < 0)
return ret; return ret;
/* TODO: Check if MLS clearance (in peercon) dominates the MLS label /* TODO: Check if MLS clearance (in peercon) dominates the MLS label