render / rpms / libvirt

Forked from rpms/libvirt 4 months ago
Clone
a2479f
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
a2479f
Date: Fri, 14 Jun 2019 08:47:42 +0200
a2479f
Subject: [PATCH] api: disallow virDomainSaveImageGetXMLDesc on read-only
a2479f
 connections
a2479f
MIME-Version: 1.0
a2479f
Content-Type: text/plain; charset=UTF-8
a2479f
Content-Transfer-Encoding: 8bit
a2479f
a2479f
The virDomainSaveImageGetXMLDesc API is taking a path parameter,
a2479f
which can point to any path on the system. This file will then be
a2479f
read and parsed by libvirtd running with root privileges.
a2479f
a2479f
Forbid it on read-only connections.
a2479f
a2479f
Fixes: CVE-2019-10161
a2479f
Reported-by: Matthias Gerstner <mgerstner@suse.de>
a2479f
Signed-off-by: Ján Tomko <jtomko@redhat.com>
a2479f
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
a2479f
(cherry picked from commit aed6a032cead4386472afb24b16196579e239580)
a2479f
---
a2479f
 src/libvirt-domain.c         | 11 ++---------
a2479f
 src/qemu/qemu_driver.c       |  2 +-
a2479f
 src/remote/remote_protocol.x |  3 +--
a2479f
 3 files changed, 4 insertions(+), 12 deletions(-)
a2479f
a2479f
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
a2479f
index df7e405b3e..1cc8537c04 100644
a2479f
--- a/src/libvirt-domain.c
a2479f
+++ b/src/libvirt-domain.c
a2479f
@@ -1073,8 +1073,7 @@ virDomainRestoreFlags(virConnectPtr conn, const char *from, const char *dxml,
a2479f
  * previously by virDomainSave() or virDomainSaveFlags().
a2479f
  *
a2479f
  * No security-sensitive data will be included unless @flags contains
a2479f
- * VIR_DOMAIN_SAVE_IMAGE_XML_SECURE; this flag is rejected on read-only
a2479f
- * connections.
a2479f
+ * VIR_DOMAIN_SAVE_IMAGE_XML_SECURE.
a2479f
  *
a2479f
  * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of
a2479f
  * error.  The caller must free() the returned value.
a2479f
@@ -1090,13 +1089,7 @@ virDomainSaveImageGetXMLDesc(virConnectPtr conn, const char *file,
a2479f
 
a2479f
     virCheckConnectReturn(conn, NULL);
a2479f
     virCheckNonNullArgGoto(file, error);
a2479f
-
a2479f
-    if ((conn->flags & VIR_CONNECT_RO) &&
a2479f
-        (flags & VIR_DOMAIN_SAVE_IMAGE_XML_SECURE)) {
a2479f
-        virReportError(VIR_ERR_OPERATION_DENIED, "%s",
a2479f
-                       _("virDomainSaveImageGetXMLDesc with secure flag"));
a2479f
-        goto error;
a2479f
-    }
a2479f
+    virCheckReadOnlyGoto(conn->flags, error);
a2479f
 
a2479f
     if (conn->driver->domainSaveImageGetXMLDesc) {
a2479f
         char *ret;
a2479f
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
a2479f
index 42b1ce2521..ea9a3d33a3 100644
a2479f
--- a/src/qemu/qemu_driver.c
a2479f
+++ b/src/qemu/qemu_driver.c
a2479f
@@ -7038,7 +7038,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, const char *path,
a2479f
     if (fd < 0)
a2479f
         goto cleanup;
a2479f
 
a2479f
-    if (virDomainSaveImageGetXMLDescEnsureACL(conn, def, flags) < 0)
a2479f
+    if (virDomainSaveImageGetXMLDescEnsureACL(conn, def) < 0)
a2479f
         goto cleanup;
a2479f
 
a2479f
     ret = qemuDomainDefFormatXML(driver, def, flags);
a2479f
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
a2479f
index 11f44ee267..737d67c47b 100644
a2479f
--- a/src/remote/remote_protocol.x
a2479f
+++ b/src/remote/remote_protocol.x
a2479f
@@ -5242,8 +5242,7 @@ enum remote_procedure {
a2479f
     /**
a2479f
      * @generate: both
a2479f
      * @priority: high
a2479f
-     * @acl: domain:read
a2479f
-     * @acl: domain:read_secure:VIR_DOMAIN_SAVE_IMAGE_XML_SECURE
a2479f
+     * @acl: domain:write
a2479f
      */
a2479f
     REMOTE_PROC_DOMAIN_SAVE_IMAGE_GET_XML_DESC = 235,
a2479f