summaryrefslogtreecommitdiffstats
path: root/ipc/ipc_channel_posix.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipc_channel_posix.cc')
-rw-r--r--ipc/ipc_channel_posix.cc59
1 files changed, 13 insertions, 46 deletions
diff --git a/ipc/ipc_channel_posix.cc b/ipc/ipc_channel_posix.cc
index 22e4781..d9156d7 100644
--- a/ipc/ipc_channel_posix.cc
+++ b/ipc/ipc_channel_posix.cc
@@ -193,6 +193,19 @@ bool CreateServerUnixDomainSocket(const std::string& pipe_name,
return false;
}
+ // Explicitly set file system permissions on socket, mainly as a precaution
+ // for Chrome OS.
+ // Do not rely on these file permissions to provide security - the file is
+ // created during the above bind() call so there is still a window for
+ // malicious abuse because the file exists between bind() and chmod(). Also,
+ // the file permissions may not be enforced for unix sockets on all platforms.
+ if (chmod(pipe_name.c_str(), 0600)) {
+ PLOG(ERROR) << "chmod " << pipe_name;
+ if (HANDLE_EINTR(close(fd)) < 0)
+ PLOG(ERROR) << "close " << pipe_name;
+ return false;
+ }
+
// Start listening on the socket.
const int listen_queue_length = 1;
if (listen(fd, listen_queue_length) != 0) {
@@ -925,33 +938,6 @@ bool Channel::ChannelImpl::HasAcceptedConnection() const {
return AcceptsConnections() && pipe_ != -1;
}
-bool Channel::ChannelImpl::GetClientEuid(uid_t* client_euid) const {
- DCHECK(HasAcceptedConnection());
-#if defined(OS_MACOSX)
- uid_t peer_euid;
- gid_t peer_gid;
- if (getpeereid(pipe_, &peer_euid, &peer_gid) != 0) {
- PLOG(ERROR) << "getpeereid " << pipe_;
- return false;
- }
- *client_euid = peer_euid;
- return true;
-#else
- struct ucred cred;
- socklen_t cred_len = sizeof(cred);
- if (getsockopt(pipe_, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len) != 0) {
- PLOG(ERROR) << "getsockopt " << pipe_;
- return false;
- }
- if (cred_len < sizeof(cred)) {
- NOTREACHED() << "Truncated ucred from SO_PEERCRED?";
- return false;
- }
- *client_euid = cred.uid;
- return true;
-#endif
-}
-
void Channel::ChannelImpl::ResetToAcceptingConnectionState() {
// Unregister libevent for the unix domain socket and close it.
read_watcher_.StopWatchingFileDescriptor();
@@ -1011,21 +997,6 @@ void Channel::ChannelImpl::OnFileCanReadWithoutBlocking(int fd) {
}
pipe_ = new_pipe;
- if ((mode_ & MODE_OPEN_ACCESS_FLAG) == 0) {
- // Verify that the IPC channel peer is running as the same user.
- uid_t client_euid;
- if (!GetClientEuid(&client_euid)) {
- LOG(ERROR) << "Unable to query client euid";
- ResetToAcceptingConnectionState();
- return;
- }
- if (client_euid != geteuid()) {
- LOG(WARNING) << "Client euid is not authorised";
- ResetToAcceptingConnectionState();
- return;
- }
- }
-
if (!AcceptConnection()) {
NOTREACHED() << "AcceptConnection should not fail on server";
}
@@ -1190,10 +1161,6 @@ bool Channel::HasAcceptedConnection() const {
return channel_impl_->HasAcceptedConnection();
}
-bool Channel::GetClientEuid(uid_t* client_euid) const {
- return channel_impl_->GetClientEuid(client_euid);
-}
-
void Channel::ResetToAcceptingConnectionState() {
channel_impl_->ResetToAcceptingConnectionState();
}