<div dir="ltr">Applied.</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 20, 2017 at 2:39 PM, Gris Ge <span dir="ltr"><<a href="mailto:fge@redhat.com" target="_blank">fge@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Problem:<br>
    A non-root user could send and execute 'shutdown' IPC command to<br>
    multipathd.<br>
<br>
Fix:<br>
    Use getsockopt() to find out socket client uid, only query (list or<br>
    show) command are allowed for non-root(uid != 0) socket connection.<br>
    An error message "permission deny: need to be root" will be sent<br>
    otherwise.<br>
<br>
Signed-off-by: Gris Ge <<a href="mailto:fge@redhat.com">fge@redhat.com</a>><br>
---<br>
 multipathd/main.c   | 12 +++++++++++-<br>
 multipathd/uxlsnr.c | 19 +++++++++++++++++++<br>
 multipathd/uxlsnr.h |  4 +++-<br>
 3 files changed, 33 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/multipathd/main.c b/multipathd/main.c<br>
index adc3258..1e64afc 100644<br>
--- a/multipathd/main.c<br>
+++ b/multipathd/main.c<br>
@@ -23,6 +23,7 @@<br>
 #endif<br>
 #include <semaphore.h><br>
 #include <time.h><br>
+#include <stdbool.h><br>
<br>
 /*<br>
  * libmultipath<br>
@@ -1048,7 +1049,8 @@ map_discovery (struct vectors * vecs)<br>
 }<br>
<br>
 int<br>
-uxsock_trigger (char * str, char ** reply, int * len, void * trigger_data)<br>
+uxsock_trigger (char * str, char ** reply, int * len, bool is_root,<br>
+               void * trigger_data)<br>
 {<br>
        struct vectors * vecs;<br>
        int r;<br>
@@ -1057,6 +1059,14 @@ uxsock_trigger (char * str, char ** reply, int * len, void * trigger_data)<br>
        *len = 0;<br>
        vecs = (struct vectors *)trigger_data;<br>
<br>
+       if ((str != NULL) && (is_root == false) &&<br>
+           (strncmp(str, "list", strlen("list")) != 0) &&<br>
+           (strncmp(str, "show", strlen("show")) != 0)) {<br>
+               *reply = STRDUP("permission deny: need to be root");<br>
+               *len = strlen(*reply) + 1;<br>
+               return 1;<br>
+       }<br>
+<br>
        r = parse_cmd(str, reply, len, vecs, uxsock_timeout / 1000);<br>
<br>
        if (r > 0) {<br>
diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c<br>
index 6ca62af..98ac25a 100644<br>
--- a/multipathd/uxlsnr.c<br>
+++ b/multipathd/uxlsnr.c<br>
@@ -22,6 +22,7 @@<br>
 #include <poll.h><br>
 #include <sys/time.h><br>
 #include <signal.h><br>
+#include <stdbool.h><br>
 #include "checkers.h"<br>
 #include "memory.h"<br>
 #include "debug.h"<br>
@@ -51,6 +52,23 @@ LIST_HEAD(clients);<br>
 pthread_mutex_t client_lock = PTHREAD_MUTEX_INITIALIZER;<br>
 struct pollfd *polls;<br>
<br>
+static bool _socket_client_is_root(int fd);<br>
+<br>
+static bool _socket_client_is_root(int fd)<br>
+{<br>
+       socklen_t len = 0;<br>
+       struct ucred uc;<br>
+<br>
+       len = sizeof(struct ucred);<br>
+       if ((fd >= 0) &&<br>
+           (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &uc, &len) == 0) &&<br>
+           (uc.uid == 0))<br>
+                       return true;<br>
+<br>
+       /* Treat error as not root client */<br>
+       return false;<br>
+}<br>
+<br>
 /*<br>
  * handle a new client joining<br>
  */<br>
@@ -255,6 +273,7 @@ void * uxsock_listen(uxsock_trigger_<wbr>fn uxsock_trigger, void * trigger_data)<br>
                                condlog(4, "cli[%d]: Got request [%s]",<br>
                                        i, inbuf);<br>
                                uxsock_trigger(inbuf, &reply, &rlen,<br>
+                                              _socket_client_is_root(c->fd),<br>
                                               trigger_data);<br>
                                if (reply) {<br>
                                        if (send_packet(c->fd,<br>
diff --git a/multipathd/uxlsnr.h b/multipathd/uxlsnr.h<br>
index 4ef47d5..d51a8f9 100644<br>
--- a/multipathd/uxlsnr.h<br>
+++ b/multipathd/uxlsnr.h<br>
@@ -1,7 +1,9 @@<br>
 #ifndef _UXLSNR_H<br>
 #define _UXLSNR_H<br>
<br>
-typedef int (uxsock_trigger_fn)(char *, char **, int *, void *);<br>
+#include <stdbool.h><br>
+<br>
+typedef int (uxsock_trigger_fn)(char *, char **, int *, bool, void *);<br>
<br>
 void * uxsock_listen(uxsock_trigger_<wbr>fn uxsock_trigger,<br>
                     void * trigger_data);<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.3.1<br>
<br>
--<br>
dm-devel mailing list<br>
<a href="mailto:dm-devel@redhat.com">dm-devel@redhat.com</a><br>
<a href="https://www.redhat.com/mailman/listinfo/dm-devel" rel="noreferrer" target="_blank">https://www.redhat.com/<wbr>mailman/listinfo/dm-devel</a><br>
</font></span></blockquote></div><br></div>