|
This is a multi-part message in MIME format.
--------------040604010904090407070807
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Please find attached a detailed advisory of the vulnerability.
Alternatively, the advisory can also be found at:
http://www.trapkit.de/advisories/TKADV2008-010.txt
--------------040604010904090407070807
Content-Type: text/plain;
name="TKADV2008-010.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="TKADV2008-010.txt"
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Advisory: VLC media player TiVo ty Processing Stack Overflow
Vulnerability
Advisory ID: TKADV2008-010
Revision: 1.0
Release Date: 2008/10/20
Last Modified: 2008/10/20
Date Reported: 2008/10/18
Author: Tobias Klein (tk at trapkit.de)
Affected Software: VLC media player <= 0.9.4
Remotely Exploitable: Yes
Locally Exploitable: No
Vendor URL: http://www.videolan.org/
Vendor Status: Vendor has released an updated version
Patch development time: 1 day
=====================Vulnerability details:
=====================
The VLC media player contains a stack overflow vulnerability while parsing
malformed TiVo ty media files. The vulnerability can be trivially exploited
by a (remote) attacker to execute arbitrary code in the context of VLC
media player.
=================Technical Details:
=================
Source code file: modules\demux\Ty.c
[...]
1623 static void parse_master(demux_t *p_demux)
1624 {
1625 demux_sys_t *p_sys = p_demux->p_sys;
1626 uint8_t mst_buf[32]; <-- [1]
1627 int i, i_map_size;
1628 int64_t i_save_pos = stream_Tell(p_demux->s);
1629 int64_t i_pts_secs;
1630
1631 /* Note that the entries in the SEQ table in the stream may have
1632 different sizes depending on the bits per entry. We store them
1633 all in the same size structure, so we have to parse them out one
1634 by one. If we had a dynamic structure, we could simply read the
1635 entire table directly from the stream into memory in place. */
1636
1637 /* clear the SEQ table */
1638 free(p_sys->seq_table);
1639
1640 /* parse header info */
1641 stream_Read(p_demux->s, mst_buf, 32); <-- [2]
1642 i_map_size = U32_AT(&mst_buf[20]); <-- [3]
1643 p_sys->i_bits_per_seq_entry = i_map_size * 8;
1644 i = U32_AT(&mst_buf[28]); /* size of SEQ table, in bytes */
1645 p_sys->i_seq_table_size = i / (8 + i_map_size);
1646
1647 /* parse all the entries */
1648 p_sys->seq_table = malloc(p_sys->i_seq_table_size *
sizeof(ty_seq_table_t));
1649 for (i=0; i