Package: libxine1 Version: 1.0.1-1 Severity: serious Tags: security, patch Two potential buffer overflows in xine-lib, both fixed in CVS HEAD. These definitely affect 1.1.1, and look as if they affect 1.0.1 too. (These are reported against 1.0.1-1 for that reason.)
1. Possible overflow via a specially-crafted AVI file Local, remote via streamed content; possibly exploitable. An AVI superindex chunk specifies both the number of entries and the size of each entry. xine-lib uses both values when allocating memory, but then assumes that the entry size is at least 16 bytes when writing to the newly-allocated buffer. Too low an entry size given in the chunk and xine-lib will (a) read past the end of the chunk and (b) write past the end of the buffer. This bug is related to <URL:http://www.xfocus.org/advisories/200603/11.html>. I sent a patch (attached) to xine-devel for review on 2 April; it was committed to CVS by Matthias Hopf on 22 May. <URL:http://sourceforge.net/mailarchive/forum.php?thread_id=10088861&forum_id=7131> 2. Possible overflow in the HTTP header parser Remote; possibly exploitable. This is an unchecked write past the end of a buffer which is used for receiving HTTP data from a remote server. Reported by Diego Pettenò to xine-devel; committed to CVS by me yesterday. Patch (with spelling fix) attached. <URL:http://sourceforge.net/mailarchive/forum.php?thread_id=11076540&forum_id=7131> -- | Darren Salt | linux or ds at | nr. Ashington, | Toon | RISC OS, Linux | youmustbejoking,demon,co,uk | Northumberland | Army | + Use more efficient products. Use less. BE MORE ENERGY EFFICIENT. Your enemies are closing in.
Index: src/demuxers/demux_avi.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/demux_avi.c,v retrieving revision 1.223 diff -u -r1.223 demux_avi.c --- src/demuxers/demux_avi.c 4 Mar 2006 12:04:42 -0000 1.223 +++ src/demuxers/demux_avi.c 1 Apr 2006 23:51:12 -0000 @@ -1029,7 +1029,14 @@ lprintf("Invalid Header, bIndexSubType != 0\n"); } - superindex->aIndex = malloc (superindex->wLongsPerEntry * superindex->nEntriesInUse * sizeof (uint32_t)); + if (superindex->nEntriesInUse > n / sizeof (avisuperindex_entry)) + { + lprintf("broken index !, dwSize=%d, entries=%d\n", n, superindex->nEntriesInUse); + i += 8 + n; + continue; + } + + superindex->aIndex = malloc (superindex->nEntriesInUse * sizeof (avisuperindex_entry)); /* position of ix## chunks */ for (j = 0; j < superindex->nEntriesInUse; ++j) { superindex->aIndex[j].qwOffset = LE_64 (a); a += 8;
Index: xine-lib-1.1.2cvs20060328/src/input/input_http.c =================================================================== --- xine-lib-1.1.2cvs20060328.orig/src/input/input_http.c +++ xine-lib-1.1.2cvs20060328/src/input/input_http.c @@ -895,6 +895,12 @@ static int http_plugin_open (input_plugi len = 0; } else len ++; + if ( len >= buflen ) { + _x_message(this->stream, XINE_MSG_PERMISSION_ERROR, this->mrl, NULL); + xine_log (this->stream->xine, XINE_LOG_MSG, + _("input_http: buffer exhausted after %d bytes."), buflen); + return 0; + } } lprintf ("end of headers\n");