Xen Security Advisory 208 (CVE-2017-2615) - oob access in cirrus bitblt copy
Xen.org security team <[email protected]>
| Newsgroups | gmane.comp.emulators.xen.announce |
|---|---|
| Message-ID | <E1cdL8t-0007j3-EY__20998.9552190111$1487010172$gmane$org@xenbits.xenproject.org> |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Xen Security Advisory CVE-2017-2615 / XSA-208
version 2
oob access in cirrus bitblt copy
UPDATES IN VERSION 2
====================
Included backport for qemu-xen versions 4.7 (and earlier); fixed
qemu-xen-traditional patch. Also included proper (non-obscured)
e-mail addresses from upstream patch.
Removed "possibly" from Impact.
3 patches updated
ISSUE DESCRIPTION
=================
When doing bitblt copy backwards, qemu should negate the blit width.
This avoids an oob access before the start of video memory.
IMPACT
======
A malicious guest administrator can cause an out of bounds memory
access, leading to information disclosure or privilege escalation.
VULNERABLE SYSTEMS
==================
Versions of qemu shipped with all Xen versions are vulnerable.
Xen systems running on x86 with HVM guests, with the qemu process
running in dom0 are vulnerable.
Only guests provided with the "cirrus" emulated video card can exploit
the vulnerability. The non-default "stdvga" emulated video card is
not vulnerable. (With xl the emulated video card is controlled by the
"stdvga=" and "vga=" domain configuration options.)
ARM systems are not vulnerable. Systems using only PV guests are not
vulnerable.
For VMs whose qemu process is running in a stub domain, a successful
attacker will only gain the privileges of that stubdom, which should
be only over the guest itself.
Both upstream-based versions of qemu (device_model_version="qemu-xen")
and `traditional' qemu (device_model_version="qemu-xen-traditional")
are vulnerable.
MITIGATION
==========
Running only PV guests will avoid the issue.
Running HVM guests with the device model in a stubdomain will mitigate
the issue.
Changing the video card emulation to stdvga (stdvga=1, vga="stdvga",
in the xl domain configuration) will avoid the vulnerability.
RESOLUTION
==========
Applying the appropriate attached patch resolves this issue.
xsa208-qemuu.patch mainline qemu, qemu-xen master,4.8
xsa208-qemuu-4.7.patch qemu-xen 4.4, 4.5, 4.6, 4.7
xsa208-qemut.patch qemu-xen-traditional
$ sha256sum xsa208*
afde3e9d4bf5225f92c36dec9ff673b0b1b0bad4452d406f0c12edc85e2fec72 xsa208-qemut.patch
e492d528141be5899d46c2ac0bcd0c40ca9d9bfc40906a8e7a565361f17ce38d xsa208-qemuu.patch
09471b66c9d9fc5616e7b96ab67bbb51987e7d9520d1b81cb27cbbb168659ad5 xsa208-qemuu-4.7.patch
$
NOTE REGARDING LACK OF EMBARGO
==============================
This issue has already been publicly disclosed.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iQEcBAEBAgAGBQJYofdiAAoJEIP+FMlX6CvZ3UEIAMJUV177OqZ0O7436zYpM9S+
fEku8b/G7npRcm0L9PtD8PG39IVtqrtIDHIpzMxHA0qbMx3PqWp1G3iBVwFnj21e
ALtKjdNaoDA8nqFEQ3/AbyZ7jn91oYWwmJ7+pKGds+Q+juFof6FVOXCjhNp0XSA6
EDvsz8vOI4fWTtEuVGbg1GnvgEAjKLE9/bE/4zdkWo2WSiWRRCj/yEAr5n0v0R5n
0EEvk21H0XESk2zBk0/UxompNuqbHwOZhBkQ65DxNSkWMIA9hUgqyinR674luHKC
mDkAq8bXar6n1TBQCbWq5f/+50FOApEs0EvJuzWAG7MEkFPaeDSilFb6obhxHjo=
=294C
-----END PGP SIGNATURE-----
_______________________________________________
Xen-announce mailing list
[email protected]
https://lists.xen.org/xen-announce
xsa208-qemut.patch
(application/octet-stream, 1.9 KB)
From 8f63265efeb6f92e63f7e749cb26131b68b20df7 Mon Sep 17 00:00:00 2001 From: Li Qiang <[email protected]> Date: Mon, 13 Feb 2017 15:22:15 +0000 Subject: [PATCH] cirrus: fix oob access issue (CVE-2017-2615) When doing bitblt copy in backward mode, we should minus the blt width first just like the adding in the forward mode. This can avoid the oob access of the front of vga's vram. This is XSA-208. upstream-commit-id: 62d4c6bd5263bb8413a06c80144fc678df6dfb64 Signed-off-by: Li Qiang <[email protected]> { kraxel: with backward blits (negative pitch) addr is the topmost address, so check it as-is against vram size ] [ This is CVE-2017-2615 / XSA-208 - Ian Jackson ] Cc: [email protected] Cc: P J P <[email protected]> Cc: Laszlo Ersek <[email protected]> Cc: Paolo Bonzini <[email protected]> Cc: Wolfgang Bumiller <[email protected]> Fixes: d3532a0db02296e687711b8cdc7791924efccea0 (CVE-2014-8106) Signed-off-by: Gerd Hoffmann <[email protected]> Message-id: [email protected] Reviewed-by: Laszlo Ersek <[email protected]> Signed-off-by: Stefano Stabellini <[email protected]> Signed-off-by: Ian Jackson <[email protected]> --- hw/cirrus_vga.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c index e6c3893..364e22d 100644 --- a/hw/cirrus_vga.c +++ b/hw/cirrus_vga.c @@ -308,10 +308,9 @@ static bool blit_region_is_unsafe(struct CirrusVGAState *s, { if (pitch < 0) { int64_t min = addr - + ((int64_t)s->cirrus_blt_height-1) * pitch; - int32_t max = addr - + s->cirrus_blt_width; - if (min < 0 || max >= s->vram_size) { + + ((int64_t)s->cirrus_blt_height - 1) * pitch + - s->cirrus_blt_width; + if (min < -1 || addr >= s->vram_size) { return true; } } else { -- 2.1.4
xsa208-qemuu.patch
(application/octet-stream, 1.9 KB)
From 8f63265efeb6f92e63f7e749cb26131b68b20df7 Mon Sep 17 00:00:00 2001 From: Li Qiang <[email protected]> Date: Mon, 13 Feb 2017 15:22:15 +0000 Subject: [PATCH] cirrus: fix oob access issue (CVE-2017-2615) When doing bitblt copy in backward mode, we should minus the blt width first just like the adding in the forward mode. This can avoid the oob access of the front of vga's vram. This is XSA-208. upstream-commit-id: 62d4c6bd5263bb8413a06c80144fc678df6dfb64 Signed-off-by: Li Qiang <[email protected]> { kraxel: with backward blits (negative pitch) addr is the topmost address, so check it as-is against vram size ] [ This is CVE-2017-2615 / XSA-208 - Ian Jackson ] Cc: [email protected] Cc: P J P <[email protected]> Cc: Laszlo Ersek <[email protected]> Cc: Paolo Bonzini <[email protected]> Cc: Wolfgang Bumiller <[email protected]> Fixes: d3532a0db02296e687711b8cdc7791924efccea0 (CVE-2014-8106) Signed-off-by: Gerd Hoffmann <[email protected]> Message-id: [email protected] Reviewed-by: Laszlo Ersek <[email protected]> Signed-off-by: Stefano Stabellini <[email protected]> --- hw/display/cirrus_vga.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index bdb092e..3bbe3d5 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -277,10 +277,9 @@ static bool blit_region_is_unsafe(struct CirrusVGAState *s, } if (pitch < 0) { int64_t min = addr - + ((int64_t)s->cirrus_blt_height-1) * pitch; - int32_t max = addr - + s->cirrus_blt_width; - if (min < 0 || max > s->vga.vram_size) { + + ((int64_t)s->cirrus_blt_height - 1) * pitch + - s->cirrus_blt_width; + if (min < -1 || addr >= s->vga.vram_size) { return true; } } else { -- 1.8.3.1
xsa208-qemuu-4.7.patch
(application/octet-stream, 1.8 KB)
From 8f63265efeb6f92e63f7e749cb26131b68b20df7 Mon Sep 17 00:00:00 2001 From: Li Qiang <[email protected]> Date: Mon, 13 Feb 2017 15:22:15 +0000 Subject: [PATCH] cirrus: fix oob access issue (CVE-2017-2615) When doing bitblt copy in backward mode, we should minus the blt width first just like the adding in the forward mode. This can avoid the oob access of the front of vga's vram. This is XSA-208. upstream-commit-id: 62d4c6bd5263bb8413a06c80144fc678df6dfb64 Signed-off-by: Li Qiang <[email protected]> { kraxel: with backward blits (negative pitch) addr is the topmost address, so check it as-is against vram size ] Cc: [email protected] Cc: P J P <[email protected]> Cc: Laszlo Ersek <[email protected]> Cc: Paolo Bonzini <[email protected]> Cc: Wolfgang Bumiller <[email protected]> Fixes: d3532a0db02296e687711b8cdc7791924efccea0 (CVE-2014-8106) Signed-off-by: Gerd Hoffmann <[email protected]> Message-id: [email protected] Reviewed-by: Laszlo Ersek <[email protected]> Signed-off-by: Stefano Stabellini <[email protected]> --- hw/display/cirrus_vga.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index 5198037..7bf3707 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -272,10 +272,9 @@ static bool blit_region_is_unsafe(struct CirrusVGAState *s, { if (pitch < 0) { int64_t min = addr - + ((int64_t)s->cirrus_blt_height-1) * pitch; - int32_t max = addr - + s->cirrus_blt_width; - if (min < 0 || max >= s->vga.vram_size) { + + ((int64_t)s->cirrus_blt_height - 1) * pitch + - s->cirrus_blt_width; + if (min < -1 || addr >= s->vga.vram_size) { return true; } } else { -- 2.1.4