render / rpms / libvirt

Forked from rpms/libvirt 9 months ago
Clone
Pablo Greco 40546a
From 3eaa16967f0546c5d1596bb6c36767cbe01040b9 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <3eaa16967f0546c5d1596bb6c36767cbe01040b9@dist-git>
df3a49
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
df3a49
Date: Wed, 15 May 2019 21:40:56 +0100
df3a49
Subject: [PATCH] admin: reject clients unless their UID matches the current
df3a49
 UID
df3a49
MIME-Version: 1.0
df3a49
Content-Type: text/plain; charset=UTF-8
df3a49
Content-Transfer-Encoding: 8bit
df3a49
df3a49
The admin protocol RPC messages are only intended for use by the user
df3a49
running the daemon. As such they should not be allowed for any client
df3a49
UID that does not match the server UID.
df3a49
df3a49
Fixes CVE-2019-10132
df3a49
df3a49
Reviewed-by: Ján Tomko <jtomko@redhat.com>
df3a49
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Pablo Greco 40546a
(cherry picked from commit 96f41cd765c9e525fe28ee5abbfbf4a79b3720c7)
df3a49
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
df3a49
Message-Id: <20190515204058.28077-2-berrange@redhat.com>
df3a49
---
df3a49
 src/admin/admin_server_dispatch.c | 22 ++++++++++++++++++++++
df3a49
 1 file changed, 22 insertions(+)
df3a49
df3a49
diff --git a/src/admin/admin_server_dispatch.c b/src/admin/admin_server_dispatch.c
df3a49
index b78ff902c0..9f25813ae3 100644
df3a49
--- a/src/admin/admin_server_dispatch.c
df3a49
+++ b/src/admin/admin_server_dispatch.c
df3a49
@@ -66,6 +66,28 @@ remoteAdmClientNew(virNetServerClientPtr client ATTRIBUTE_UNUSED,
df3a49
                    void *opaque)
df3a49
 {
df3a49
     struct daemonAdmClientPrivate *priv;
df3a49
+    uid_t clientuid;
df3a49
+    gid_t clientgid;
df3a49
+    pid_t clientpid;
df3a49
+    unsigned long long timestamp;
df3a49
+
df3a49
+    if (virNetServerClientGetUNIXIdentity(client,
df3a49
+                                          &clientuid,
df3a49
+                                          &clientgid,
df3a49
+                                          &clientpid,
df3a49
+                                          &timestamp) < 0)
df3a49
+        return NULL;
df3a49
+
df3a49
+    VIR_DEBUG("New client pid %lld uid %lld",
df3a49
+              (long long)clientpid,
df3a49
+              (long long)clientuid);
df3a49
+
df3a49
+    if (geteuid() != clientuid) {
df3a49
+        virReportRestrictedError(_("Disallowing client %lld with uid %lld"),
df3a49
+                                 (long long)clientpid,
df3a49
+                                 (long long)clientuid);
df3a49
+        return NULL;
df3a49
+    }
df3a49
 
df3a49
     if (VIR_ALLOC(priv) < 0)
df3a49
         return NULL;
df3a49
-- 
Pablo Greco 40546a
2.22.0
df3a49