Плагин Widevine аварийно завершает работу при попытке воспроизвести контент Netflix DRM с помощью firefox

Недавно я обновил свою установку 18.04 до 20.04.1, и Netflix не может воспроизвести свой DRM-контент с помощью Firefox (последняя версия 78.0.2) , При попытке воспроизвести видео на веб-сайте Netflix я попадаю на страницу ошибки с F7701-1003, и в верхней части фрейма страницы появляется желтая полоса из firefox, говорящая о том, что плагин разбился. Я предпринял очевидные шаги , чтобы включить DRM.

Журнал сообщений ядра содержал эти строки после каждого сбоя плагина:

[440489.660558] MainThread[364746]: segfault at 0 ip 00007fb9fed72335 sp 00007fffa457a790 error 6 in libxul.so[7fb9fce9e000+4b5b000]
[440489.660566] Code: 8b 0d f7 80 39 05 48 89 01 c7 04 25 00 00 00 00 47 02 00 00 e8 dc 51 13 fe 48 8d 05 3f c7 d3 03 48 8b 0d d6 80 39 05 48 89 01  04 25 00 00 00 00 49 02 00 00 e8 bb 51 13 fe 48 8d 05 50 c7 d3

Похоже, плагин дает сбой в libxul.so . Чтобы увидеть, где я установил пакет отладки firefox, и , используя этот ответ SO , запустил в оболочке bash следующее (где IP и MAPOFF были взяты из сообщение журнала ядра):

IP=0x00007fb9fed72335
MAPOFF=0x7fb9fce9e000
ADDR=$(python3 -c "print(hex($IP-$MAPOFF))")
addr2line -j .text -e /usr/lib/firefox/libxul.so $ADDR

С результатом:

/build/firefox-k3d8Rk/firefox-78.0.2+build2/obj-x86_64-linux-gnu/dist/include/mozilla/RefPtr.h:67

Просмотр исходного кода firefox в Интернете (я не хотел устанавливать исходный пакет, я сомневаюсь, что ubuntu исправил этот файл) не На самом деле это не очень помогает.

Я думал, что это может быть проблема seccomp , аналогичная этой . Поэтому я отключил всю песочницу, почему запускался с такими заданными переменными среды: MOZ_DISABLE_CONTENT_SANDBOX = 1 MOZ_DISABLE_GMP_SANDBOX = 1 . Но и это не помогло.

Я ' Мы пробовали прикрепить экземпляр gdb к контейнеру плагина, используя эти инструкции . И хотя я могу подключиться к контейнеру плагина, GDB ничего не улавливает, и в конце концов плагин завершается. Мне интересно, связано ли это с некоторыми функциями защиты от отладки в плагине widevine (т. Е. Библиотека считает, что ее отлаживают, и намеренно дает сбой).

Затем я использовал strace для регистрации всех системных вызовов из всех процессов экземпляра firefox и обнаружил, где происходит сбой контейнера плагина. Вот соответствующий фрагмент:

