Первый информативный пост на Дзене посвящу "Модулю с Яндекс ТВ" - YNDX-00251.
По неочевидным причинам, яндекс запрещает ставить на Модуль сторонние приложения и запускать чужой код (за исключением яваскрипта в браузере). К счастью, на устройстве стоит VLC плейер, который поддерживает LUA скрипты - и эту возможность можно проэксплуатировать.
Информация по возможностям LUA в VLC есть в его исходниках тут: https://code.videolan.org/videolan/vlc/-/tree/master/share/lua
Сразу отмечу, что хоть описанный ниже способ и позволяет запускать свои Linux приложения на устройстве - он не дает рута и не дает устанавливать APK файлы. Код запускается процессом VLC и имеет все права и ограничения, как у VLC плеера.
Update: запуск исполняемых файлов из папки приложения теперь не работает - блокируется политиками selinux. Но по прежнему можно запускать системные приложения, а так же свои скрипты из доступных на запись папок. Также можно поиграться с .SO и LD_PRELOAD.
Если посмотреть логи VLC, которые он любезно предоставляет, то виден запуск скриптов из папки /data/user/0/org.videolan.vlc/app_vlc/.share/lua/meta/art/ - так что наша задача положить туда свой файлик, после чего VLC его запустит при сканировании папок с мультимедиа.
Способов, как с помощью VLC создавать файлы на устройстве, довольно много. Я воспользуюсь таким: VLC умеет не только воспроизводить звук на динамики, но и писать аудио в файлы на диск. Для настольного VLC командная строка выглядит следующим образом:
vlc путь_к_файлу_для_воспроизведения --aout=afile --no-audiofile-wav --audiofile-file=путь_куда_запишем_аудио_дорожку
Таким образом можно "выдернуть" аудио дорожку из любого файла, перекодировать ее в PCM файл. Параметр "no-audiofile-wav" говорит не добавлять RIFF заголовок в начало файла.
На Модуле тоже можно указать параметры командной строки VLC. Для этого открываем VLC Player, идем в "Настройки", "Расширенные", и в самом низу находим "Спецпараметры libVLC". Вводим туда такой текст:
--aout=afile
--no-audiofile-wav
--audiofile-file=/data/user/0/org.videolan.vlc/app_vlc/.share/lua/meta/art/my.lua
Каждый параметр должен быть на новой строке. В конце строк не должно быть пробелов (и вообще, в тексте нет ни одного пробела). --audiofile-file=... - это одна строка (Дзен ее переносит на экране).
После чего там же в "Расширенных" настройках выбираем "Перезапустить приложение". Затем возвращаемся в главное окно плеера, "Обзор", "Streams", вводим путь:
И запускаем его на воспроизведение. Если слышим шум - значит что-то сделано некорректно. Весь аудио вывод должен идти в файл /data/user/0/org.videolan.vlc/app_vlc/.share/lua/meta/art/my.lua
Файл должен проиграться мгновенно (может показаться, что он не запустился на воспроизведение).
Желающие могут посмотерть внутрь файла - там LUA скрипт, а в конце файла заUUкодированный remote shell, слушающий порт 11111. Исходник shell я взял здесь: https://gist.github.com/geyslan/5176234
curl и wget, находящиеся на Модуле, не работают из-за "зажатых" привилегий VLC плеера, и падают с ошибкой при попытке загрузить файлы с Интернета. Поэтому приходится использовать технологии более 30-летней давности.
LUA скрипт UU-декодирует свое содержимое в файл term, после чего запускает его.
После воспроизведения файла снова идем в "Спецпараметры libVLC" и очищаем их. Снова выбираем "Перезапустить приложение". Выходим в главное меню, проваливаемся куда-нибудь в "Обзор" - "Внутренняя память", а в это время на ПК подключаемся к порту 11111 устройства.
Еще раз напишу. На установку пакетов через PM, запуск активностей через AM - не хватает привилегий. "Знаменитые" эксплоиты вроде DirtyCow на устройстве не работают, а свежих уязвимостей, позволяющих получить рута я не нашел. Так что этот пост - чтобы осталась информация о проделанных мной изысканиях.
Информация продублирована на 4pda.