CVE-2019-10161: arbitrary file read/exec via virDomainSaveImageGetXMLDesc API (bz #1722463, bz #1720115) CVE-2019-10166: virDomainManagedSaveDefineXML API exposed to readonly clients (bz #1722462, bz #1720114) CVE-2019-10167: arbitrary command execution via virConnectGetDomainCapabilities API (bz #1722464, bz #1720117) CVE-2019-10168: arbitrary command execution via virConnectBaselineHypervisorCPU and virConnectCompareHypervisorCPU APIs (bz #1722466, bz #1720118) CVE-2019-3886: virsh domhostname command discloses guest hostname in readonly mode [fedora-rawhide Cannot start VM with a CBR 2.0 TPM device (bz #1712556) libvirtd does not update VM .xml configurations after virsh snapshot/blockcommit (bz #1722348)
144 lines
5.7 KiB
Diff
144 lines
5.7 KiB
Diff
From: Jiri Denemark <jdenemar@redhat.com>
|
|
Date: Fri, 12 Apr 2019 21:21:05 +0200
|
|
Subject: [PATCH] qemu: Don't cache microcode version
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
My earlier commit be46f61326 was incomplete. It removed caching of
|
|
microcode version in the CPU driver, which means the capabilities XML
|
|
will see the correct microcode version. But it is also cached in the
|
|
QEMU capabilities cache where it is used to detect whether we need to
|
|
reprobe QEMU. By missing the second place, the original commit
|
|
be46f61326 made the situation even worse since libvirt would report
|
|
correct microcode version while still using the old host CPU model
|
|
(visible in domain capabilities XML).
|
|
|
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
|
(cherry picked from commit 673c62a3b7855a0685d8f116e227c402720b9ee9)
|
|
---
|
|
src/qemu/qemu_capabilities.c | 12 ++++++++----
|
|
src/qemu/qemu_capabilities.h | 3 +--
|
|
src/qemu/qemu_driver.c | 9 +--------
|
|
tests/testutilsqemu.c | 2 +-
|
|
4 files changed, 11 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
|
index b48bcbebee..e5b1c90253 100644
|
|
--- a/src/qemu/qemu_capabilities.c
|
|
+++ b/src/qemu/qemu_capabilities.c
|
|
@@ -4487,7 +4487,7 @@ virQEMUCapsNewData(const char *binary,
|
|
priv->libDir,
|
|
priv->runUid,
|
|
priv->runGid,
|
|
- priv->microcodeVersion,
|
|
+ virHostCPUGetMicrocodeVersion(),
|
|
priv->kernelVersion);
|
|
}
|
|
|
|
@@ -4570,8 +4570,7 @@ virFileCachePtr
|
|
virQEMUCapsCacheNew(const char *libDir,
|
|
const char *cacheDir,
|
|
uid_t runUid,
|
|
- gid_t runGid,
|
|
- unsigned int microcodeVersion)
|
|
+ gid_t runGid)
|
|
{
|
|
char *capsCacheDir = NULL;
|
|
virFileCachePtr cache = NULL;
|
|
@@ -4595,7 +4594,6 @@ virQEMUCapsCacheNew(const char *libDir,
|
|
|
|
priv->runUid = runUid;
|
|
priv->runGid = runGid;
|
|
- priv->microcodeVersion = microcodeVersion;
|
|
priv->kvmUsable = VIR_TRISTATE_BOOL_ABSENT;
|
|
|
|
if (uname(&uts) == 0 &&
|
|
@@ -4617,8 +4615,11 @@ virQEMUCapsPtr
|
|
virQEMUCapsCacheLookup(virFileCachePtr cache,
|
|
const char *binary)
|
|
{
|
|
+ virQEMUCapsCachePrivPtr priv = virFileCacheGetPriv(cache);
|
|
virQEMUCapsPtr ret = NULL;
|
|
|
|
+ priv->microcodeVersion = virHostCPUGetMicrocodeVersion();
|
|
+
|
|
ret = virFileCacheLookup(cache, binary);
|
|
|
|
VIR_DEBUG("Returning caps %p for %s", ret, binary);
|
|
@@ -4672,6 +4673,7 @@ virQEMUCapsPtr
|
|
virQEMUCapsCacheLookupByArch(virFileCachePtr cache,
|
|
virArch arch)
|
|
{
|
|
+ virQEMUCapsCachePrivPtr priv = virFileCacheGetPriv(cache);
|
|
virQEMUCapsPtr ret = NULL;
|
|
const char *binaryFilters[] = {
|
|
"qemu-system-",
|
|
@@ -4684,6 +4686,8 @@ virQEMUCapsCacheLookupByArch(virFileCachePtr cache,
|
|
size_t i;
|
|
size_t j;
|
|
|
|
+ priv->microcodeVersion = virHostCPUGetMicrocodeVersion();
|
|
+
|
|
for (i = 0; i < ARRAY_CARDINALITY(binaryFilters); i++) {
|
|
for (j = 0; j < ARRAY_CARDINALITY(archs); j++) {
|
|
struct virQEMUCapsSearchData data = {
|
|
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
|
index ba84052bca..a6a655ac0f 100644
|
|
--- a/src/qemu/qemu_capabilities.h
|
|
+++ b/src/qemu/qemu_capabilities.h
|
|
@@ -587,8 +587,7 @@ void virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
|
|
virFileCachePtr virQEMUCapsCacheNew(const char *libDir,
|
|
const char *cacheDir,
|
|
uid_t uid,
|
|
- gid_t gid,
|
|
- unsigned int microcodeVersion);
|
|
+ gid_t gid);
|
|
virQEMUCapsPtr virQEMUCapsCacheLookup(virFileCachePtr cache,
|
|
const char *binary);
|
|
virQEMUCapsPtr virQEMUCapsCacheLookupCopy(virFileCachePtr cache,
|
|
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
index 36426cd65a..75d31efd14 100644
|
|
--- a/src/qemu/qemu_driver.c
|
|
+++ b/src/qemu/qemu_driver.c
|
|
@@ -585,8 +585,6 @@ qemuStateInitialize(bool privileged,
|
|
char *hugepagePath = NULL;
|
|
char *memoryBackingPath = NULL;
|
|
size_t i;
|
|
- virCPUDefPtr hostCPU = NULL;
|
|
- unsigned int microcodeVersion = 0;
|
|
|
|
if (VIR_ALLOC(qemu_driver) < 0)
|
|
return -1;
|
|
@@ -809,15 +807,10 @@ qemuStateInitialize(bool privileged,
|
|
run_gid = cfg->group;
|
|
}
|
|
|
|
- if ((hostCPU = virCPUProbeHost(virArchFromHost())))
|
|
- microcodeVersion = hostCPU->microcodeVersion;
|
|
- virCPUDefFree(hostCPU);
|
|
-
|
|
qemu_driver->qemuCapsCache = virQEMUCapsCacheNew(cfg->libDir,
|
|
cfg->cacheDir,
|
|
run_uid,
|
|
- run_gid,
|
|
- microcodeVersion);
|
|
+ run_gid);
|
|
if (!qemu_driver->qemuCapsCache)
|
|
goto error;
|
|
|
|
diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
|
|
index 1736bad032..e30c0599ad 100644
|
|
--- a/tests/testutilsqemu.c
|
|
+++ b/tests/testutilsqemu.c
|
|
@@ -740,7 +740,7 @@ int qemuTestDriverInit(virQEMUDriver *driver)
|
|
|
|
/* Using /dev/null for libDir and cacheDir automatically produces errors
|
|
* upon attempt to use any of them */
|
|
- driver->qemuCapsCache = virQEMUCapsCacheNew("/dev/null", "/dev/null", 0, 0, 0);
|
|
+ driver->qemuCapsCache = virQEMUCapsCacheNew("/dev/null", "/dev/null", 0, 0);
|
|
if (!driver->qemuCapsCache)
|
|
goto error;
|
|
|