359684 execve("/usr/lib/firefox/plugin-container", ["/usr/lib/firefox/plugin-container", "/home/user/.mozilla/firefox/Media-Streaming-Sites/gmp-widevinecdm/4.10.1582.2", "359458", "true", "gmplugin"], 0x7f6598fb1000 /* 82 vars */ 
... snip ...
359684 openat(AT_FDCWD, "/home/user/.mozilla/firefox/Media-Streaming-Sites/gmp-widevinecdm/4.10.1582.2/libwidevinecdm.so", O_RDONLY|O_CLOEXEC) = 15
359684 read(15, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0\354\16l\0\0\0\0\0\270\23l\0\0\0\0\0\0\0\0\0@\08\0\n\0@\0(\0'"..., 832) = 832
359684 pread64(15, "\6\0\0\0\4\0\0\0\354\16l\0\0\0\0\0\354\16l\0\0\0\0\0\354\16l\0\0\0\0\0000\2\0\0\0\0\0\0000\2\0\0"..., 560, 7081708) = 560
359684 fstat(15, {st_mode=S_IFREG|0600, st_size=7085500, ...}) = 0
359684 pread64(15, "\6\0\0\0\4\0\0\0\354\16l\0\0\0\0\0\354\16l"..., 560, 7081708) = 560
359684 mmap(NULL, 7082268, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 15, 0) = -1 EPERM (Operation not permitted)
359684 close(15) = 0
359684 --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---
359684 rt_sigaction(SIGSEGV, NULL, {sa_handler=0x7fdf19dbc670, sa_mask=[ILL TRAP ABRT BUS FPE SEGV], sa_flags=SA_RESTORER|SA_ONSTACK|SA_SIGINFO, sa_restorer=0x7fdf1db583c0}, 8) = 0
359684 write(7, "`\0\0\0001\0\0\0\0\0\0\0MOZ_CRASH(aborting because of MsgProcessingError)\212\0\0\0\34\0\0\0\0\0\0\000359686:\"Chrome_ChildThread\",6\0\0\0X\0\0\0\0\0\0\0/home/user/.mozilla/firefox/Media-Streaming-Sites/gmp-widevinecdm/4.10.1582.2", 201) = 201
359684 close(7)         = 0
359684 prctl(PR_SET_DUMPABLE, SUID_DUMP_USER) = 0

Итак, в выходных данных strace мы видим, что процесс контейнера плагина - 359684 . Это успешно, файл библиотеки подключаемого модуля и выполнение чтения и пары pread64 успешно. Затем пытается mmap файл, но терпит неудачу, и вскоре после этого процесс получает SIGSEGV с кодом SEGV_MAPERR . Затем вызывается обработчик процесса SIGSEGV и записывается сообщение об ошибке, указывающее, что произошел сбой из-за ошибки MsgProcessingError в библиотеке.

Как я могу это исправить?

1
задан 29 July 2020 в 03:36

1 ответ

TL; DR; Убедитесь, что подключаемый модуль находится на монтировании с разрешениями на выполнение.

Оказывается, профиль был расположен на монтировании с noexec собственности. Таким образом, вызов mmap с помощью PROT_EXEC должен завершиться ошибкой с EPERM , как и произошло. Однако библиотека использует mmap для загрузки своих инструкций в память и последующего их выполнения. После того, как профиль (и, следовательно, файл плагина) был перемещен на монтирование с привилегиями выполнения, потоковая передача контента Netflix работает должным образом.

Хотя я явно не устанавливаю noexec ни на одном из моих подключений, он неявно добавлялся, потому что /home/user/.mozilla - это точка монтирования в fstab со свойством user , что позволяет монтировать мой пользователь , Свойство user неявно добавляет noexec к монтированию.

Я предполагаю, что я получал SEGV_MAPERR , потому что код предполагал, что mmap прошел успешно и попытался выполнить инструкции в запрошенной отображаемой памяти. Однако, поскольку mmap не удалось, эта память на самом деле не была отображена.

Мораль истории в том, что если Widevine дает сбой и вы делаете странные вещи с местоположениями своего профиля, убедитесь, что библиотека может быть выполненным. Всего этого можно было бы избежать, если бы widevine был пакетом, который устанавливался рядом с двоичными файлами firefox, но, вероятно, есть какие-то юридические причины для этого.

Я предполагаю, что получаю SEGV_MAPERR , потому что код предполагал, что mmap был успешным, и пытался выполнить инструкции в запрошенной отображаемой памяти. Однако, поскольку mmap не удалось, эта память на самом деле не была отображена.

Мораль истории в том, что если Widevine дает сбой и вы делаете странные вещи с местоположениями своего профиля, убедитесь, что библиотека может быть выполненным. Всего этого можно было бы избежать, если бы widevine был пакетом, который устанавливался рядом с двоичными файлами firefox, но, вероятно, есть какие-то юридические причины для этого.

Я предполагаю, что получаю SEGV_MAPERR , потому что код предполагал, что mmap был успешным, и пытался выполнить инструкции в запрошенной отображаемой памяти. Однако, поскольку mmap не удалось, эта память на самом деле не была отображена.

Мораль истории в том, что если Widevine дает сбой и вы делаете странные вещи с местоположениями своего профиля, убедитесь, что библиотека может быть выполненным. Всего этого можно было бы избежать, если бы widevine был пакетом, который устанавливался рядом с двоичными файлами firefox, но, вероятно, есть какие-то юридические причины для этого.

если Widevine дает сбой и вы делаете странные вещи с местоположением своего профиля, убедитесь, что библиотека может быть запущена. Всего этого можно было бы избежать, если бы widevine был пакетом, который устанавливался рядом с двоичными файлами firefox, но, вероятно, есть какие-то юридические причины для этого.

если Widevine дает сбой и вы делаете странные вещи с местоположением своего профиля, убедитесь, что библиотека может быть запущена. Всего этого можно было бы избежать, если бы widevine был пакетом, который устанавливался рядом с двоичными файлами firefox, но, вероятно, есть какие-то юридические причины для этого.

1
ответ дан 2 August 2020 в 22:02

Другие вопросы по тегам:

Похожие вопросы: