[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [qemu-xen stable-4.6] cirrus: add blit_is_unsafe call to cirrus_bitblt_cputovideo



commit 722ce03b32f37ef5af09105727b574339326d354
Author:     Gerd Hoffmann <kraxel@xxxxxxxxxx>
AuthorDate: Tue Feb 21 10:54:59 2017 -0800
Commit:     Stefano Stabellini <sstabellini@xxxxxxxxxx>
CommitDate: Tue Feb 21 11:08:56 2017 -0800

    cirrus: add blit_is_unsafe call to cirrus_bitblt_cputovideo
    
    CIRRUS_BLTMODE_MEMSYSSRC blits do NOT check blit destination
    and blit width, at all.  Oops.  Fix it.
    
    Security impact: high.
    
    The missing blit destination check allows to write to host memory.
    Basically same as CVE-2014-8106 for the other blit variants.
    
    The missing blit width check allows to overflow cirrus_bltbuf,
    with the attractive target cirrus_srcptr (current cirrus_bltbuf write
    position) being located right after cirrus_bltbuf in CirrusVGAState.
    
    Due to cirrus emulation writing cirrus_bltbuf bytewise the attacker
    hasn't full control over cirrus_srcptr though, only one byte can be
    changed.  Once the first byte has been modified further writes land
    elsewhere.
    
    [ This is CVE-2017-2620 / XSA-209  - Ian Jackson ]
    
    Reported-by: Gerd Hoffmann <ghoffman@xxxxxxxxxx>
    Signed-off-by: Gerd Hoffmann <kraxel@xxxxxxxxxx>
---
 hw/display/cirrus_vga.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
index e2ee46a..d643a0d 100644
--- a/hw/display/cirrus_vga.c
+++ b/hw/display/cirrus_vga.c
@@ -863,6 +863,10 @@ static int cirrus_bitblt_cputovideo(CirrusVGAState * s)
 {
     int w;
 
+    if (blit_is_unsafe(s, true)) {
+        return 0;
+    }
+
     s->cirrus_blt_mode &= ~CIRRUS_BLTMODE_MEMSYSSRC;
     s->cirrus_srcptr = &s->cirrus_bltbuf[0];
     s->cirrus_srcptr_end = &s->cirrus_bltbuf[0];
@@ -888,6 +892,10 @@ static int cirrus_bitblt_cputovideo(CirrusVGAState * s)
        }
         s->cirrus_srccounter = s->cirrus_blt_srcpitch * s->cirrus_blt_height;
     }
+
+    /* the blit_is_unsafe call above should catch this */
+    assert(s->cirrus_blt_srcpitch <= CIRRUS_BLTBUFSIZE);
+
     s->cirrus_srcptr = s->cirrus_bltbuf;
     s->cirrus_srcptr_end = s->cirrus_bltbuf + s->cirrus_blt_srcpitch;
     cirrus_update_memory_access(s);
--
generated by git-patchbot for /home/xen/git/qemu-xen.git#stable-4.6

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.