From 72ea9211f1e0e02725311f7fe15eee9d3eb5b888 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Mon, 12 Sep 2016 13:48:08 +0900 Subject: [PATCH] Add auth checking at signal agent Only root or 'app_fw' user can send to agent. Change-Id: If3ec8662fa9290af7f0d7ffc22b73b39dcfb9a4f Signed-off-by: Sangyoon Jang --- installer/pkgmgr_installer_signal_agent.c | 45 +++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/installer/pkgmgr_installer_signal_agent.c b/installer/pkgmgr_installer_signal_agent.c index 5c49f9a..ca43fad 100644 --- a/installer/pkgmgr_installer_signal_agent.c +++ b/installer/pkgmgr_installer_signal_agent.c @@ -15,6 +15,8 @@ * */ +#define _GNU_SOURCE + #include #include #include @@ -24,6 +26,7 @@ #include #include #include +#include #include #include @@ -40,6 +43,8 @@ #define LOG_TAG "PKGMGR_INSTALLER_SIGNAL_AGENT" #define BUFMAX 4096 +#define PWBUFSIZE sysconf(_SC_GETPW_R_SIZE_MAX) +#define APPFW_USERNAME "app_fw" static int server_fd; static GMainLoop *loop; @@ -141,6 +146,41 @@ static gboolean __quit(gpointer user_data) return FALSE; } +static int __check_authority(int fd) +{ + int r; + struct ucred cr; + socklen_t len; + struct passwd pwd; + struct passwd *pwd_r; + char buf[PWBUFSIZE]; + + len = sizeof(struct ucred); + r = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cr, &len); + if (r != 0) { + LOGE("getsockopt failed: %d", errno); + return -1; + } + + /* allow root user */ + if (cr.uid == 0) + return 0; + + r = getpwuid_r(cr.uid, &pwd, buf, sizeof(buf), &pwd_r); + if (r != 0 || pwd_r == NULL) { + LOGE("getpwuid failed: %d", r); + return -1; + } + + /* only app_fw user can send signal to agent */ + if (strcmp(pwd_r->pw_name, APPFW_USERNAME) != 0) { + LOGE("unauthorized client"); + return -1; + } + + return 0; +} + /** * packet format: * +----------------+-------------+-----------+-------------------+ @@ -166,6 +206,11 @@ static gboolean __handle_signal(gint fd, GIOCondition cond, gpointer user_data) return FALSE; } + if (__check_authority(clifd)) { + close(clifd); + return TRUE; + } + r = recv(clifd, buf, sizeof(size_t) + sizeof(gsize), 0); if (r < 0) { LOGE("recv failed: %d", errno); -- 2.34.1