9119d9
From de0a027209822ec012e9a22eefdb5ada96a72b36 Mon Sep 17 00:00:00 2001
9119d9
Message-Id: <de0a027209822ec012e9a22eefdb5ada96a72b36@dist-git>
44539d
From: Eric Blake <eblake@redhat.com>
9119d9
Date: Thu, 6 Nov 2014 09:42:24 +0100
44539d
Subject: [PATCH] CVE-2014-7823: dumpxml: security hole with migratable flag
44539d
44539d
Commit 28f8dfd (v1.0.0) introduced a security hole: in at least
44539d
the qemu implementation of virDomainGetXMLDesc, the use of the
44539d
flag VIR_DOMAIN_XML_MIGRATABLE (which is usable from a read-only
44539d
connection) triggers the implicit use of VIR_DOMAIN_XML_SECURE
44539d
prior to calling qemuDomainFormatXML.  However, the use of
44539d
VIR_DOMAIN_XML_SECURE is supposed to be restricted to read-write
44539d
clients only.  This patch treats the migratable flag as requiring
44539d
the same permissions, rather than analyzing what might break if
44539d
migratable xml no longer includes secret information.
44539d
44539d
Fortunately, the information leak is low-risk: all that is gated
44539d
by the VIR_DOMAIN_XML_SECURE flag is the VNC connection password;
44539d
but VNC passwords are already weak (FIPS forbids their use, and
44539d
on a non-FIPS machine, anyone stupid enough to trust a max-8-byte
44539d
password sent in plaintext over the network deserves what they
44539d
get).  SPICE offers better security than VNC, and all other
44539d
secrets are properly protected by use of virSecret associations
44539d
rather than direct output in domain XML.
44539d
44539d
* src/remote/remote_protocol.x (REMOTE_PROC_DOMAIN_GET_XML_DESC):
44539d
Tighten rules on use of migratable flag.
44539d
* src/libvirt-domain.c (virDomainGetXMLDesc): Likewise.
44539d
44539d
Signed-off-by: Eric Blake <eblake@redhat.com>
44539d
(cherry picked from commit b1674ad5a97441b7e1bd5f5ebaff498ef2fbb11b)
44539d
44539d
Conflicts:
9119d9
	src/libvirt-domain.c - file split from older src/libvirt.c
44539d
Signed-off-by: Eric Blake <eblake@redhat.com>
44539d
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
44539d
---
44539d
 src/libvirt.c                | 3 ++-
44539d
 src/remote/remote_protocol.x | 1 +
44539d
 2 files changed, 3 insertions(+), 1 deletion(-)
44539d
44539d
diff --git a/src/libvirt.c b/src/libvirt.c
9119d9
index 5c086c8..b593c9b 100644
44539d
--- a/src/libvirt.c
44539d
+++ b/src/libvirt.c
9119d9
@@ -4369,7 +4369,8 @@ virDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
9119d9
     virCheckDomainReturn(domain, NULL);
44539d
     conn = domain->conn;
44539d
 
44539d
-    if ((conn->flags & VIR_CONNECT_RO) && (flags & VIR_DOMAIN_XML_SECURE)) {
44539d
+    if ((conn->flags & VIR_CONNECT_RO) &&
44539d
+        (flags & (VIR_DOMAIN_XML_SECURE | VIR_DOMAIN_XML_MIGRATABLE))) {
9119d9
         virReportError(VIR_ERR_OPERATION_DENIED, "%s",
9119d9
                        _("virDomainGetXMLDesc with secure flag"));
44539d
         goto error;
44539d
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
9119d9
index da724d1..ee195c4 100644
44539d
--- a/src/remote/remote_protocol.x
44539d
+++ b/src/remote/remote_protocol.x
9119d9
@@ -3233,6 +3233,7 @@ enum remote_procedure {
44539d
      * @generate: both
44539d
      * @acl: domain:read
44539d
      * @acl: domain:read_secure:VIR_DOMAIN_XML_SECURE
44539d
+     * @acl: domain:read_secure:VIR_DOMAIN_XML_MIGRATABLE
44539d
      */
44539d
     REMOTE_PROC_DOMAIN_GET_XML_DESC = 14,
44539d
 
44539d
-- 
9119d9
2.1.3
44539d