VLC Mediaplayer: Avi- und Real-Media-Dateien führen zum Absturz

Der VLC Mediaplayer ist ein funktionsreicher Medienabspieler, der zahlreiche Video- und Audio-Codecs und Dateiformate unterstützt. Zwei Sicherheitslücken in VLC haben zur Folge, dass ein entfernter Angreifer Denial-of-Service-Attacken und eventuell Befehle mit den Rechten des VLC-Anwenders ausführen kann.

Es handelt sich um zwei unabhängige Schwachstellen im Programmcode: eine in den Routinen zum Verarbeiten von Real-Media-Dateien (“*.rm”) und eine zweite im Code für Avi-Dateien (“*.avi”) zuständigen Code.

Beim ersten Problem handelt es sich um einen Heap-Overflow-Fehler beim Verarbeiten von Real-Media-sipr-Daten, der dazu führt, dass ein entfernter Angreifer den VLC-Player zum Absturz bringen kann. Eventuell ist auch das Ausführen von Programmcode mit den Rechten des Anwenders möglich, wobei dies nicht explizit demonstriert wurde. Der Programmierfehler befindet sich in der Datei “modules/demux/real.c”, wo die Real-Media-Audio-sipr-Daten in der Funktion “DemuxAudioSipr()” verarbeitet werden. Diese wird von der Funktion “DemuxAudio()” aufgerufen, welche wiederum von der Hauptfunktion “Demux()” aufgerufen wird:

static void DemuxAudioSipr( demux_t *p_demux, real_track_t *tk, mtime_t i_pts )
{ demux_sys_t *p_sys = p_demux->p_sys; block_t *p_block = tk->p_sipr_packet; if( p_sys->i_buffer < tk->i_frame_size ) return; if( !p_block ) { p_block = block_New( p_demux, tk->i_frame_size * tk->i_subpacket_h ); if( !p_block ) return; tk->p_sipr_packet = p_block; } memcpy( p_block->p_buffer + tk->i_sipr_subpacket_count * tk->i_frame_size, p_sys->buffer, tk->i_frame_size ); ...

Bei “real_track_t” handelt es sich um eine zuvor erzeugte Struktur, die Daten der Datei speichert und auf deren Felder ein Angreifer mit Hilfe einer geschickt konstruierten Real-Media-Datei Zugriff hat. Kritisch an dieser Funktion ist der “memcpy()”-Aufruf, der als Zieladresse die via Pointer-Arithmetik ermittelte Adresse “p_block->p_buffer + tk->i_sipr_subpacket_count * tk->i_frame_size” verwendet, wobei “tk->i_frame_size” Bytes kopiert werden sollen.

Das Problem besteht nun darin, dass ein Angreifer Zugriff auf “tk->i_sipr_subpacket_count” hat, wodurch er die Zieladresse von “memcpy()” manipulieren kann. Damit ist er in der Lage, Speicherbereiche des Programms zu verändern und einen Absturz zu provozieren. Das kürzlich veröffentlichte Patch umgeht diese Schwachstelle, indem es die erste If-Abfrage durch eine umfangreichere Prüfung ersetzt:

if( p_sys->i_buffer < tk->i_frame_size || tk->i_sipr_subpacket_count >= tk->i_subpacket_h ) return;

Dadurch kann kein schädlicher Wert für “tk->i_sipr_subpacket_count” mehr zur “memcpy()”-Anweisung durchdringen. Betroffen sind die VLC-Versionen 0.5.0 bis 1.1.10.

Avi-Schwachstelle

Die Avi-Datei-Schwachstelle wird ebenfalls durch einen Heap Overflow hervorgerufen. Auch hier ist eine Denial-of-Service-Attacke möglich, und es lässt sich nicht ausschließen, dass ein Angreifer Befehle mit Rechten des Anwenders ausführen kann. Der verantwortliche Programmierfehler befindet sich in der Datei “modules/demux/avi/libavi.c” und dort in der Funktion “AVI_ChunkRead_strf()”, wo Chunks verarbeitet werden. Hier wird Speicher folgendermaßen alloziert:

p_chk->strf.vids.p_bih = malloc( p_chk->common.i_chunk_size );

Allerdings findet zuvor keine Kontrolle statt, ob die in der Datei spezifizierte Chunk-Größe auch Sinn ergibt. Ein Angreifer kann also beliebige Werte in den “malloc()”-Aufruf schreiben, was später zu Problemen im Speicherzugriff führen kann. Die gepatchte Version sieht so aus:

p_chk->strf.vids.p_bih = malloc( __MAX( p_chk->common.i_chunk_size, sizeof( *p_chk->strf.vids.p_bih ) ) );

Hier wird das Problem mit dem “__MAX”-Makro gelöst, was gefährliche Größen abfängt und damit kritische Argumente für die “malloc()”-Funktion ausschließt.

Betroffen sind die VLC-Versionen 1.1.0 bis 1.1.10.

Beide Sicherheitslücken lasen sich mit entsprechend präparierten Medien-Dateien ausnutzen, die der Angreifer an sein Opfer schickt.

Nach oben