From: Bruce Rogers Date: Tue, 2 Aug 2016 17:36:02 +0000 (-0600) Subject: qemu-bridge-helper: reduce security profile X-Git-Tag: accepted/tizen/3.0/base/20161028.103448~13 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f2794a10f8226c8f69ffeffbdb1d0f13bfd95e9d;p=platform%2Fupstream%2Fqemu.git qemu-bridge-helper: reduce security profile Change from using glib alloc and free routines to those from libc. Also perform safety measure of dropping privs to user if configured no-caps. [BR: BOO#988279] Signed-off-by: Bruce Rogers [AF: Rebased for v2.7.0-rc2] Signed-off-by: Andreas Färber --- diff --git a/qemu-bridge-helper.c b/qemu-bridge-helper.c index 5396fbf..f3710b8 100644 --- a/qemu-bridge-helper.c +++ b/qemu-bridge-helper.c @@ -110,7 +110,12 @@ static int parse_acl_file(const char *filename, ACLList *acl_list) *argend = 0; if (strcmp(cmd, "deny") == 0) { - acl_rule = g_malloc(sizeof(*acl_rule)); + acl_rule = calloc(1, sizeof(*acl_rule)); + if (!acl_rule) { + fclose(f); + errno = ENOMEM; + return -1; + } if (strcmp(arg, "all") == 0) { acl_rule->type = ACL_DENY_ALL; } else { @@ -119,7 +124,12 @@ static int parse_acl_file(const char *filename, ACLList *acl_list) } QSIMPLEQ_INSERT_TAIL(acl_list, acl_rule, entry); } else if (strcmp(cmd, "allow") == 0) { - acl_rule = g_malloc(sizeof(*acl_rule)); + acl_rule = calloc(1, sizeof(*acl_rule)); + if (!acl_rule) { + fclose(f); + errno = ENOMEM; + return -1; + } if (strcmp(arg, "all") == 0) { acl_rule->type = ACL_ALLOW_ALL; } else { @@ -413,6 +423,17 @@ int main(int argc, char **argv) goto cleanup; } +#ifndef CONFIG_LIBCAP + /* avoid sending the fd as root user if running suid to not fool + * peer credentials to daemons that dont expect that + */ + if (setuid(getuid()) < 0) { + fprintf(stderr, "Failed to drop privileges.\n"); + ret = EXIT_FAILURE; + goto cleanup; + } +#endif + /* write fd to the domain socket */ if (send_fd(unixfd, fd) == -1) { fprintf(stderr, "failed to write fd to unix socket: %s\n", @@ -434,7 +455,7 @@ cleanup: } while ((acl_rule = QSIMPLEQ_FIRST(&acl_list)) != NULL) { QSIMPLEQ_REMOVE_HEAD(&acl_list, entry); - g_free(acl_rule); + free(acl_rule); } return ret;