Перейти к содержанию

Среда исполнения PHP плагина на r24 и r25

Редакция 2026-11-02. В какой среде работает код плагина Dune HD на прошивках r24 и r25: версия и модули PHP, php_server и php-cgi, uid, переменные окружения, подстановка FS_PREFIX, каталоги, HTTP, фон, лимиты, отладка. Источники: наблюдения на tv188b 261021_0117_r25 (device) и 260827_0003_r24 (device, снимки процессов); код tv188b r24 и r25 (code); код APK 260724_0207_r24 — там разобрана подстановка путей (code, платформа android-atv); SDK — только как справка и с пометкой. Чего нет ни в коде, ни в наблюдениях, глава не утверждает. Факты о других устройствах — только где сказано. Каждое фактическое предложение ссылается на claim id. Дополнение (2026-11-03): наблюдения запроса 11 — один прогон, tv188b 261021_0117_r25, зонд kb_probe11; на другие прошивки и устройства они не переносятся. Дополнение (2026-11-03): повторы запроса 12 (curl_multi, bg2) — тоже один прогон на том же устройстве; HTTP_HOST разведён по способу задать URL, окружение sh-CGI в §4.1 отделено от php-cgi. Дополнение (2026-11-03): запрос 13 (зонд kb_probe13, один прогон на том же устройстве) — $_SERVER и $_ENV php_server, окружение самого php-cgi (§4.1), exec первым словом и после пробела (§3.2), ffmpeg (§3.4), повтор bg2 со снимками процессов (§3.8).

Рядом: очередь операций, тайм-ауты и жизнь php_server — «Операции плагина, тайм-ауты и php_server»; ошибки прошивки — «Реестр ошибок прошивки и SDK»; приёмы плагинов (HTTP, хранение, фон, CGI) — «Приёмы разработки плагинов Dune HD»; лог и отладка в плагинах — «Приёмы разработки плагинов Dune HD»; сводка по прошивкам — «Матрица совместимости возможностей плагина».

Коротко: вопрос → ответ

Вопрос Ответ Где
Какая версия PHP? 5.3.6: r25, device (устройство r25)1; строка PHP/5.3.6 есть в пяти сборках r22, r24, r25 (код r22, r24, r25)2 §2
Разрядность целых? r25, device: PHP_INT_SIZE = 4 (устройство r25)3 §2
Какие расширения загружены? tv188b r25, один прогон: 32 в php_server (устройство r25)4, те же и cgi-fcgi в CGI (устройство r25)5 §2
Какой текущий каталог? tv188b r25, один прогон: php_server — / (устройство r25)6, CGI зонда — /data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin (устройство r25)7 §1.3
Кто исполняет код плагина? php_server, по процессу на плагин, дочерний для com.dunehd.app (устройство)8 §1.1
Какой uid? php_server — 1000 (r25) (устройство r25)9, system (r24) (устройство r24)10; CGI на r25 — root (устройство r25)11 §1.3
Что такое FS_PREFIX? r25: /data/data/com.dunehd.app (устройство r25)12 — корень, куда встроенный PHP отображает /tmp, /config, /flashdata (устройство r25)13 §3.2
Куда писать постоянные данные? data_dir_path (устройство r25)14; онлайн-обновление его сохраняет (устройство r25)15 §3.3
Куда писать временные? tmp_dir_path (устройство r25)16 §3.3
Что переживает am force-stop? tv188b r25, один прогон: файлы в tmp_dir_path, /tmp и data_dir_path (устройство r25)17; перезагрузка не проверялась §3.3
Почему путь в команде не сработал? r25: в "…" префикс не подставляется, в '…' подставляется (устройство r25)18 §3.2
Как выполнить команду от root? /system/dunehd/dunehd_service do …: r25 — uid 0 (устройство r25)19 §3.5
Какой cURL? r25: 7.67.0 с OpenSSL 1.0.1u (устройство r25)20; части констант нет (устройство r25)21 «HTTP из PHP плагина на r24 и r25» §3.6, §4.2
Какой CA-бандл? /firmware/certs/ca-bundle.crt (устройство r25)22 данных Mozilla 2022 года (код r22, r24, r25)23 «HTTP из PHP плагина на r24 и r25» §3.6
Есть ли wget? r25: $FS_PREFIX/bin/wget, ссылка на BusyBox (устройство r25)24; в одном прогоне вызов по имени к /ping — ok и rc=0 (устройство r25)25, полным путём — rc=126 (устройство r25)26 «HTTP из PHP плагина на r24 и r25» §3.6
Куда идёт hd_print? r25: /tmp/run/<плагин>.log (устройство r25)27, в этом же файле — fd 1 и 2 php_server (устройство r25)28 §3.11
Где переменные окружения в php_server? tv188b r25, один прогон: в $_ENV и getenv(); $_SERVER содержал только REQUEST_TIME, argv и argc (устройство r25)29 §4.1
Есть ли ffmpeg? tv188b r25, один прогон: ffmpeg -version без пути и $FS_PREFIX/firmware/scripts/ffmpeg.sh -version из php_server — rc=0, «ffmpeg version 7.1.3» (устройство r25)30 §3.4
Почему exec('/config/x.sh') — rc=127? tv188b r25, по одному прогону: путь первым словом $FS_PREFIX не получил (устройство r25)31, а sh /config/x.sh — получил (устройство r25)32 §3.2
Сколько живёт PHP-вызов? до тайм-аута операции: handle_user_input на r25 — 60 с по умолчанию (устройство r25)33, по тайм-ауту php_server убивается (устройство r25)34 §3.9

1. Модель: где исполняется PHP плагина

Код плагина работает в одном из нескольких процессов, и от процесса зависят uid, окружение и настройки PHP (устройство r25)35. Основной — php_server: на r25 он живёт между вызовами оболочки (устройство r25)36 и исполняет main.php плагина (устройство r25)37. CGI и отдельные скрипты идут в php-cgi: по коду r24 php-cgi связан с libphp5.so (код r24)38, но SAPI и настройки у него другие (§1.3). Shell-скрипты плагина — третий контекст, без PHP (устройство r25)39.

1.1. php_server: PHP плагина

На tv188b r24 и r25 наблюдались три php_server — по одному на плагин; все они — дочерние процессы com.dunehd.app (устройство)8. Запускает его модуль php_driver.cpp оболочки (код r24): /firmware/bin/php_server (код r24)40; на r25 это происходит при первом вызове плагина, а не при регистрации (устройство r25)41. Формат аргументов — php_server <plugin_name> <php_script_path> <base_log_dir> <system_properties_path><input_fd> <output_fd> (код r24)42; PHP встроен через libphp5.so (код r24)43.

На r25 с оболочкой он связан двумя каналами pipe (устройство r25)44, а других открытых дескрипторов, кроме /dev/null на fd 0 и лога на fd 1 и 2, у него нет (устройство r25)28. При старте он загружает по порядку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, затем выполняет определение системных свойств, загружает dune_config.php и только потом программу плагина (устройство r25)37. Поэтому к коду верхнего уровня main.php уже определены DunePluginFw, DuneSystem, PLUGIN_OP_HANDLE_USER_INPUT и hd_print (устройство r25)45, и подключать их самому не нужно.

В логе системные файлы названы /firmware_ext/php/<файл>, исполняются как /data/data/com.dunehd.app/firmware_ext/php/<файл> (устройство r25)46, а get_included_files() показывает /system/dunehd/firmware_ext/php/<файл> (устройство r25)47. include_path на r25 — .:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include (устройство r25)48; в строках php_server r24 есть шаблон ini_set('include_path', '.:%s:%s'); (код r24)49. Текущий каталог и значения ini на r25 — §1.3.

Когда процесс перезапускается, что происходит со статическими переменными и что считается сбоем, — в «Операции плагина, тайм-ауты и php_server». Файла system_properties.txt, путь к которому php_server получает в аргументах, на r25 в /tmp/plugins/<плагин> нет: каталог пуст (устройство r25)50; значения читайте из DuneSystem::$properties, а не из файла (§3.1).

1.2. php-cgi: CGI и отдельные PHP-скрипты

CGI-скрипт плагина run_plugin_cgi запускает как shell-скрипт, а PHP-обработчик плагин должен вызвать сам (код r24)51. Встроенный CGI download_subtitle — двухстрочная обёртка: дописать .php к SCRIPT_FILENAME и запустить $FS_PREFIX/firmware_ext/php/php-cgi -c . (код r24)52. На r25 плагин с такой обёрткой исполняет свой <имя>.php: getcwd() — www/cgi-bin, php.ini — из того же каталога, get_include_path() — . (устройство r25)53. По коду r24 php-cgi связан с libphp5.so и содержит лишь CGI-обвязку (код r24)38.

В r24 тот же php-cgi прошивка использует и как отдельный процесс без HTTP: run_async_worker.sh запускает им async_worker.php (код r24)54. На r24 этот процесс работает от system (u:r:system_app:s0) с PPID 1 (устройство r24)55, тогда как CGI на r25 — от root (устройство r25)11. Обёртки, переменные PLUGIN_*, свой php.ini и свой php-cgi в пакете — «Приёмы разработки плагинов Dune HD».

URL и запуск CGI по SDK. По SDK встроенный HTTP-сервер отдаёт $install_dir_path/www/* по http://<STB>/plugins/<plugin_name>/* и исполняет CGI из www/cgi-bin/* по http://<STB>/cgi-bin/plugins/<plugin_name>/* (SDK)56; на r25 это наблюдалось и для файла www/index.txt (устройство r25)57, и для CGI (устройство r25)58. Страница httpd SDK — выдержка из busybox/networking/httpd.c, и не всё перечисленное в ней поддерживается текущими прошивками (SDK)59; сказанное в ней — по SDK, на r24+ не подтверждено. По выдержке URL, начинающийся с /cgi-bin/, считается CGI-скриптом: сервер переходит в каталог скрипта и запускает его, установив QUERY_STRING и другие переменные (SDK)60, за описанием которых страница отсылает к спецификации NCSA (SDK)61. На r25 текущий каталог CGI — …/www/cgi-bin плагина (устройство r25)62, а наблюдавшиеся переменные — в §4.1. В выдержке приведён запуск из rc-скрипта с uid=0 под пользователем www (httpd -u www), при uid www = 80 — httpd -p 80 -u 80 … (SDK)63. Это пример из выдержки; на r25 CGI плагина работает под uid 0 (устройство r25)11, см. §6.

Сервисные плагины (по SDK, на r24+ не подтверждено). Страница SDK описывает плагины-службы, к которым обращаются HTTP-запросом к http://localhost или http://127.0.0.1 по пути /cgi-bin/plugins/<имя_плагина>/do?cmd=… (SDK)64; см. также dunehd_service в §1.4. mediainfo_service (2013_04_18) получает длительность файла и делает скриншот (SDK)65; /D/some folder/file.avi в его описании — пример UNIX-пути (SDK)66. 3g_service (2013_05_20) — SMS и 3G: команды (SDK)67, поля status (SDK)68; фоновое 3G-подключение при каждой загрузке выключено (SDK)69, интернет проверяет через ping 8.8.8.8 (SDK)70, а при нём не поддерживаются приём и передача SMS (SDK)71. dvb_service (2013_04_28) ставит системное время по DVB-каналу, но не одновременно с воспроизведением DVB-канала (SDK)72; альтернатива — автозапуск скрипта dvb_time из /config/boot (SDK)73. file_service (2013_08_12) знает delete_file, get_info и read_text_file (SDK)74: директорию не удаляет (SDK)75, get_info возвращает type, size, mtime (SDK)76, текст идёт после строки @data (SDK)77, ошибка — result = error и error_message (SDK)78.

1.3. Сравнение php_server и php-cgi на r25

Все строки таблицы — tv188b 261021_0117_r25, device, кроме отмеченных. Строки getcwd(), «Расширения», max_execution_time, memory_limit и magic_quotes_gpc — один прогон запроса 11, зонд kb_probe11; значения ini — этого зонда, а не всех плагинов. Прогон подтвердил и строки uid, php_sapi_name(), PHP_VERSION (устройство r25)79, include_path (устройство r25)80. В запросе 13 (зонд kb_probe13, один прогон) php_server снова дал php_sapi_name() = hd, PHP_VERSION 5.3.6, getcwd() = / и uid 1000 (устройство r25)81, а php-cgi (/data/data/com.dunehd.app/firmware_ext/php/php-cgi), запущенный busybox httpd для CGI зонда, — cgi-fcgi и uid 0 (устройство r25)82.

Что php_server php-cgi из CGI плагина Claim
Кто запускает оболочка, родитель com.dunehd.app httpd через run_plugin_cgi и обёртку плагина (устройство r25)83
uid 1000 (system) 0 (устройство r25)84
getcwd() / /data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin (устройство r25)79
Расширения 32, перечень — §2 те же 32 и cgi-fcgi (устройство r25)85
max_execution_time 0 30 (устройство r25)80
memory_limit 128M 128M (устройство r25)80
magic_quotes_gpc 1 0 (устройство r25)80
SELinux-контекст u:r:system_app:s0 u:r:shell:s0 (устройство r25)86
php_sapi_name() hd cgi-fcgi (устройство r25)87
PHP_VERSION, разрядность 5.3.6, 32 бита то же (устройство r25)88
include_path ., каталог плагина, firmware_ext/php/include . (устройство r25)89
date.timezone Europe/Moscow пусто при php.ini без этого ключа, date() пишет Warning (устройство r25)90
PHP_PROC_OPEN_SH $FS_PREFIX/bin/sh не задана (устройство r25)91
Окружение процесса своё, с HOME, TMPDIR, PHP_PROC_OPEN_SH и др. (запрос 13); переменные — в $_ENV, не в $_SERVER то же, что у sh-CGI httpd; HOME и TMPDIR нет (запрос 13) (устройство r25)92
Куда идут ошибки /tmp/run/<плагин>.log stderr обёрток — $FS_PREFIX/tmp/dune_apk_cgi_err.log (код r24) (устройство r25, код r24)93
Подстановка FS_PREFIX есть есть (устройство r25)94

1.4. Shell-скрипты плагина и dunehd_service

Скрипт plugin_system из global_action на r25 работает под uid 1000 с контекстом u:r:system_app:s0, текущим каталогом / и FS_PREFIX=/data/data/com.dunehd.app (устройство r25)39. Команды поставщика из стороннего плагина — тоже uid 1000 и каталог / (устройство r25)95. Демон dunehd_service на r24 работает от root с контекстом u:r:shell:s0 (устройство r24)96; как им пользоваться, — §3.5. httpd на r24 и r25 — тоже root (устройство)97. Сам процесс com.dunehd.app на r24 — system (устройство r24)98, и в его окружении нет FS_PREFIX и PHP_PROC_OPEN_SH (устройство r24)99.

2. Версия PHP и модули

Строка PHP/5.3.6 есть в libphp5.so пяти исследованных сборок: tv188b r22, r24, r25, tv175u r24 и APK r24 (код r22, r24, r25)2. На r25 PHP_VERSION = 5.3.6 подтверждён и в php_server (устройство r25)1, и в php-cgi (устройство r25)100. В тех же сборках — OpenSSL 1.0.1u (код r22, r24, r25)101 и PCRE 8.11 (код r22, r24, r25)102. Бинарные файлы при этом разные: r22 (e7d22b70…), r24 (e28ffc74…) и r25 (4a31ef48…), причём файл tv188b r24 совпадает с APK 260724_0207_r24 и tv175u 260724_0207_r24 (код r22, r24, r25)103.

На tv188b r25 в прогоне запроса 11 php_server зонда kb_probe11 перечислил 32 загруженных расширения: Core, date, ereg, libxml, openssl, pcre, sqlite3, zlib, ctype, curl, dom, fileinfo, filter, hash, iconv, json, mbstring, pcntl, SPL, PDO, posix, Reflection, session, SimpleXML, soap, sockets, standard, tokenizer, xml, xmlreader, xmlwriter, zip (устройство r25)4; CGI того же зонда — те же и cgi-fcgi (устройство r25)5. О других прошивках — §7.

Ниже — имена из strings libphp5.so пяти сборок (code): наличие имени значит «так собрано», а не «проверено вызовом». «Нет наблюдения» в столбце r25 — вызов не проверялся, хотя расширение группы есть в перечне выше (устройство r25)4.

Группа Имена в strings Наблюдение на r25 Claim
JSON json_encode, json_decode, json_last_error да, §4.2 (устройство r25, код r22, r24, r25)104
cURL curl_init, curl_setopt, curl_setopt_array, curl_exec, curl_getinfo, curl_error, curl_errno, curl_close, curl_copy_handle, curl_version да, «HTTP из PHP плагина на r24 и r25» §3.6 (устройство r25, код r22, r24, r25)105
cURL multi curl_multi_init, curl_multi_add_handle, curl_multi_exec, curl_multi_select, curl_multi_getcontent, curl_multi_info_read, curl_multi_remove_handle, curl_multi_close да, с падением, «HTTP из PHP плагина на r24 и r25» §3.6 (устройство r25, код r22, r24, r25)106
mbstring mb_strlen, mb_substr, mb_convert_encoding, mb_detect_encoding, mb_check_encoding mb_strlen — да, таблица ниже (устройство r25, код r22, r24, r25)107
iconv iconv_strlen, iconv_substr, iconv_mime_decode, iconv_get_encoding, iconv_set_encoding нет наблюдения (код r22, r24, r25)108
PCRE preg_match, preg_match_all, preg_replace, preg_split, preg_last_error нет наблюдения (код r22, r24, r25)109
OpenSSL openssl_encrypt, openssl_decrypt, openssl_sign, openssl_verify, openssl_random_pseudo_bytes openssl_x509_parse — да (устройство r25, код r22, r24, r25)110
pcntl pcntl_fork, pcntl_waitpid, pcntl_signal, pcntl_signal_dispatch, pcntl_exec pcntl_fork, pcntl_waitpid — да, таблица ниже (устройство r25, код r22, r24, r25)111
posix posix_getuid, posix_getpid, posix_kill, posix_setuid posix_getuid, posix_kill — да (устройство r25, код r22, r24, r25)112
sockets socket_create, socket_connect, socket_select, socket_read, socket_write нет наблюдения (код r22, r24, r25)113
XML simplexml_load_string, xml_parser_create, libxml_use_internal_errors нет наблюдения (код r22, r24, r25)114
Классы DOMDocument, SoapClient, ZipArchive, SQLite3 DOMDocument, ZipArchive, SQLite3 — да, таблица ниже; SoapClient — нет наблюдения (устройство r25, код r22, r24, r25)115
hash, сессии, zlib hash_hmac, hash_file, session_start, gzcompress, gzuncompress нет наблюдения (код r22, r24, r25)116

Проверка вызовом (tv188b r25, php_server зонда kb_probe11, запрос 11, один прогон). Результат относится к этому единственному вызову; другие методы тех же расширений он не проверяет.

Вызов Результат Claim
mb_strlen для двух букв UTF-8 2 (устройство r25)117
SQLite3(':memory:')->querySingle('SELECT 1') 1 (устройство r25)118
ZipArchive::open с CREATE true (устройство r25)119
DOMDocument::loadXML('<a><b/></a>') true (устройство r25)120
pcntl_fork, в потомке posix_kill(getmypid(), 9), в родителе pcntl_waitpid потомок 22745; pcntl_waitpid вернул 22745, status=9 (устройство r25)121
popen('echo kb11-popen', 'r'), pclose строка kb11-popen, pclose — 0 (устройство r25)122
proc_open без cwd и env rc=0, оболочка — §3.4; с cwd и env — §3.2 (устройство r25)123

libphp5.so тянет libxml2.so.2, libcurl.so.5, libssl.so.1.0.0, libcrypto.so.1.0.0, libiconv.so.2, libz.so (код r22, r24, r25)124; libiconv.so.2 не находит php-cgi, запущенный снаружи (устройство r25)125 (§3.11).

Целые и JSON (r25, device, php_server и php-cgi). PHP_INT_MAX = 2147483647 (устройство r25)3. Литерал 3000000000 в коде даёт integer 2147483647; PHP_INT_MAX + 1 даёт 2147483648, а time() * 1000 — 13-значное число без обрезки (устройство r25)126. json_decode() целых вне 32 бит возвращает 2147483647 или −2147483648 при json_last_error() = 0 (устройство r25)127, а 12345678901234567890 — double (устройство r25)128. Как плагины обходят потерю больших чисел, — §5.

3. Задачи

3.1. Узнать свои пути: DuneSystem::$properties и FS_PREFIX

На r25 DuneSystem::$properties плагина из flashdata содержит 8 ключей: sdk_version 1.0.0, plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url, few_buttons_remote_type (устройство r25)129. Значения путей уже с FS_PREFIX (устройство r25)130, а URL — с явным портом 80: http://127.0.0.1:80/plugins/<p>/ и http://127.0.0.1:80/cgi-bin/plugins/<p>/ (устройство r25)131. Сверка с перечнем SDK — §4.4.

По коду r24 сам префикс возвращает HD::get_fs_prefix из FS_PREFIX, пустую строку — если переменной нет; HD::is_apk, is_fw_apk и get_apk_package_name читают HD_APK, HD_FW_APK и APK_PACKAGE_NAME (код r24)132. На tv188b r25 FS_PREFIX есть в php_server (устройство r25)12 и в php-cgi CGI (устройство r25)133. На tv175u r24 скрипт init эту переменную не выставляет (код r24)134. Поэтому брать путь из свойства или HD::get_fs_prefix надёжнее, чем зашивать /data/data/com.dunehd.app.

В CGI обёртка передаёт PLUGIN_NAME, PLUGIN_CGI_DIR и SCRIPT_FILENAME (устройство r25)58; как плагины достраивают остальное — «Приёмы разработки плагинов Dune HD».

3.2. Понять, что делает абсолютный путь: подстановка FS_PREFIX

На r25 встроенный PHP переписывает абсолютные пути (устройство r25)135 и пути в команде shell_exec (устройство r25)18. Поэтому один и тот же путь значит разное в PHP, в команде и в adb shell.

Что видно на r25 (device, php_server и php-cgi). realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС из adb shell /firmware и /firmware_ext нет, а /config — другой каталог (устройство r25)135. is_dir('/flashdata') = true при realpath /data/data/com.dunehd.app/flashdata, хотя в корне ФС его нет (устройство r25)136. CA-бандл доступен и как /firmware/certs/ca-bundle.crt, и как $FS_PREFIX/firmware/certs/ca-bundle.crt (устройство r25)22.

Файловые функции (код APK r24). Префикс добавляется только к пути, начинающемуся с / (код r24)137. Корни: всё, что начинается с /tmp, /firmware, /config, /flashdata, /fconfig, ровно /system/dunehd/init и /D, и ещё один образец по адресу 0x353448 (код r24)138. Сравнение — по префиксу без границы каталога: подходят и /firmware_ext/…, /tmpX, /config2/… (код r24)139. Для /D и второго образца после FS_PREFIX вставляется /tmp/mnt (код r24)140. Без FS_PREFIX путь не меняется (код r24)141.

_php_add_fs_prefix вызывают 22 функции, среди них _php_curl_setopt, simplexml_load_file, chdir, glob, readfile, rename, unlink, chmod, touch, php_stat, _php_stream_mkdir, _php_stream_opendir, _php_stream_open_wrapper_ex, zend_stream_open (код r24)142. Отдельно префикс учитывает virtual_file_ex (код r24)143, а её вызывает 21 функция, включая tsrm_realpath, php_do_open_temporary_file и php_zip_extract_file (код r24)144.

Две оговорки по коду APK r24: открытие потока с поиском по include_path идёт без _php_add_fs_prefix (код r24)145, а чтение /sys/class/net/eth0/address при заданной HD_APK подменяется на /tmp/run/dune_mac.txt (код r24)146; значение HD_APK при этом не проверяется (код r24)147.

Команды. На r25 shell_exec добавляет $FS_PREFIX к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках, но не к /etc/…, не к x/tmp/f и не к пути в двойных кавычках (устройство r25)18. Этот дефект описан в BUG-012. По коду APK r24 _php_add_fs_prefix_to_cmd вызывают php_exec, zif_shell_exec, zif_popen, zif_proc_open и virtual_popen (код r24)148; путь проверяется, только если перед / стоит пробел, !, &, апостроф, скобка, ;, <, > или обратная кавычка (код r24)149.

Ещё два правила того же кода касаются первого слова команды. Слово, оканчивающееся на /php-cgi, заменяется на $FS_PREFIX/firmware_ext/php/php-cgi с добавлением -c <исходный каталог> (код r24)150. Команда, начинающаяся с $FS_PREFIX или пути под корнем, не из /firmware/bin/ и не из /firmware_ext/php/, получает спереди sh (код r24)151.

Первое слово команды в коде libphp5.so r25. Если команда начинается с / и путь требует префикса, но не начинается с /firmware/bin/ или /firmware_ext/php/, _php_add_fs_prefix_to_cmd ставит в начало результата sh (код r25)152. $FS_PREFIX к пути у / эта функция дописывает, только если байт перед / — пробел, !, &, апостроф, (, ), ;, <, > или обратная кавычка; для / в первом символе команды проверяется байт перед началом строки (код r25)153. Слово-путь после пробела (как /config/… в наблюдении shell_exec выше (устройство r25)18) и путь первым словом команды проходят, таким образом, разные ветви одного кода. Вызывают ли эту функцию и exec, и shell_exec, и чем объясняется прогон ниже, — гипотезы в §7.

Первое слово, cwd, env и include_path на r25 (tv188b, php_server, запрос 11, один прогон). exec команды /config/kbp11_x.sh first-word вернул rc=127 и sh: /config/kbp11_x.sh: No such file or directory, а file_get_contents того же пути с use_include_path=true прочитал 49 байт (устройство r25)154; гипотеза о причине — §7. file_get_contents('lib/kbp11_steps.php', true) прочитал 15678 байт (устройство r25)155. proc_open с cwd=/tmp вернул rc=0, pwd=/tmp и увидел каталог kb_probe11 (устройство r25)156. proc_open с env={KB11_E:one} вернул rc=0, KB11_E=one и PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:. (устройство r25)157 — не тот PATH, что в снимке окружения php_server (§4.1) (устройство r25)158. Какие из гипотез по коду APK r24 это проверяет и что осталось открытым, — §7.

Первое слово и слово после пробела в одном прогоне (tv188b r25, php_server, запрос 13, один прогон). С PHP_DEBUG=1 exec("/config/kbp13_x.sh first-word 2>&1") снова вернул rc=127 и sh: /config/kbp13_x.sh: No such file or directory: путь первым словом $FS_PREFIX не получил (устройство r25)31. В том же прогоне exec("echo /config/kbp13_x.sh") напечатал /data/data/com.dunehd.app/config/kbp13_x.sh, а exec("sh /config/kbp13_x.sh after-sh") запустил скрипт с argv0 /data/data/com.dunehd.app/config/kbp13_x.sh — путь после пробела префикс получил (устройство r25)32. shell_exec("echo x; /config/kbp13_x.sh after-semicolon") тоже выполнил скрипт по пути с $FS_PREFIX (устройство r25)159; перед / там стоял пробел, поэтому прогон не различает, сработал ; или пробел (устройство r25)159. Практически: свой скрипт под /config запускайте как sh /config/…, а не путём первым словом (устройство r25)160. Строк о замене команд этот прогон не проверял; почему, — §3.11 (устройство r25)161.

libphp5.so tv188b r24 совпадает с APK по sha256, а у r25 файл другой (код r22, r24, r25)103. Перенос правил кода на r24 и r25 — в §7.

3.3. Выбрать, куда писать, и что переживёт перезапуск

Значения — у плагинов из flashdata на tv188b r25, если не сказано иное. php_server работает как system (устройство r25)19; этому же пользователю после регистрации плагина принадлежат /tmp/plugins/<p> и plugins_data/<p> (устройство r25)162.

Что Путь Что с ним происходит Claim
install_dir_path $FS_PREFIX/flashdata/plugins/<p>; у встроенных каталог плагина — $FS_PREFIX/firmware_ext/plugins/<p> файлы пакета; при замене плагина удаляются каталоги установки (код APK r24) (устройство r25, код r24)163
data_dir_path $FS_PREFIX/flashdata/plugins_data/<p>, в том числе у встроенных постоянные данные; файлы и cookies пережили два онлайн-обновления (устройство r25)164
tmp_dir_path $FS_PREFIX/tmp/plugins/<p>, он же /tmp/plugins/<p> для PHP существует уже после регистрации плагина (устройство r25)165
Свой каталог в /tmp например /tmp/kb_probe5/props.txt зонд php_server записал туда файл (устройство r25)27
Лог /tmp/run/<p>.log, предел 3072000 байт см. §3.11 (устройство r25)166
pid /tmp/run/<p>.pid переписывается при каждом новом запуске php_server (устройство r25)167
/config для PHP — $FS_PREFIX/config, в adb shell /config — другой каталог boot-скрипты — §13.1 (устройство r25)135
Точки монтирования /tmp/mnt/network, smb, storage, права drwxrwxrwx system:system SMB-ресурсы — в /tmp/mnt/smb/<N> (устройство r25)168

Запись и am force-stop (tv188b r25, php_server зонда kb_probe11, запрос 11, один прогон). Зонд создал и удалил файл kbp11_w.tmp в /sdcard, /config, /tmp, tmp_dir_path и data_dir_path (устройство r25)169; fopen на запись /data/data/com.dunehd.app/firmware/kbp11_w.tmp вернул failed to open stream: Read-only file system (устройство r25)170. Файлы по 5 байт в tmp_dir_path, /tmp и data_dir_path сохранились после am force-stop и запуска com.dunehd.app (pid 15016 → 22982) (устройство r25)17. /data/data/com.dunehd.app/tmp в этом прогоне оказался символической ссылкой на /tmp (устройство r25)171. Перезагрузка не проверялась — §7.

/tmp на tv188b r24 — tmpfs, его монтирует init (код r24)172. По коду APK в режиме fw_apk каталог <FS-префикс>/tmp заменяется ссылкой на системный /tmp, а firmware и firmware_ext — ссылками на /system/dunehd/… (код r24)173. Флаги однократных действий в /tmp/run (код r24) (код r24)174 на r25 датированы моментом загрузки системы (устройство r25)175, а при следующих стартах приложения boot и boot_end не повторяются (устройство r25)176. Перезапуск самого php_server на r25 обнуляет статические переменные (устройство r25)177, поэтому состояние, которое должно пережить его, держат в файле.

По SDK data_dir_path может отсутствовать на устройствах без System Storage и Flash Memory Storage (SDK)178, а после каждой записи в постоянное хранилище нужен sync (SDK)179 (по SDK, на r24+ не подтверждено). Настройки и кэш в плагинах — §10, перенос данных на накопитель — §10.5, что сохраняется при обновлении — «Онлайн-обновление плагина».

3.4. Запустить внешнюю команду: shell_exec, proc_open, PATH

На r25 shell_exec выполняет команду через /system/bin/sh (устройство r25)180. proc_open по коду APK r24 берёт оболочку из PHP_PROC_OPEN_SH, а без неё — /bin/sh (код r24)181, и зовёт её как sh -c <команда> (код r24)182. В php_server r25 эта переменная указывает на $FS_PREFIX/bin/sh, то есть на libxxx_bash.so (устройство r25)183, а в php-cgi CGI её нет (устройство r25)133. В прогоне запроса 11 на tv188b r25 proc_open без cwd и env из php_server выполнил sh-команду с rc=0, и readlink /proc/$$/exe в ней показал /system/bin/libxxx_bash.so (устройство r25)123. Какой интерпретатор получит proc_open в php-cgi, — см. §7.

По коду APK r24 cwd у proc_open передаётся в chdir() как есть, без префикса (код r24)184. Наблюдения r25 с cwd и env — §3.2.

PATH. Во фрагменте окружения демонов и php-cgi он начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin: r25 — httpd и network_manager (устройство r25)185, r24 — php-cgi shell_ext (устройство r24)186. В самом com.dunehd.app на r24 это не так: PATH=/product/bin:… без $FS_PREFIX (устройство r24)99. В php_server r25 (прогон kb_probe8) PATH начинается так же, целиком он приведён в §4.1 (устройство r25)158; из php_server r25 which wget находит $FS_PREFIX/bin/wget (устройство r25)12.

ffmpeg (tv188b r25, php_server, запрос 13, один прогон). Все три вызова — FS_PREFIX=$FS_PREFIX sh $FS_PREFIX/firmware/scripts/ffmpeg.sh -version, sh $FS_PREFIX/firmware/scripts/ffmpeg.sh -version без явного FS_PREFIX и ffmpeg -version без пути — вернули rc=0 и «ffmpeg version 7.1.3» (устройство r25)30. $FS_PREFIX/firmware/bin/ffmpeg — символическая ссылка на /data/data/com.dunehd.app/lib/libxxx_ffmpeg.so, а firmware/scripts/ffmpeg.sh — обычный файл 457 байт (устройство r25)187.

Утилиты. На r25 /system/bin содержит 46 файлов libxxx_*.so с правами -rwxr-xr-x (устройство r25)188. $FS_PREFIX/bin/httpd и $FS_PREFIX/bin/wget — ссылки на BusyBox (устройство r25)189, в r24 это v1.35.0 (код r24)190. В bin APK r24, среди прочего, — sh, bash, tar и 24 апплета BusyBox: nohup, sed, awk, xargs, killall, date, ps, unzip, wget, tail и другие (код r24)191.

3.5. Выполнить команду от root: dunehd_service do

На r25 из php_server (uid=1000(system), u:r:system_app:s0) команда shell_exec('/system/dunehd/dunehd_service do id') выводит uid=0(root), контекст u:r:shell:s0 (устройство r25)19. Клиент, демон, обёртка и файл окружения одинаковы в tv188b r22, r24 и r25 (код r22, r24, r25)192. Код shell_ext r25 так удаляет пакеты: system() с /system/dunehd/dunehd_service do LD_LIBRARY_PATH= pm uninstall '<пакет>' (код r25)193. В launch_ext_app r25 команда с таким началом идёт в ветку «run command», а am start … — в apk_helper (устройство r25)194.

§3.6–§3.7. HTTP из PHP, cURL, CA-бандл, локальные URL, lcreg, wget — перенесены в «HTTP из PHP плагина на r24 и r25».

3.8. Фон и отдельные процессы

Долгий код не стоит держать в PHP-вызове: операция ограничена по времени (§3.9), а на r25 команды IP Control (устройство r25)195 и клавиши (устройство r25)196 ждут её конца (подробно — «Операции плагина, тайм-ауты и php_server»). Схема «запустить процесс, вернуть действие, читать файл по таймеру» и варианты плагинов — в §13.4, а демоны и автозапуск — в §13.

Что показывает сама прошивка:

  • Отдельный PHP-процесс. run_async_worker.sh r24 делает exec php-cgi -f <плагин>/async_worker.php, вывод — в $FS_PREFIX/tmp/plugins/<плагин>/error.log (код r24)54. С ним общаются файлами в /tmp/plugins/<плагин>/async_worker: wake_flag, stop_flag, request.<id>, response.<id> (код r24)197.
  • Форк из PHP. Конструктор HDHttpLoader в shell_ext r25 создаёт пару UNIX-сокетов и делает pcntl_fork (код r25)198. На уровне кода это пример, а не наблюдение; строка «exitting from forked child» есть и в php_server r24 (код r24)43. Вызов pcntl_fork из php_server зонда на r25 — §2.
  • Что видно в процессах r24. php-cgi async_worker — system, PPID 1 (устройство r24)55; демон стороннего Dune_backup, который его скрипт запускает через dunehd_service do, если этот файл есть (код)199, — root, u:r:shell:s0, PPID 1 (устройство r24)200.

Фоновый процесс из shell_exec (tv188b r25, php_server, запрос 11, один прогон). shell_exec('sleep 61 >/dev/null 2>&1 &') вернулся за 0.01 с; процесс sleep с PPid=1 оставался после kill php_server и сохранял открытые pipe-дескрипторы 93 и 98 (устройство r25)201. Шаг bg2 того же запроса разобран в §7.

shell_exec("sleep 61 &") без перенаправления (tv188b r25, php_server, запрос 12, один прогон). Перед шагом bg2 шаг noop завершился в новом php_server, и выборка процессов не показала ни одного sleep 61 (устройство r25)202. Шаг bg2 записал begin и метку перед shell_exec("sleep 61 &"), но записи возврата в отчёте нет, а end bg2 за 75 с окна ожидания не появился (устройство r25)203. Оболочка отменила handle_user_input по тайм-ауту 30.0 с, убила PHP-сервер и записала отмену через 30.333 с с сообщением «Превышено время операции» (устройство r25)204. После окна ожидания выборка процессов не вывела ни sleep 61, ни его pipe- и socket-дескрипторов, а php_server зонда уже не найден (устройство r25)205. Команда с перенаправлением в запросе 11 вернулась за 0.01 с (устройство r25)201, без перенаправления в запросе 12 возврат до отмены операции не записан (устройство r25)203; это по одному прогону каждого вида, и почему возврата нет в отчёте, лог не показывает.

Тот же bg2 со снимками процессов (tv188b r25, php_server, запрос 13, один прогон). php_server 15502 записал метку перед shell_exec("sleep 61 &"), записи о возврате нет; через 30 с оболочка отменила handle_user_input по тайм-ауту, убила PHP-сервер и показала «Превышено время операции» — повтор запроса 12 (устройство r25)206. Процесс sleep 61 на 1, 5, 29, 32 и 45 с имел PPid 1, держал fd 1 на pipe, а также fd 101 (чтение) и 110 (запись) на pipe — те же номера, что в аргументах php_server «… 101 110» (устройство r25)207. php_server исчез к 20:01:24 (отмена — в 20:01:22), а sleep 61 оставался до 45 с и не был виден на 62 и 70 с: он пережил php_server и завершился сам, а не вместе с ним (устройство r25)208. Почему shell_exec не вернулся, — гипотеза в §7. Вывод для плагина: фоновую команду из shell_exec запускайте с перенаправлением вывода, как в запросе 11, где sleep 61 >/dev/null 2>&1 & вернулся за 0.01 с (устройство r25)201. Widget Ext запускает свои скрипты с перенаправлением вывода > /dev/null & (код)209, другие приёмы — §5.

3.9. Тайм-ауты и лимиты

Срок операции считает оболочка; единицы и умолчания — в «Операции плагина, тайм-ауты и php_server». Здесь только то, что влияет на код в среде: на r25 handle_user_input без operation_timeout стартует с 60 с (устройство r25)33, а по истечении срока оболочка останавливает php_server, и код вызова не дорабатывает (устройство r25)34.

bootstrap.php (код r24) делает set_time_limit(0) (код r24)210; файл одинаков в r22 и r24 (код r22, r24)211. Лимит PHP, таким образом, снят, а sleep(15) при сроке 60 с дорабатывает (устройство r25)212; в прогоне запроса 11 max_execution_time у php_server зонда — 0, у его CGI — 30 (§1.3) (устройство r25)80. В CGI разобранных плагинов фреймворк не подключается (код)213, а обёртка передаёт php-cgi свой php.ini (устройство r25)53: на r25 php.ini shell_ext — date.timezone = UTC, display_errors = 0, log_errors = 1, error_log = /tmp/run/shell_ext_cgi.log (код r25)214.

memory_limit в shell_ext задаёт код прошивки: main_plugin.php r24 ставит 300M, конструктор MainPlugin вызывает gc_disable() (код r24)215, AsyncWorker ставит 200M (код r24)216; в r25 Memory::check поднимает лимит с 300 до 500 МБ шагами по 50 МБ (код r25)217. У зонда kb_probe11 на tv188b r25 в запросе 11 memory_limit — 128M и в php_server, и в CGI (устройство r25)80; на других прошивках значение не проверялось — §7. Предел лога php_server — 3072000 байт (устройство r25)166.

3.10. Время и часовой пояс

В r24 bootstrap.php выставляет date.timezone из date_default_timezone_get() с комментарием «Use timezone from the environment (TZ)» (код r24)218. На r25 в php_server это дало Europe/Moscow при getenv('TZ') = false, а date() — MSK +0300 (устройство r25)219. В php-cgi без date.timezone в php.ini значение пусто, и date() пишет PHP Warning, хотя date_default_timezone_get() возвращает ту же Europe/Moscow (устройство r25)220. В CGI поэтому пояс задают в php.ini или в коде: php.ini shell_ext r25 — UTC (код r25)214.

Метки времени в логах на r25 на 3 часа меньше местного времени (устройство r25)221 (BUG-017). openssl_x509_parse() даёт validTo_time_t = −1 для сроков позже 2038-01-19 03:14:07 UTC (устройство r25)222.

3.11. Отладить: лог, PHP_DEBUG, запуск снаружи

Лог php_server. По SDK лог плагина — /tmp/run/<plugin_name>.log (SDK)223; на r25 это /data/data/com.dunehd.app/tmp/run/<плагин>.log, предел 3072000 байт, в окружении LOG_DIR=/tmp/run (устройство r25)166. Туда попадают hd_print с префиксом [pid] [t<tid>] [время] (устройство r25)27, ошибки PHP строкой [<файл>:<строка>] [E_WARNING] … (устройство r25)224 и этапы старта (устройство r25)37. Оператор @ запись не подавляет (устройство r25)225. По коду r24 hd_print выводит через echo (код r24)226, а ошибки перехватывает обработчик bootstrap.php (код r24)227; приглушают их hd_silence_warnings() и hd_restore_warnings() (код r24)228. SDK советует hd_print вместо echo, print и printf (SDK)229 (по SDK, на r24+ не подтверждено). Приёмы логирования — §17.1.

Лог CGI. По коду r24 stderr CGI-скриптов пишется в $FS_PREFIX/tmp/dune_apk_cgi_err.log, больше 10000 байт — в .old (код r24)230; на r25 там видны Segmentation fault (устройство r25)231 и предупреждения линковщика unable to normalize "./lib" (устройство r25)232.

PHP_DEBUG. При заданной переменной изменённые команды печатаются в stdout как -C-> EEE orig command: и -C-> EEE repl command: (код r24)233, изменённые URL — как =H=> EEE orig http: и =H=> EEE repl http: (код r24)234 (код APK r24). В r24 tv188b печать URL тоже ограждена PHP_DEBUG (код r24)235. В прогоне запроса 11 на tv188b r25 после wget с putenv(PHP_DEBUG=1) grep EEE по /tmp/run/kb_probe11.log не вывел строк, а успешный результат самого wget записан (устройство r25)236; это наблюдение о логе, а не вывод, что печати нет (§7). В запросе 13 (tv188b r25, php_server, один прогон) с PHP_DEBUG=1 печать URL в лог плагина дошла: после curl_setopt(CURLOPT_URL, …) там появились строки «=H=> EEE orig http» и «repl http» (устройство r25)237 (подробно — «HTTP из PHP плагина на r24 и r25» §3.6). После шага с командами grep «=H=>» не нашёл ни одной строки (устройство r25)161; маркер команд — -C-> EEE, а зонд искал только маркер HTTP, так что печать команд не проверена (устройство r25, код r24)238. Флаги /config/hd_debug/* — в «Операции плагина, тайм-ауты и php_server».

Запуск снаружи. php-cgi из adb shell на r25 не стартует: CANNOT LINK EXECUTABLE, нет libiconv.so.2 при LD_LIBRARY_PATH=$FS_PREFIX/lib:… (устройство r25)125, а в другом зонде — нет libphp5.so (устройство r25)239. В CGI он работает, и там LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib (устройство r25)240. На r25 в этих опытах правка подключаемого файла подхватилась только после смены mtime main.php (устройство r25)241. Отладка без устройства — §17.5.

3.12. Почему не работает: диагностическая таблица

Всё в таблице — tv188b r25, device, кроме отмеченных.

Симптом Причина или наблюдение Что сделать Claim
Путь работает в PHP, но не в adb shell /flashdata и /firmware есть только для встроенного PHP в adb писать $FS_PREFIX/… (устройство r25)242
Команда не нашла файл по "/tmp/x" в двойных кавычках префикс не подставляется одинарные кавычки (устройство r25)18
Большой id из JSON стал 2147483647 32-битные целые, ошибки при этом нет переписать числа в строки до json_decode (§5) (устройство r25)127
Не определена JSON_UNESCAPED_UNICODE или CURLOPT_RESOLVE констант нет §4.2 (устройство r25)243
Правка lib/*.php не видна php_server перезапускается по mtime main.php touch main.php (устройство r25)241
Нет system_properties.txt файла нет при работающем php_server DuneSystem::$properties (устройство r25)50
PHP_CALL_FAILED и «Ошибка приложения» curl_multi к httpd плеера; в запросе 12 — curl_multi к компьютеру, отчёт обрывается на метке перед curl_multi_getcontent; Fatal error или exit(0) в handle_user_input, в запросе 11 — E_ERROR от вызова несуществующего HD::make_json_rpc_request; null из call_plugin «HTTP из PHP плагина на r24 и r25» §3.6; «Операции плагина, тайм-ауты и php_server» (устройство r25)244
«Превышено время операции» после shell_exec("sleep 61 &") запросы 12 и 13, по одному прогону: возврат shell_exec не записан, операция отменена по тайм-ауту 30 с; в запросе 13 sleep держал fd 1 на pipe и пережил php_server §3.8: команда с перенаправлением >/dev/null 2>&1 & в запросе 11 вернулась за 0.01 с (устройство r25)245
«Превышено время операции» срок операции истёк, php_server остановлен вынести работу в фон (§3.8) (устройство r25)246
HTTPS: errno 60 у www.ssl.com цепочка заканчивается самоподписанным корнем: «self signed certificate in certificate chain» BUG-001 (устройство r25)247
HTTPS: errno 35 у kodikapi.com причина не установлена, отключение проверки не помогает — (устройство r25)248
date() в CGI пишет Warning в php.ini нет date.timezone задать ключ (устройство r25)220
Время в логе расходится с date() на 3 часа метки лога меньше местного времени сравнивать с поправкой (устройство r25)221
$FS_PREFIX/bin/wget … \| head пуст причина не установлена; wget по имени в том же прогоне сработал вызывать по имени (устройство r25)249
wget полным путём или через sh: rc=126, cannot execute binary file один прогон, причина не установлена; по имени в том же прогоне сработал вызывать по имени (устройство r25)250
exec('/config/kbp11_x.sh …'): rc=127, No such file or directory запросы 11 и 13, по одному прогону: путь первым словом $FS_PREFIX не получил; file_get_contents того же пути с use_include_path=true файл прочитал; по коду r25 путь первым словом, которому нужен префикс, получает sh, а префикс зависит от байта перед строкой (§3.2), гипотеза о причине — §7 sh /config/…: в запросе 13 путь после пробела префикс получил (устройство r25, код r25)251
fopen на запись в $FS_PREFIX/firmware/: Read-only file system один прогон; запись в каталоги §3.3 прошла писать в data_dir_path или tmp_dir_path (устройство r25)252
php-cgi из adb: CANNOT LINK EXECUTABLE нет библиотек при запуске снаружи запускать из CGI-обёртки (устройство r25)253
Предупреждение в логе при @mkdir @ запись не подавляет проверять наличие заранее (устройство r25)225

4. Справочник

4.1. Переменные окружения

Окружение php_server на tv188b r25. Значения одного прогона (плагин kb_probe8, pid 3005, ppid 2449, uid 1000), кроме отмеченного. Снимок относится только к php_server; для php-cgi и других прошивок — вторая таблица.

Переменная Значение Claim
PATH /data/data/com.dunehd.app/firmware/bin:/data/data/com.dunehd.app/bin:/bin:/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin (устройство r25)158
HOME /data/user/0/com.dunehd.app/app_vlc (устройство r25)254
TMPDIR /data/data/com.dunehd.app/tmp (устройство r25)255
FS_BIN_PREFIX /data/data/com.dunehd.app (устройство r25)256
APK_PACKAGE_NAME com.dunehd.app (устройство r25)257
HD_APK 1 (устройство r25)258
HD_FW_APK 1 (устройство r25)259
HD_HTTP_LOCAL_PORT 80 (устройство r25)260
HD_DSSD_AMEM 0xecc5679c; в прогоне kb_probe5 (collect5) было 0x2e78afb7: значение меняется между прогонами (устройство r25)261
HD_RMCL_DISABLE_CLOPTNS 1 (устройство r25)262

В прогоне запроса 11 (зонд kb_probe11) /proc/self/environ php_server содержал PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, FS_PREFIX=/data/data/com.dunehd.app, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app и HD_HTTP_LOCAL_PORT=80 (устройство r25)263. Куда ведёт TMPDIR, — §3.3.

В прогоне запроса 13 (зонд kb_probe13) /proc/self/environ php_server содержал, кроме общих с CGI переменных, HOME=/data/user/0/com.dunehd.app/app_vlc, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app, APK_PACKAGE_NAME=com.dunehd.app, PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, LOG_MAX_FILE_SIZE=3072000 и HD_RMCL_DISABLE_CLOPTNS=1 (устройство r25)264. Читать их из PHP нужно через $_ENV или getenv(): $_SERVER в php_server содержал только REQUEST_TIME, argv и argc, а $_ENV совпал с /proc/self/environ (устройство r25)29.

HD_DSSD_AMEM по коду r24 читает client_authenticate в dunehd_service: при отсутствии переменной берётся get_default_env (код r24, r25)265.

Значения по процессам и прошивкам. Для каждой строки указан процесс, где значение наблюдалось; значения php_server r25 — в снимке выше. «sh-CGI r25» — вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid 0): это окружение CGI-оболочки, а не самого процесса php-cgi (устройство r25)266. В нём нет HOME, TMPDIR, FS_BIN_PREFIX, APK_PACKAGE_NAME, PHP_PROC_OPEN_SH, HD_DSSD_AMEM и HD_RMCL_DISABLE_CLOPTNS, которые были в окружении php_server kb_probe8 (устройство r25)267. Окружение самого php-cgi снято в запросе 13 (зонд kb_probe13, один прогон): набор имён в /proc/self/environ php-cgi совпал с набором в env sh-обёртки того же CGI-запроса, различие — только в значении _ (устройство r25)268. В нём были FS_PREFIX, HD_HTTP_LOCAL_PORT=80, LD_LIBRARY_PATH, PATH, LOG_DIR, HD_APK, PLUGIN_NAME, PLUGIN_CGI_DIR и DUNEHD_SERVICE_DONT_FORK, а getenv(HOME) и getenv(TMPDIR) вернули false (устройство r25)82. Поэтому строки «sh-CGI r25» в этом прогоне относятся и к php-cgi (устройство r25)268.

Переменная Значение Где Claim
FS_PREFIX /data/data/com.dunehd.app r25: php_server, php-cgi CGI, sh-CGI, plugin_system, команды поставщика; r24: php-cgi async_worker, демоны (устройство)269
HD_APK, HD_FW_APK 1 r25: httpd, network_manager, sh-CGI; r24: php-cgi async_worker; APK r24 — только HD_APK (код); tv175u r24 init их не выставляет (код) (устройство, код r24)270
HD_HTTP_LOCAL_PORT 80; APK r24 — 11080 (код) r25: php_server, sh-CGI, php-cgi CGI (запрос 13); r24: php-cgi async_worker (устройство, код r24)271
PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin r25: httpd, network_manager, sh-CGI; r24: php-cgi async_worker; php_server r25 — снимок выше, с тем же началом, что в sh-CGI (устройство)272
LD_LIBRARY_PATH $FS_PREFIX/firmware/lib:/lib:/usr/lib r25: php-cgi CGI, sh-CGI; r24: php-cgi async_worker (устройство)273
PHP_PROC_OPEN_SH $FS_PREFIX/bin/sh (libxxx_bash.so) r25: php_server, нет в php-cgi CGI; r24: php-cgi async_worker (устройство)274
DUNEHD_SERVICE_DONT_FORK 1 r25: sh-CGI (устройство r25)275
LOG_DIR, LOG_MAX_FILE_SIZE /tmp/run, 3072000 r25: php_server; LOG_DIR — ещё и sh-CGI; r24: php-cgi async_worker (устройство)276
TMPDIR $FS_PREFIX/tmp r25: php_server; в php-cgi CGI r25 getenv = false; r24: php-cgi async_worker (устройство)277
HOME /data/user/0/com.dunehd.app/app_vlc r25: php_server; в php-cgi CGI r25 getenv = false; r24: php-cgi async_worker (устройство)277
FS_BIN_PREFIX, APK_PACKAGE_NAME /data/data/com.dunehd.app, com.dunehd.app r24: php-cgi async_worker (устройство r24)186
HD_DSSD_AMEM, HD_RMCL_DISABLE_CLOPTNS 0x0744a101, 1 r24: php-cgi async_worker (устройство r24)278
TZ нет (getenv = false) r25: php_server (устройство r25)219
PLUGIN_NAME, PLUGIN_CGI_DIR, SCRIPT_FILENAME имя и реальные пути www/cgi-bin r25: CGI (устройство r25)58
SERVER_SOFTWARE, GATEWAY_INTERFACE busybox httpd/1.35.0, CGI/1.1 r25: CGI (устройство r25)279
PHP_DEBUG включает печать подстановок (код) APK r24; URL также tv188b r24 (код r24)280

4.2. Что есть и чего нет в PHP r25

Загруженные расширения и проверка вызовами — §2. Константы проверены зондом на tv188b r25 в php_server и php-cgi, device. На других прошивках имена констант CURLOPT_* в strings те же (код r22, r24, r25)281, но определены ли они — см. §7.

Что Определено Не определено Claim
JSON JSON_NUMERIC_CHECK (32), JSON_HEX_TAG (1), JSON_FORCE_OBJECT (16), JSON_ERROR_UTF8 (5) JSON_BIGINT_AS_STRING, JSON_UNESCAPED_UNICODE, JSON_UNESCAPED_SLASHES, JSON_PRETTY_PRINT (устройство r25)282
cURL CURLOPT_ENCODING (10102), CURLOPT_SSLVERSION, CURLOPT_CAINFO, CURLOPT_TIMEOUT_MS, CURLOPT_CONNECTTIMEOUT_MS, CURLOPT_NOSIGNAL, CURLOPT_IPRESOLVE CURLOPT_ACCEPT_ENCODING, CURLOPT_RESOLVE, CURL_SSLVERSION_TLSv1_2, CURLOPT_SSL_VERIFYSTATUS, CURLOPT_TCP_KEEPALIVE, CURLMOPT_PIPELINING, CURLMOPT_MAXCONNECTS (устройство r25)21

4.3. Различия r22, r24 и r25

Только то, для чего есть claims о каждой версии. Если версии в строке нет, значит, о ней claims нет.

Что r22 r24 r25 Claim
Файл libphp5.so e7d22b70… e28ffc74… 4a31ef48… (код r22, r24, r25)103
Строка версии PHP, OpenSSL, PCRE 5.3.6, 1.0.1u, 8.11 то же то же (код r22, r24, r25)283
CA-бандл тот же файл тот же файл тот же файл (код r22, r24, r25)284
Помощник URL в libphp5.so имя _php_add_http_port _php_add_http_port _php_add_fs_prefix_to_http (код r22, r24, r25)285
lcreg в HTTP-помощнике — нет есть (код)286
opensocket в curl_exec — — есть (код r25)287
Запись /tmp/run/%s.pid в php_server — строки нет строка есть (код r25)288
dunelib/utils.php и др. только dune_countries.php config_utils, dune_languages, expr, utils — (код r22, r24)289
bootstrap.php, dune_config.php, dune_plugin.php одинаковы с r24 одинаковы с r22 — (код r22, r24)211
dune_api.php, dune_plugin_fw.php 119788 и 6211 байт 127635 и 6653 байт — (код r22, r24)290
Запуск $FS_PREFIX/config/boot цикл прямо в init через binit.sh — (код)291
dunehd_service (клиент, ELF, обёртка, .env) одинаково одинаково одинаково (код r22, r24, r25)192
php.ini shell_ext: error_reporting — без E_WARNING E_WARNING включён (код)292
По тайм-ауту (r25 — наблюдение, r24 — код) — флаг отмены остановка php_server (устройство r25, код r24)293; см. «Операции плагина, тайм-ауты и php_server»

Sigma и прошивки ниже r22 — короткая справка: SDK для Sigma называет tail -F лога через telnet (SDK)223; вложенные в плагины сборки curl под другие платформы — §9.1.

4.4. Ключи DuneSystem::$properties: SDK и r25

Столбец «По SDK» — страница SDK без указания версии прошивки (по SDK, на r24+ не подтверждено). Столбец «На r25» — tv188b 261021_0117_r25, device, плагин kb_probe5 из flashdata. Куда писать и что сохраняется, — §3.3.

Ключ По SDK На r25 Claim
plugin_name в перечне из шести ключей kb_probe5 (устройство r25, SDK)294
install_dir_path в перечне; от него отсчитываются www/* и www/cgi-bin/* /data/data/com.dunehd.app/flashdata/plugins/kb_probe5 (устройство r25, SDK)295
tmp_dir_path в перечне; каталог под /tmp для временных данных, Dune GUI гарантирует, что он существует /data/data/com.dunehd.app/tmp/plugins/kb_probe5; пустой каталог есть уже после регистрации плагина (устройство r25, SDK)296
data_dir_path в перечне; постоянные данные; на устройствах без System Storage и Flash Memory Storage ключ не задан; после каждой записи — sync /data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5 (устройство r25, SDK)297
plugin_www_url в перечне http://127.0.0.1:80/plugins/kb_probe5/ (устройство r25, SDK)298
plugin_cgi_url в перечне http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/ (устройство r25, SDK)298
sdk_version не в перечне 1.0.0 (устройство r25, SDK)294
few_buttons_remote_type не в перечне 0 (устройство r25, SDK)294

5. Как это делают плагины

Платформа исполнения большинства разобранных плагинов не установлена; приём ниже — то, как написан код, а не гарантия работы на r24+.

Большие числа в JSON. Клиент TorrServer r25 перед json_decode заменяет значения от 10 цифр на строки (код r25)299; RemTor при hack_big_int переписывает все целые значения (код)300, Torrent Center — значения после части ключей (код)301. Приём — §9.4.

Фон. Widget Ext запускает скрипты через shell_exec("<путь> > /dev/null &") (код)209; Torrent Center — вложенный php-cgi -f www/cgi-bin/run.php через HD::asyncExec (код)302; ProIPTV — отдельный PHP-процесс через shell_exec с логом (код)303.

Root. rclone на Android идёт через /system/dunehd/dunehd_service do и передаёт результат JSON-файлом exec_log (код)304; Dune BackUp запускает демон так же, если этот файл есть (код)199.

Часовой пояс. GlobalTV ставит date_default_timezone_set("UTC"), а смещение берёт из date +%z (код)305; копия фреймворка MegaAnime ставит UTC и через ini_set (код)306.

set_time_limit. Anidub.Com и folder_cache вызывают set_time_limit(0) (код)307; m3u.class.php remote-control — наоборот, set_time_limit(15) (код)308.

Пути. Widget Ext смешивает пути с $FS_PREFIX и без него: в boot.sh и в PHP-части — без, в остальных скриптах — с ним (код)309. Lampa bridge в CGI-обёртке задаёт FS_PREFIX по умолчанию /data/data/com.dunehd.app и дополняет LD_LIBRARY_PATH (код)310; по сообщениям автора в комментариях (forum), run_plugin_cgi вызывает файл через sh и на Android 11 (форум)311, а код заявлен совместимым с PHP 5.3 (форум)312.

Вывод. Контроллер Kohana-канала перед возвратом результата делает echo имени операции (код)313: на r25 fd 1 php_server ведёт в его лог (устройство r25)28. Служебный Cleanup ищет потомков процесса по общим pipe-дескрипторам в /proc/<pid>/fd и по PPID (код)314.

6. Расхождения

  • uid CGI: выдержка SDK и r25. В выдержке SDK httpd запускается из rc-скрипта с uid=0 под пользователем www (httpd -u www; при uid www = 80 — httpd -p 80 -u 80 …) (SDK)63, с оговоркой, что не всё из неё поддерживается прошивками (SDK)59. На r25 httpd запущен как $FS_PREFIX/bin/httpd -h … и работает от root (устройство r25)315, CGI плагина — uid 0 (устройство r25)11. conflicts_with нет.
  • «PHP на Dune требует явной таймзоны». Так сказано в комментариях HD::format_timestamp (код r24)316 и библиотеки GlobalTV (код)317. На r25 php_server без TZ даёт Europe/Moscow и MSK (устройство r25)219, а php-cgi с той же Europe/Moscow пишет Warning (устройство r25)220. Связь между комментариями и наблюдениями — related, conflicts_with нет.
  • /flashdata из SDK. SDK даёт команды adb push в /flashdata/plugins/ (SDK)318, а на r25 в корне ФС этого каталога нет (устройство r25)319; стороны связаны conflicts_with, см. BUG-010.
  • Тайм-ауты и судьба процесса. Умолчание 10 с в SDK (SDK)320 против 60 с на r25 (устройство r25)33; остановка php_server на r25 (устройство r25)34 и код r24 — «Операции плагина, тайм-ауты и php_server».
  • PHP_PROC_OPEN_SH и php-cgi. На r24 переменная есть у php-cgi async_worker (устройство r24)186, на r25 её нет у php-cgi из CGI (устройство r25)133. Сравниваются разные прошивки и разные способы запуска; поведение каждого случая на другой прошивке не проверено.
  • /config/… в команде на tv188b r25. shell_exec добавляет $FS_PREFIX к словам /config/… (устройство r25)18, а exec с таким путём первым словом вернул rc=127 и сообщение с путём без префикса (устройство r25)154. По коду r25 путь первым словом и слово после пробела проходят разные ветви _php_add_fs_prefix_to_cmd (код r25)321 (§3.2); стороны связаны как related, conflicts_with нет. В запросе 13 обе стороны наблюдались в одном прогоне одной функцией exec: путь первым словом префикс не получил (устройство r25)31, путь после пробела — получил (устройство r25)32. Объяснение различия позицией слова — гипотеза, §7.

7. Не проверено

Гипотезы (inference) и disputed; кандидаты на проверку на устройстве. Гипотезы о жизни php_server и операциях — «Операции плагина, тайм-ауты и php_server», о CA-бандле — «Реестр ошибок прошивки и SDK» и «HTTP из PHP плагина на r24 и r25» §7.

Утверждение Статус Claim
В запросе 11 после kill php_server и запуска шага bg2 операция handle_user_input отменена через 30.0 с с operation timed out; step_bg2.txt не появился, в steps.txt нет begin bg2. Верификатор: тайм-аут 30 с без end повторился в чистом запросе 12 (§3.8), а отсутствие begin bg2 — только условия запроса 11, где от bg1 ещё жил sleep device, disputed (устройство r25)322
shell_exec("sleep 61 &") в php_server не возвращается, вероятно, потому что фоновый sleep наследует pipe stdout (fd 1) и держит его открытым до конца, а shell_exec ждёт EOF; fd 101/110 php_server перед exec тоже не закрываются (наблюдения — §3.8) inference (вывод r25)323
В r25 _php_add_fs_prefix_to_cmd вызывается из php_exec (exec, system, passthru), zif_shell_exec, zif_popen, zif_proc_open и virtual_popen, то есть exec и shell_exec переписывают команду одной функцией (только перекрёстные ссылки r2) inference (вывод r25)324
rc=127 у exec("/config/kbp11_x.sh first-word") в запросе 11 согласуется с тем, что путь стоит первым словом: функция добавила sh, но $FS_PREFIX к первому слову не дописала (байт перед строкой не разделитель); в shell_exec запроса 6 /config/c стоял после пробела и префикс получил. Различие — по позиции слова, а не по функции. В запросе 13 оба случая повторились в одном прогоне exec (§3.2) inference, verified (вывод r25)325
Подстановка путей и команд на tv188b r24 работает как в APK: тот же libphp5.so, FS_PREFIX задан inference (вывод r24)326
На tv175u r24 libphp5.so пути и команды не переписывает: FS_PREFIX пуст inference (вывод r24)327
В APK файловые функции для /tmp/…, /config/…, /flashdata/…, /fconfig/…, /firmware… работают с $FS_PREFIX/… inference (вывод r24)328
В APK вторая строка-образец — /D/, то есть /D/x превращается в $FS_PREFIX/tmp/mnt/D/x inference (вывод r24)329
В APK подстановке в командах подвержены exec, system, passthru, shell_exec, popen, proc_open inference (вывод r24)330
Программа плагина, запущенная по абсолютному пути вне /firmware/bin/ и /firmware_ext/php/, в APK запускается через sh; связаны ли с этим пустой вывод $FS_PREFIX/bin/wget (устройство r25)331 и rc=126 при вызове полным путём и через sh на r25 (устройство r25)26, claims не говорят inference (вывод r24)332
В APK путь первым словом команды (/config/x.sh) проверяет байт перед началом строки. В коде r25 то же сказано в (код r25)153 (§3.2); на r25 exec с таким путём дал rc=127 (устройство r25)154; трассы подстановки и памяти перед строкой нет, APK и r24 не проверялись inference (вывод r24)333
В APK proc_open с $cwd вида /tmp/… переходит в системный каталог, а не в $FS_PREFIX/…. На r25 cwd=/tmp дал pwd=/tmp (устройство r25)156, но $FS_PREFIX/tmp там же — ссылка на /tmp (устройство r25)171: маршрут cwd не различён; для этого нужен каталог вроде /config, APK и r24 не проверялись inference (вывод r24)334
В APK proc_open с массивом $env теряет FS_PREFIX, PATH, LD_LIBRARY_PATH. На r25 зонд вывел только KB11_E и PATH (устройство r25)157: остальные переменные не проверены, APK и r24 тоже inference (вывод r24)335
В APK realpath, include, tempnam, tmpfile получают FS_PREFIX перед разрешением пути inference (вывод r24)336
В APK chdir, glob, readfile, rename, unlink, chmod, touch и другие применяют подстановку inference (вывод r24)337
/sys/class/net/eth0/address в APK даёт содержимое dune_mac.txt, а не MAC интерфейса inference (вывод r24)338
В APK поток с поиском по include_path обходит подстановку: file_get_contents($f, true) даёт другой результат. На r25 такие чтения вернули 49 и 15678 байт (устройство r25)339; это не показывает, каким путём шло разрешение, APK и r24 не проверялись inference (вывод r24)340
На tv188b r24 окружение php_server не снято: наличие в нём FS_PREFIX, HD_APK, HD_FW_APK, LOG_DIR, TMPDIR, PHP_PROC_OPEN_SH не установлено inference (вывод r24)341
В APK php_server наследует окружение процесса оболочки inference (вывод r24)342
На tv188b r24 php_server исполняет вызов как PHP-код $in = <<<EOL …; $out = …($in); inference (вывод r24)343
На tv188b r24 каталог firmware_ext/php/include должен быть в include_path (на r25 он там есть, §1.1) inference, verified (вывод r24)344
На tv188b r24 системные PHP-файлы подключаются до кода плагина (на r25 — §1.1) inference, disputed (вывод r24)345
На r24 data_dir_path — <хранилище>/plugins_data/<name> (на r25 — §3.3) inference, disputed (вывод r24, r25)346
На r24 tmp_dir_path — $FS_PREFIX/tmp/plugins/<name> (на r25 — §3.3) inference, disputed (вывод r24, r25)347
На tv188b r24 установщик заменяет нерабочие бинарники плагина (bin/php-cgi) ссылками на /firmware/bin inference, disputed (вывод r24)348
На tv188b r25 run_plugin_cgi запускается с $0 — именем файла CGI из каталога с именем плагина inference (вывод r25)349
В плагине zlostnyi-iptv вызов по ссылке на месте вызова в PHP 5.3 — лишь deprecated, поэтому такой код плагина работает на r25 inference (вывод)350
В плагине dunemdb-supplier-movies-rus запущенный из описателя поставщика php-cgi без -c не обязательно читает bin/php.ini inference (вывод)351

В базе нет данных о следующем:

  • полный список расширений (get_loaded_extensions()) и значения ini_get, включая memory_limit, на r24 и на устройствах, кроме tv188b r25 (там — один прогон, §2 и §1.3); наличие функций mcrypt_* (в перечне §2 mcrypt нет (устройство r25)4; строка mcrypt в libphp5.so пяти сборок входит в перечень авторов расширений (код r22, r24, r25)352);
  • вызовы вне таблицы §2: остальные mb_*, SQLite3 с файлом, распаковка ZipArchive; эти же вызовы в php-cgi и на других прошивках; какой интерпретатор получает proc_open в php-cgi r25, где PHP_PROC_OPEN_SH нет (устройство r25)133;
  • окружение и uid php_server на r22; полный снимок окружения php_server r25 у других плагинов и назначение HD_RMCL_DISABLE_CLOPTNS;
  • HTTP_HOST и порт при curl_setopt(CURLOPT_URL) и curl_init($url) из php-cgi в CGI плагина (запрос 13 проверил их из php_server, «HTTP из PHP плагина на r24 и r25» §3.6); процесс без HD_HTTP_LOCAL_PORT и порт не 80; что делает _php_apply_lcreg_to_http при таких входах; окружение php-cgi вне CGI-запроса и на других прошивках (§4.1 — один прогон запроса 13);
  • работают ли на r24+ сервисные плагины из страницы SDK (§1.2), какие у них uid и окружение; код shell_ext r24 ставит и обновляет «сервисные плагины» (код r24)353, но те ли это службы, claims не говорят;
  • можно ли из php_server писать в /tmp/mnt/storage; запись в /sdcard и /config на других прошивках; что происходит с файлами tmp_dir_path, /tmp и data_dir_path при перезагрузке (прогон запроса 11 проверил только am force-stop, §3.3);
  • почему shell_exec("sleep 61 &") не возвращается (гипотеза о наследованном stdout — в таблице выше; снимки запроса 13 — §3.8): возвращается ли он без наследования fd 1 при оставленных fd 101/110, и не мешает ли фоновый процесс с этими дескрипторами следующему php_server;
  • печатает ли PHP_DEBUG=1 строки -C-> EEE о замене команд в лог плагина (печать URL в запросе 13 дошла, §3.11); работает ли lcreg на устройстве и действует ли при отсутствии lcreg.txt (устройство r25)354 ветка ошибки чтения из кода (код r25)355;
  • какое поле читает zif_curl_multi_getcontent в точке падения (сигнал и кадр сбоя сняты в запросе 13, «HTTP из PHP плагина на r24 и r25» §3.6); curl_multi к внешним хостам на r25 и на других прошивках; что делает _php_curl_opensocket_remote; определены ли константы §4.2 на r24 и r22.

  1. fw-tv188b-261021-0117-r25--libphp5.c002 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 значение PHP_VERSION равно 5.3.6. ↩↩

  2. fw-tv188b-261021-0117-r25--libphp5.c001 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка PHP/5.3.6. ↩↩

  3. fw-tv188b-261021-0117-r25.c242 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP 32-битный по целым: в php_server и в php-cgi CGI плагина PHP_INT_SIZE = 4, PHP_INT_MAX = 2147483647. ↩↩

  4. fw-tv188b-261021-0117-r25--libphp5.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 перечислил 32 загруженных расширения: Core, date, ereg, libxml, openssl, pcre, sqlite3, zlib, ctype, curl, dom, fileinfo, filter, hash, iconv, json, mbstring, pcntl, SPL, PDO, posix, Reflection, session, SimpleXML, soap, sockets, standard, tokenizer, xml, xmlreader, xmlwriter, zip. ↩↩↩↩

  5. fw-tv188b-261021-0117-r25--libphp5.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env перечислил те же 32 расширения, что php_server kb_probe11, и дополнительное cgi-fcgi. ↩↩

  6. fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000. ↩

  7. fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin. ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c030 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 одновременно работают три процесса php_server — по одному на плагин (shell_ext, dune-hd.tv, android_apps), все — дочерние com.dunehd.app, с аргументами <плагин> <скрипт> /tmp/run /tmp/plugins/<плагин>/system_properties.txt
    • fw-tv188b-261021-0117-r25.c298 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На снимках tv188b r25 (collect4 и начало collect6, до установки зондов) работают три php_server — shell_ext, dune-hd.tv (программа /flashdata/plugins/dune-hd.tv/i24h.php) и android_apps; все — дочерние процессы com.dunehd.app с Uid 1000.

    ↩↩

  8. fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000. ↩

  9. fw-tv188b-260827-0003-r24.c054 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 три процесса php_server (shell_ext, dune-hd.tv, android_apps) работают от пользователя system с SELinux-меткой u:r:system_app:s0; их родитель — com.dunehd.app (PPID 25631), а UID пакета приложения — 1000 (sharedUser android.uid.system/1000). ↩

  10. fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0. ↩↩↩↩

  11. fw-tv188b-261021-0117-r25.c350 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды зонда из php_server (uid 1000) дают FS_PREFIX=/data/data/com.dunehd.app; which wget и command -v wget возвращают /data/data/com.dunehd.app/bin/wget. ↩↩↩

    • fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог.
    • fw-tv188b-261021-0117-r25.c255 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 во встроенном PHP (php_server и php-cgi CGI плагина) путь /flashdata существует: is_dir('/flashdata') = true, realpath — /data/data/com.dunehd.app/flashdata, хотя в корне ФС (adb shell) /flashdata нет.
    • fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true.

    ↩

  12. fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true. ↩

  13. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 онлайн-обновление сохраняет cookies плагина и его data_dir_path: v2 и v3 получили в plugin_cookies значение kbp7u_mark, записанное v1, файл kbp7u_mark.txt v1 в flashdata/plugins_data/ остался с прежним mtime. ↩

  14. fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true. ↩

  15. fw-tv188b-261021-0117-r25.c376 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 файлы kbp11_persist.txt по 5 байт в tmp_dir_path, /tmp и data_dir_path сохранились после am force-stop и запуска com.dunehd.app (pid 15016 → 22982). ↩↩

  16. fw-tv188b-261021-0117-r25.c253 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP (php_server и php-cgi CGI) в команде shell_exec добавляет $FS_PREFIX (/data/data/com.dunehd.app) к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках ('/tmp/h'), но не к /etc/…, не к x/tmp/f и не к пути в двойных кавычках ("/tmp/g"). ↩↩↩↩↩↩

  17. fw-tv188b-261021-0117-r25.c259 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из php_server PHP-плагина (id — uid=1000(system), context=u:r:system_app:s0) команда shell_exec('/system/dunehd/dunehd_service do id') выводит uid=0(root) gid=0(root) groups=0(root) context=u:r:shell:s0. ↩↩↩

  18. fw-tv188b-261021-0117-r25.c249 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi curl_version() сообщает version 7.67.0, ssl_version OpenSSL/1.0.1u, libz_version 1.2.11, host arm-unknown-linux-androideabi. ↩

  19. fw-tv188b-261021-0117-r25.c250 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi не определены константы CURLOPT_ACCEPT_ENCODING, CURLOPT_RESOLVE, CURL_SSLVERSION_TLSv1_2, CURLOPT_SSL_VERIFYSTATUS, CURLOPT_TCP_KEEPALIVE, CURLMOPT_PIPELINING и CURLMOPT_MAXCONNECTS; CURLOPT_ENCODING (10102), CURLOPT_SSLVERSION, CURLOPT_CAINFO, CURLOPT_TIMEOUT_MS, CURLOPT_CONNECTTIMEOUT_MS, CURLOPT_NOSIGNAL и CURLOPT_IPRESOLVE определены. ↩↩

  20. fw-tv188b-261021-0117-r25.c251 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из php_server и php-cgi файл /firmware/certs/ca-bundle.crt доступен (is_file true; размер 227282, md5 e9dc50a63d76d3c88baa24a4374c4542), как и $FS_PREFIX/firmware/certs/ca-bundle.crt; в нём 143 PEM-блока сертификатов. ↩↩

  21. fw-tv188b-261021-0117-r25--libphp5.c037 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Заголовки CA-бандлов пяти исследованных сборок датируют данные Mozilla 11 октября 2022 года. ↩

    • fw-tv188b-261021-0117-r25.c350 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды зонда из php_server (uid 1000) дают FS_PREFIX=/data/data/com.dunehd.app; which wget и command -v wget возвращают /data/data/com.dunehd.app/bin/wget.
    • fw-tv188b-261021-0117-r25.c351 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/bin/wget — симлинк на $FS_PREFIX/lib/libxxx_busybox.so; /system/bin/libxxx_busybox.so — отдельный файл root:shell размером 987728 байт.

    ↩

  22. fw-tv188b-261021-0117-r25--libphp5.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 which wget из php_server показал /data/data/com.dunehd.app/bin/wget — ссылку на libxxx_busybox.so; вызов по имени wget к /ping компьютера вернул ok и rc=0. ↩

  23. fw-tv188b-261021-0117-r25--libphp5.c074 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 прямой вызов /data/data/com.dunehd.app/bin/wget и вызов sh с тем же путём из php_server оба вернули rc=126 и cannot execute binary file. ↩↩

  24. fw-tv188b-261021-0117-r25.c328 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строки hd_print() из кода плагина попадают в /tmp/run/<плагин>.log с префиксом «[pid] [t] [время]»: hd_print("kbp5: …") зонда дал «[17362] [t17362] [2026-10-26 10:38:00.049061] kbp5: props dumped to /tmp/kb_probe5/props.txt». ↩↩↩

  25. fw-tv188b-261021-0117-r25.c300 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у php_server (снимок /proc//fd снаружи процесса) открыты только fd 0 → /dev/null, fd 1 и 2 → /tmp/run/<плагин>.log и два pipe-канала из argv; так у kb_probe6 и у встроенных shell_ext, dune-hd.tv, android_apps. ↩↩↩

  26. fw-tv188b-261021-0117-r25--libphp5.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 $_SERVER в php_server зонда kb_probe13 содержал только REQUEST_TIME, argv и argc — без переменных окружения; переменные окружения процесса были в $_ENV (один прогон). ↩↩

  27. fw-tv188b-261021-0117-r25.c393 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 из php_server все три вызова — FS_PREFIX=$FS_PREFIX sh $FS_PREFIX/firmware/scripts/ffmpeg.sh -version, sh $FS_PREFIX/firmware/scripts/ffmpeg.sh -version без явного FS_PREFIX и ffmpeg -version без пути — вернули rc=0 и «ffmpeg version 7.1.3» (один прогон). ↩↩

  28. fw-tv188b-261021-0117-r25--libphp5.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 с PHP_DEBUG=1 exec("/config/kbp13_x.sh first-word 2>&1") в php_server вернул rc=127 и «sh: /config/kbp13_x.sh: No such file or directory» — путь первым словом префикс $FS_PREFIX не получил (повтор наблюдения запроса 11, один прогон). ↩↩↩

  29. fw-tv188b-261021-0117-r25--libphp5.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 exec("echo /config/kbp13_x.sh") в php_server напечатал /data/data/com.dunehd.app/config/kbp13_x.sh, а exec("sh /config/kbp13_x.sh after-sh") запустил скрипт с argv0 /data/data/com.dunehd.app/config/kbp13_x.sh: путь после пробела получил $FS_PREFIX (один прогон). ↩↩↩

  30. fw-tv188b-261021-0117-r25.c309 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 операция handle_user_input PHP-плагина без operation_timeout в манифесте (kb_probe5, kb_probe6; ENTER на точке входа с plugin_handle_user_input) стартует с тайм-аутом 60 с: в shell.log «…->handle_user_input(…): start (timeout=60.0s)». ↩↩↩

  31. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. ↩↩↩

    • fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000.
    • fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть.
    • fw-tv188b-261021-0117-r25.c248 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина с php.ini без date.timezone ini date.timezone пуст; date_default_timezone_get() возвращает Europe/Moscow, но date() и date_default_timezone_get() пишут PHP Warning «It is not safe to rely on the system's timezone settings… We selected 'Europe/Moscow' for 'MSK/3.0/no DST' instead».

    ↩

  32. fw-tv188b-261021-0117-r25.c307 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 статическая переменная класса плагина сохраняется между вызовами, пока жив php_server: счётчик KbProbe5Fw::$n, увеличиваемый в каждом call_plugin, рос 1→5 в пяти вызовах процесса 17362 (13:38:00–13:39:25). ↩

  33. fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов. ↩↩↩

  34. fw-tv188b-260827-0003-r24--http-api.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libxxx_php-cgi.so (php-cgi) динамически связан с libphp5.so и содержит лишь CGI-обвязку (php_module_startup, php_execute_script, страница «CGI security») ↩↩

  35. fw-tv188b-261021-0117-r25.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 скрипт global_action plugin_system (boot, boot_end, gui_start) работает под uid 1000(system) с SELinux-контекстом u:r:system_app:s0, текущим каталогом / и переменной окружения FS_PREFIX=/data/data/com.dunehd.app; $0 — абсолютный путь скрипта. ↩↩

  36. fw-tv188b-260827-0003-r24--plugin-loader.c099 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Модуль php_driver.cpp оболочки запускает процесс PHP-сервера: строки «starting PHP-server process», /tmp/plugins/%s/system_properties.txt, /firmware/bin/php_server, «execv (%s) failed» ↩

  37. fw-tv188b-261021-0117-r25.c297 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server нового PHP-плагина из flashdata запускается при первом вызове плагина, а не при его регистрации: после регистрации kb_probe6 процесса php_server kb_probe6 нет, а при первом handle_user_input в shell.log идут «start (timeout=60.0s)», «[kb_probe6] [php] creating...», «server started; pid: 31928.», «ready.» (так же у kb_probe5, pid 17362). ↩

  38. fw-tv188b-260827-0003-r24--php-framework.c303 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Строка использования php_server (libxxx_php_server.so): «php_server » ↩

  39. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c027 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server встраивает PHP через libphp5.so (импорты php_module_startup, php_request_startup, zend_eval_string) и пишет этапы инициализации движка: «php engine: initializing...», «php engine: startup() failed.», «php engine: initialized.», «php engine: exitting from forked child (pid %d)» ↩↩

  40. fw-tv188b-261021-0117-r25.c299 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 два последних аргумента php_server — fd канала на чтение и fd канала на запись: при argv «… 83 109» сервер пишет «[server] reader fd: 83; writer fd: 109», а в /proc fd 83 — pipe, открытый на чтение (lr-x), fd 109 — pipe на запись (l-wx); у kb_probe5 так же «… 90 93» и «reader fd: 90; writer fd: 93». ↩

  41. fw-tv188b-261021-0117-r25.c314 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 к исполнению программы плагина (код верхнего уровня main.php) уже определены классы DunePluginFw и DuneSystem, константа PLUGIN_OP_HANDLE_USER_INPUT и функция hd_print. ↩

  42. fw-tv188b-261021-0117-r25.c311 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server пишет в лог «[server] loading '/firmware_ext/php/<файл>'...», а выполняет «require ('/data/data/com.dunehd.app/firmware_ext/php/<файл>');» — с префиксом $FS_PREFIX; программа плагина так же: loading '/flashdata/plugins/kb_probe5/main.php', require ('/data/data/com.dunehd.app/flashdata/plugins/kb_probe5/main.php'). ↩

  43. fw-tv188b-261021-0117-r25.c312 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в коде main.php kb_probe5 get_included_files() показывает системные файлы как '/system/dunehd/firmware_ext/php/<файл>' (bootstrap.php … dune_config.php), а main.php — как '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5/main.php'; FILE — тот же путь main.php. ↩

  44. fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'». ↩

  45. fw-tv188b-260827-0003-r24--php-framework.c306 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server задаёт include_path по шаблону «ini_set('include_path', '.:%s:%s');»; рядом строка /firmware_ext/php/include ↩

  46. fw-tv188b-261021-0117-r25.c293 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у работающего php_server каталог /tmp/plugins/<плагин> пуст: файла system_properties.txt, путь к которому php_server получает в argv, нет ни при загрузке main.php (kb_probe6, два запуска), ни при первом вызове (kb_probe5). ↩↩

  47. fw-tv188b-260827-0003-r24--http-api.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), а не напрямую: PHP-обработчик плагин должен вызвать сам ↩

  48. fw-tv188b-260827-0003-r24--http-api.c010 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI shell_ext/www/cgi-bin/download_subtitle — двухстрочная обёртка: дописывает .php к SCRIPT_FILENAME и запускает $FS_PREFIX/firmware_ext/php/php-cgi -c . (php.ini из каталога cgi-bin) ↩

  49. fw-tv188b-261021-0117-r25.c237 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-обёртка плагина по образцу download_subtitle (SCRIPT_FILENAME="$SCRIPT_FILENAME.php" и "$FS_PREFIX/firmware_ext/php/php-cgi" -c .) исполняет <имя>.php из www/cgi-bin плагина: FILE и SCRIPT_FILENAME — …/www/cgi-bin/rt.php, getcwd() — каталог www/cgi-bin, php_ini_loaded_file() — www/cgi-bin/php.ini, get_include_path() — «.». ↩↩

  50. fw-tv188b-260827-0003-r24--shell-ext.c023 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · run_async_worker.sh берёт php-cgi из $FS_PREFIX/firmware_ext/php/php-cgi (если его нет — exit 1) и запускает exec php-cgi -f <плагин>/async_worker.php с аргументами скрипта, stdout/stderr — в $FS_PREFIX/tmp/plugins/<плагин>/error.log ↩↩

  51. fw-tv188b-260827-0003-r24.c055 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 фоновый PHP-процесс плагина shell_ext «php-cgi -f $FS_PREFIX/firmware_ext/plugins/shell_ext/async_worker.php start» (pid 26705) работает от пользователя system с меткой u:r:system_app:s0 и PPID 1. ↩↩

  52. doc-sdk-plugins.c095 · doc · any-documented; прошивка — · Встроенный HTTP-сервер отдаёт $install_dir_path/www/* по http:///plugins//* и исполняет CGI из www/cgi-bin/* по http:///cgi-bin/plugins//* ↩

  53. fw-tv188b-261021-0117-r25.c154 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файл www/index.txt плагина отдаётся по http:///plugins/

    /index.txt: HTTP 200, Content-type: text/plain, Accept-Ranges: bytes, тело — содержимое файла. ↩

  54. fw-tv188b-261021-0117-r25.c149 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина, вызванный через http:///cgi-bin/plugins/

    /<файл>, получает PLUGIN_NAME=

    , а PLUGIN_CGI_DIR и SCRIPT_FILENAME — реальные пути $FS_PREFIX/flashdata/plugins/

    /www/cgi-bin и …/www/cgi-bin/<файл>, а не /tmp/www/plugins/

    /… ↩↩↩

  55. doc-sdk-httpd.c001 · doc · any-documented; прошивка — · Документ HTTPD — выдержка из busybox/networking/httpd.c; не все перечисленные в ней возможности поддерживаются текущими прошивками Dune HD. ↩↩

  56. doc-sdk-httpd.c003 · doc · any-documented; прошивка — · URL, начинающийся с /cgi-bin/, считается CGI-скриптом; сервер переходит в каталог скрипта и запускает его, установив QUERY_STRING и другие переменные окружения. ↩

  57. doc-sdk-httpd.c004 · doc · any-documented; прошивка — · За описанием переменных окружения CGI документ отсылает к спецификации NCSA http://hoohoo.ncsa.uiuc.edu/cgi/env.html. ↩

  58. fw-tv188b-261021-0117-r25.c150 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина запускается с $0, равным абсолютному SCRIPT_FILENAME ($FS_PREFIX/flashdata/plugins/

    /www/cgi-bin/<файл>), и текущим каталогом PLUGIN_CGI_DIR ($FS_PREFIX/flashdata/plugins/

    /www/cgi-bin). ↩

  59. doc-sdk-httpd.c002 · doc · any-documented; прошивка — · В выдержке busybox httpd демон запускается из rc-скрипта с uid=0 под пользователем www (httpd -u www); при uid пользователя www = 80 это эквивалентно httpd -p 80 -u 80 -h /www -c /etc/httpd.conf -r "Web Server Authentication". ↩↩

  60. doc-sdk-service-plugins.c001 · doc · any-documented; прошивка — · Документ обращается к сервисным плагинам HTTP-запросами к http://localhost или http://127.0.0.1 по пути /cgi-bin/plugins/<имя_плагина>/do?cmd=…. ↩

    • doc-sdk-service-plugins.c002 · doc · any-documented; прошивка — · mediainfo_service по cmd=get_duration получает длительность медиафайла; параметр file — UNIX-путь к видеофайлу (в примере /D/some folder/file.avi).
    • doc-sdk-service-plugins.c003 · doc · any-documented; прошивка — · mediainfo_service по cmd=make_screenshot сохраняет скриншот в screenshot_file, берёт его с позиции screenshot_pos секунд и размера screenshot_size.

    ↩

  61. doc-sdk-service-plugins.c002 · doc · any-documented; прошивка — · mediainfo_service по cmd=get_duration получает длительность медиафайла; параметр file — UNIX-путь к видеофайлу (в примере /D/some folder/file.avi). ↩

  62. doc-sdk-service-plugins.c004 · doc · any-documented; прошивка — · 3g_service поддерживает команды send_sms, status, list_sms, delete_sms, set_sms_storage, start_3g и stop_3g. ↩

    • doc-sdk-service-plugins.c005 · doc · any-documented; прошивка — · 3g_service по cmd=status с флагами get_sim_status, get_imsi, get_imei, get_signal возвращает sim_status, imsi, imei, signal_strength, signal_ber; ответ завершается result = ok.
    • doc-sdk-service-plugins.c006 · doc · any-documented; прошивка — · 3g_service по cmd=status также сообщает have_main_connection и have_3g_connection — доступность интернета через основное подключение и 3G.

    ↩

  63. doc-sdk-service-plugins.c007 · doc · any-documented; прошивка — · Фоновое 3G-подключение включается cmd=start_3g и выключается cmd=stop_3g; при каждой загрузке STB оно выключено, постоянно поддерживается и используется для интернета только тогда, когда основное подключение доступа не даёт. ↩

  64. doc-sdk-service-plugins.c008 · doc · any-documented; прошивка — · Доступность интернета фоновое 3G-подключение проверяет через ping google DNS 8.8.8.8; переключение между основным и 3G-подключением происходит автоматически в обе стороны. ↩

  65. doc-sdk-service-plugins.c009 · doc · any-documented; прошивка — · При включённом фоновом 3G-подключении не поддерживаются приём и передача SMS; качество сигнала определяется только в момент включения; горячее отключение USB-модема поддерживается только при выключенном фоновом 3G. ↩

  66. doc-sdk-service-plugins.c010 · doc · any-documented; прошивка — · dvb_service по cmd=set_system_time с media_url DVB-канала устанавливает системное время; запрос нельзя выполнять одновременно с воспроизведением DVB-канала. ↩

  67. doc-sdk-service-plugins.c011 · doc · any-documented; прошивка — · Альтернатива вызову dvb_service — автозапуск скрипта при загрузке STB: создать /config/boot, скачать dvb_time, сделать его исполняемым и указать в нём DVB media_url. ↩

  68. doc-sdk-service-plugins.c012 · doc · any-documented; прошивка — · file_service поддерживает команды delete_file, get_info и read_text_file. ↩

  69. doc-sdk-service-plugins.c013 · doc · any-documented; прошивка — · file_service cmd=delete_file удаляет файл и возвращает result = ok; попытка удалить директорию даёт ошибку. ↩

  70. doc-sdk-service-plugins.c014 · doc · any-documented; прошивка — · file_service cmd=get_info возвращает type (regular_file, regular empty file, directory и специальные значения), size, mtime в unix timestamp и result = ok; ссылки разыменовываются. ↩

  71. doc-sdk-service-plugins.c015 · doc · any-documented; прошивка — · file_service cmd=read_text_file читает текстовый файл; содержимое идёт после строки-разделителя @data; при max_length <= 0 возвращается файл целиком, иначе первые max(file_size, max_length) байт. ↩

  72. doc-sdk-service-plugins.c016 · doc · any-documented; прошивка — · При ошибке file_service возвращает result = error и error_message = command '<cmd>' failed. ↩

    • fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000.
    • fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin.

    ↩↩

    • fw-tv188b-261021-0117-r25--libphp5.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 показал max_execution_time=0, memory_limit=128M, include_path=.::/data/data/com.dunehd.app/firmware_ext/php/include и magic_quotes_gpc=1.
    • fw-tv188b-261021-0117-r25--libphp5.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env показал max_execution_time=30, memory_limit=128M, include_path=. и magic_quotes_gpc=0.

    ↩↩↩↩↩↩

  73. fw-tv188b-261021-0117-r25--libphp5.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 шаг g_env в php_server зонда kb_probe13 записал php_sapi_name() = hd, PHP_VERSION 5.3.6, getcwd() = / и posix_getuid() = 1000 (один прогон). ↩

  74. fw-tv188b-261021-0117-r25.c391 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 php-cgi (/data/data/com.dunehd.app/firmware_ext/php/php-cgi, php_sapi_name cgi-fcgi, uid 0), запущенный busybox httpd для /cgi-bin/plugins/kb_probe13/env, имел FS_PREFIX, HD_HTTP_LOCAL_PORT=80, LD_LIBRARY_PATH, PATH, LOG_DIR, HD_APK, PLUGIN_NAME, PLUGIN_CGI_DIR и DUNEHD_SERVICE_DONT_FORK, а getenv(HOME) и getenv(TMPDIR) вернули false (один прогон). ↩↩

    • fw-tv188b-261021-0117-r25.c298 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На снимках tv188b r25 (collect4 и начало collect6, до установки зондов) работают три php_server — shell_ext, dune-hd.tv (программа /flashdata/plugins/dune-hd.tv/i24h.php) и android_apps; все — дочерние процессы com.dunehd.app с Uid 1000.
    • fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0.

    ↩

    • fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000.
    • fw-tv188b-261021-0117-r25.c259 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из php_server PHP-плагина (id — uid=1000(system), context=u:r:system_app:s0) команда shell_exec('/system/dunehd/dunehd_service do id') выводит uid=0(root) gid=0(root) groups=0(root) context=u:r:shell:s0.
    • fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000.
    • fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 перечислил 32 загруженных расширения: Core, date, ereg, libxml, openssl, pcre, sqlite3, zlib, ctype, curl, dom, fileinfo, filter, hash, iconv, json, mbstring, pcntl, SPL, PDO, posix, Reflection, session, SimpleXML, soap, sockets, standard, tokenizer, xml, xmlreader, xmlwriter, zip.
    • fw-tv188b-261021-0117-r25--libphp5.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env перечислил те же 32 расширения, что php_server kb_probe11, и дополнительное cgi-fcgi.

    ↩

    • fw-tv188b-261021-0117-r25.c259 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из php_server PHP-плагина (id — uid=1000(system), context=u:r:system_app:s0) команда shell_exec('/system/dunehd/dunehd_service do id') выводит uid=0(root) gid=0(root) groups=0(root) context=u:r:shell:s0.
    • fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c003 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 php_sapi_name возвращает hd.
    • fw-tv188b-261021-0117-r25.c239 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина PHP_VERSION = 5.3.6, php_sapi_name() = cgi-fcgi.
    • fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000.
    • fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c002 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 значение PHP_VERSION равно 5.3.6.
    • fw-tv188b-261021-0117-r25.c239 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина PHP_VERSION = 5.3.6, php_sapi_name() = cgi-fcgi.
    • fw-tv188b-261021-0117-r25.c242 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP 32-битный по целым: в php_server и в php-cgi CGI плагина PHP_INT_SIZE = 4, PHP_INT_MAX = 2147483647.
    • fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000.
    • fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin.

    ↩

    • fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'».
    • fw-tv188b-261021-0117-r25.c237 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-обёртка плагина по образцу download_subtitle (SCRIPT_FILENAME="$SCRIPT_FILENAME.php" и "$FS_PREFIX/firmware_ext/php/php-cgi" -c .) исполняет <имя>.php из www/cgi-bin плагина: FILE и SCRIPT_FILENAME — …/www/cgi-bin/rt.php, getcwd() — каталог www/cgi-bin, php_ini_loaded_file() — www/cgi-bin/php.ini, get_include_path() — «.».
    • fw-tv188b-261021-0117-r25--libphp5.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 показал max_execution_time=0, memory_limit=128M, include_path=.::/data/data/com.dunehd.app/firmware_ext/php/include и magic_quotes_gpc=1.
    • fw-tv188b-261021-0117-r25--libphp5.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env показал max_execution_time=30, memory_limit=128M, include_path=. и magic_quotes_gpc=0.

    ↩

    • fw-tv188b-261021-0117-r25.c247 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server PHP-плагина ini date.timezone = Europe/Moscow и date_default_timezone_get() = Europe/Moscow при getenv('TZ') = false; date() даёт MSK +0300, getprop persist.sys.timezone — Europe/Moscow.
    • fw-tv188b-261021-0117-r25.c248 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина с php.ini без date.timezone ini date.timezone пуст; date_default_timezone_get() возвращает Europe/Moscow, но date() и date_default_timezone_get() пишут PHP Warning «It is not safe to rely on the system's timezone settings… We selected 'Europe/Moscow' for 'MSK/3.0/no DST' instead».

    ↩

    • fw-tv188b-261021-0117-r25.c257 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server PHP-плагинов (kb_probe6, shell_ext, dune-hd.tv, android_apps) PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh; $FS_PREFIX/bin/sh — ссылка на /data/data/com.dunehd.app/lib/libxxx_bash.so.
    • fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть.

    ↩

    • fw-tv188b-261021-0117-r25.c390 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 /proc/self/environ php_server зонда kb_probe13 содержал, кроме общих с CGI переменных, HOME=/data/user/0/com.dunehd.app/app_vlc, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app, APK_PACKAGE_NAME=com.dunehd.app, PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, LOG_MAX_FILE_SIZE=3072000 и HD_RMCL_DISABLE_CLOPTNS=1 (один прогон).
    • fw-tv188b-261021-0117-r25--libphp5.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 $_SERVER в php_server зонда kb_probe13 содержал только REQUEST_TIME, argv и argc — без переменных окружения; переменные окружения процесса были в $_ENV (один прогон).
    • fw-tv188b-261021-0117-r25.c391 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 php-cgi (/data/data/com.dunehd.app/firmware_ext/php/php-cgi, php_sapi_name cgi-fcgi, uid 0), запущенный busybox httpd для /cgi-bin/plugins/kb_probe13/env, имел FS_PREFIX, HD_HTTP_LOCAL_PORT=80, LD_LIBRARY_PATH, PATH, LOG_DIR, HD_APK, PLUGIN_NAME, PLUGIN_CGI_DIR и DUNEHD_SERVICE_DONT_FORK, а getenv(HOME) и getenv(TMPDIR) вернули false (один прогон).
    • fw-tv188b-261021-0117-r25.c392 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 набор имён переменных в /proc/self/environ php-cgi совпал с набором имён в env sh-обёртки того же CGI-запроса (различие только в значении «_»): окружение php-cgi — это окружение sh-CGI busybox httpd (один прогон).

    ↩

    • fw-tv188b-261021-0117-r25.c326 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ошибки и предупреждения PHP в коде плагина php_server пишет в /tmp/run/<плагин>.log строкой вида «[<полный путь файла>:<строка>] [E_WARNING] …» / «[…] [E_ERROR] …».
    • fw-tv188b-260827-0003-r24--http-api.c005 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · run_plugin_cgi направляет stderr CGI-скриптов плагинов в $FS_PREFIX/tmp/dune_apk_cgi_err.log; при размере больше 10000 байт лог переименовывается в .old

    ↩

    • fw-tv188b-261021-0117-r25.c253 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP (php_server и php-cgi CGI) в команде shell_exec добавляет $FS_PREFIX (/data/data/com.dunehd.app) к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках ('/tmp/h'), но не к /etc/…, не к x/tmp/f и не к пути в двойных кавычках ("/tmp/g").
    • fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог.

    ↩

  75. fw-tv188b-261021-0117-r25.c179 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды поставщика из стороннего плагина (bin без cd) выполняются с uid 1000 и текущим каталогом /. ↩

  76. fw-tv188b-260827-0003-r24.c057 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 демон dunehd_service (pid 587) работает от root с SELinux-меткой u:r:shell:s0 и PPID 1. ↩

    • fw-tv188b-260827-0003-r24.c058 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 HTTP-сервер «httpd -h /data/data/com.dunehd.app/tmp/www» (pid 1843) работает от root с SELinux-меткой u:r:shell:s0 и PPID 1.
    • fw-tv188b-261021-0117-r25.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd запущен как «$FS_PREFIX/bin/httpd -h /data/data/com.dunehd.app/tmp/www», то есть корень веб-сервера — $FS_PREFIX/tmp/www; процесс работает от root (метка u:r:shell:s0, PPID 1).

    ↩

  77. fw-tv188b-260827-0003-r24.c062 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 com.dunehd.app (pid 25631), его процесс :bg (pid 1590) и com.dunehd.systemui (pid 4952) работают от пользователя system с SELinux-меткой u:r:system_app:s0; userId пакета com.dunehd.app — 1000 (sharedUser android.uid.system/1000). ↩

  78. fw-tv188b-260827-0003-r24.c067 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении com.dunehd.app (pid 25631) PATH=/product/bin:… (без $FS_PREFIX), ANDROID_SOCKET_zygote=18 и ANDROID_SOCKET_usap_pool_primary=19; переменных FS_PREFIX, HD_APK, HD_FW_APK, LOG_DIR, TMPDIR, PHP_PROC_OPEN_SH и LD_LIBRARY_PATH в блоке нет. ↩↩

  79. fw-tv188b-261021-0117-r25.c239 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина PHP_VERSION = 5.3.6, php_sapi_name() = cgi-fcgi. ↩

  80. fw-tv188b-261021-0117-r25--libphp5.c006 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует версия OpenSSL 1.0.1u от 22 Sep 2016. ↩

  81. fw-tv188b-261021-0117-r25--libphp5.c007 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка версии PCRE 8.11 2010-12-10. ↩

  82. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c028 · code · android-atv, android-dune-fw; прошивка 260724_0207_r24, 260827_0003_r24, 240619_0210_r22, 250815_1012_r22, 261021_0117_r25 · libphp5.so APK 260724_0207_r24 совпадает по sha256 (e28ffc74…) с libphp5.so прошивок tv175u 260724_0207_r24 и tv188b 260827_0003_r24; в tv175u 240619_0210_r22 и tv188b 250815_1012_r22 файл другой (e7d22b70…), в tv188b 261021_0117_r25 — тоже (4a31ef48…) ↩↩↩

    • fw-tv188b-261021-0117-r25--libphp5.c009 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена JSON: json_encode, json_decode, json_last_error.
    • fw-tv188b-261021-0117-r25.c244 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi json_decode() целых вне 32-битного диапазона (2147483648, 4294967296, 9007199254740993, 1793009215123, [3000000000]) возвращает integer 2147483647, а -2147483649 — integer -2147483648; json_last_error() при этом 0.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c010 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена cURL: curl_init, curl_copy_handle, curl_version, curl_setopt, curl_setopt_array, curl_exec, curl_getinfo, curl_error, curl_errno, curl_close.
    • fw-tv188b-261021-0117-r25.c249 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi curl_version() сообщает version 7.67.0, ssl_version OpenSSL/1.0.1u, libz_version 1.2.11, host arm-unknown-linux-androideabi.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c011 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена PHP cURL multi: curl_multi_init, curl_multi_add_handle, curl_multi_remove_handle, curl_multi_select, curl_multi_exec, curl_multi_getcontent, curl_multi_info_read, curl_multi_close.
    • fw-tv188b-261021-0117-r25.c234 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку), выполнивший curl_multi на 4 хендла к httpd самого плеера (http://127.0.0.1/plugins/…, http://127.0.0.1:80/cgi-bin/plugins/…, http://localhost/cgi-bin/plugins/…), доходит до curl_multi_info_read и получает все 4 сообщения с msg=1 result=0, после чего php-cgi завершается с кодом 139 и в /tmp/dune_apk_cgi_err.log появляется «Segmentation fault»; повторный запуск дал то же самое.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c014 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена mbstring: mb_strlen, mb_substr, mb_convert_encoding, mb_detect_encoding, mb_check_encoding.
    • fw-tv188b-261021-0117-r25--libphp5.c062 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server kb_probe11 вызов mb_strlen для двух букв UTF-8 вернул 2.

    ↩

  83. fw-tv188b-261021-0117-r25--libphp5.c015 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена iconv: iconv_strlen, iconv_substr, iconv_mime_decode, iconv_get_encoding, iconv_set_encoding. ↩

  84. fw-tv188b-261021-0117-r25--libphp5.c016 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена PCRE: preg_match, preg_match_all, preg_replace, preg_split, preg_last_error. ↩

    • fw-tv188b-261021-0117-r25--libphp5.c017 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена OpenSSL: openssl_encrypt, openssl_decrypt, openssl_sign, openssl_verify, openssl_random_pseudo_bytes.
    • fw-tv188b-261021-0117-r25.c331 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 openssl_x509_parse() в php_server и в php-cgi даёт validTo_time_t = -1 (gmdate — 1969-12-31 23:59:59) у всех сертификатов /firmware/certs/ca-bundle.crt со сроком позже 2038-01-19 03:14:07 UTC (57 из 143), а более ранние сроки переводит верно; 2147483647 (2038-01-19 03:14:07) — настоящий срок сертификата GlobalSign.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c018 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена pcntl: pcntl_fork, pcntl_waitpid, pcntl_signal, pcntl_signal_dispatch, pcntl_exec.
    • fw-tv188b-261021-0117-r25--libphp5.c066 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 pcntl_fork из php_server создал потомка 22745; после posix_kill(getmypid(),9) в потомке pcntl_waitpid вернул 22745 и status=9.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c019 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена posix: posix_getuid, posix_getpid, posix_kill, posix_setuid.
    • fw-tv188b-261021-0117-r25--libphp5.c004 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 posix_getuid возвращает 1000.
    • fw-tv188b-261021-0117-r25--libphp5.c066 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 pcntl_fork из php_server создал потомка 22745; после posix_kill(getmypid(),9) в потомке pcntl_waitpid вернул 22745 и status=9.

    ↩

  85. fw-tv188b-261021-0117-r25--libphp5.c020 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена sockets: socket_create, socket_connect, socket_select, socket_read, socket_write. ↩

  86. fw-tv188b-261021-0117-r25--libphp5.c021 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена XML: simplexml_load_string, xml_parser_create, libxml_use_internal_errors. ↩

    • fw-tv188b-261021-0117-r25--libphp5.c022 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена классов XML/SOAP/ZIP/SQLite: DOMDocument, SoapClient, ZipArchive, SQLite3.
    • fw-tv188b-261021-0117-r25--libphp5.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server SQLite3(:memory:)->querySingle(SELECT 1) вернул 1.
    • fw-tv188b-261021-0117-r25--libphp5.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server ZipArchive::open с CREATE вернул true.
    • fw-tv188b-261021-0117-r25--libphp5.c065 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server DOMDocument::loadXML для вернул true.

    ↩

  87. fw-tv188b-261021-0117-r25--libphp5.c023 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена hash, сессий и zlib: hash_hmac, hash_file, session_start, gzcompress, gzuncompress. ↩

  88. fw-tv188b-261021-0117-r25--libphp5.c062 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server kb_probe11 вызов mb_strlen для двух букв UTF-8 вернул 2. ↩

  89. fw-tv188b-261021-0117-r25--libphp5.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server SQLite3(:memory:)->querySingle(SELECT 1) вернул 1. ↩

  90. fw-tv188b-261021-0117-r25--libphp5.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server ZipArchive::open с CREATE вернул true. ↩

  91. fw-tv188b-261021-0117-r25--libphp5.c065 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server DOMDocument::loadXML для вернул true. ↩

  92. fw-tv188b-261021-0117-r25--libphp5.c066 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 pcntl_fork из php_server создал потомка 22745; после posix_kill(getmypid(),9) в потомке pcntl_waitpid вернул 22745 и status=9. ↩

  93. fw-tv188b-261021-0117-r25--libphp5.c067 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 popen(echo kb11-popen,r) вернул строку kb11-popen, pclose — 0. ↩

  94. fw-tv188b-261021-0117-r25--libphp5.c068 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 proc_open без cwd/env выполнил sh-команду с rc=0; readlink /proc/$$/exe в ней показал /system/bin/libxxx_bash.so. ↩↩

  95. fw-tv188b-261021-0117-r25--libphp5.c008 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена библиотек-зависимостей: libxml2.so.2, libcurl.so.5, libssl.so.1.0.0, libcrypto.so.1.0.0, libiconv.so.2, libz.so. ↩

  96. fw-tv188b-261021-0117-r25.c241 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware_ext/php/php-cgi, запущенный из adb shell (adbd root) с LD_LIBRARY_PATH=$FS_PREFIX/lib:$LD_LIBRARY_PATH, не стартует — «CANNOT LINK EXECUTABLE … library "libiconv.so.2" not found: needed by main executable», код 1 (и с -v, и с -q -f). ↩↩

  97. fw-tv188b-261021-0117-r25.c243 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi целочисленный литерал 3000000000 в PHP-коде даёт integer 2147483647 (gettype integer, json_encode(3000000000) и json_encode(1793009215123) — 2147483647), тогда как PHP_INT_MAX + 1 даёт 2147483648, а time() * 1000 — 13-значное число без обрезки. ↩

  98. fw-tv188b-261021-0117-r25.c244 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi json_decode() целых вне 32-битного диапазона (2147483648, 4294967296, 9007199254740993, 1793009215123, [3000000000]) возвращает integer 2147483647, а -2147483649 — integer -2147483648; json_last_error() при этом 0. ↩↩

  99. fw-tv188b-261021-0117-r25.c245 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi json_decode() целого 12345678901234567890 возвращает double 1.2345678901235E+19 при json_last_error() = 0. ↩

  100. fw-tv188b-261021-0117-r25.c288 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 DuneSystem::$properties у PHP-плагина kb_probe5 из flashdata содержит 8 ключей: sdk_version '1.0.0', plugin_name 'kb_probe5', install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url, few_buttons_remote_type '0'. ↩

    • fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml.
    • fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true.
    • fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true.

    ↩

  101. fw-tv188b-261021-0117-r25.c289 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у kb_probe5 plugin_www_url = 'http://127.0.0.1:80/plugins/kb_probe5/', plugin_cgi_url = 'http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/' — с явным портом 80. ↩

  102. fw-tv188b-260827-0003-r24--php-framework.c071 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD читает переменные окружения: is_apk — HD_APK, is_fw_apk — HD_FW_APK, get_apk_package_name — APK_PACKAGE_NAME, get_fs_prefix — FS_PREFIX (пустая строка, если не задана); is_limited_apk = apk и не fw_apk; with_network_manager = не limited_apk ↩

  103. fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть. ↩↩↩↩

  104. fw-tv175u-260724-0207-r24.c023 · code · tv175u, android; прошивка 260724_0207_r24 · Скрипт /system/dunehd/init не выставляет HD_APK, HD_FW_APK и FS_PREFIX: перед запуском dunehd_service он экспортирует только PATH, LD_LIBRARY_PATH=/firmware/lib:/lib:/usr/lib и LOG_DIR=/tmp/run ↩

  105. fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог. ↩↩↩

    • fw-tv188b-261021-0117-r25.c255 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 во встроенном PHP (php_server и php-cgi CGI плагина) путь /flashdata существует: is_dir('/flashdata') = true, realpath — /data/data/com.dunehd.app/flashdata, хотя в корне ФС (adb shell) /flashdata нет.
    • fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins.

    ↩

  106. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c001 · code · android-atv; прошивка 260724_0207_r24 · В libphp5.so APK функция _php_get_fs_prefix(path) возвращает getenv("FS_PREFIX"), только если path начинается с '/' и _php_path_needs_prefix.part.0(path) вернула не 0; иначе возвращает NULL ↩

  107. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c007 · code · android-atv; прошивка 260724_0207_r24 · _php_path_needs_prefix.part.0(path) возвращает 1, если str_starts_with(path, s) не 0 для одной из строк "/tmp", "/firmware", "/config", "/flashdata", "/fconfig" или strcmp(path, s) равен 0 для "/system/dunehd/init" и "/D"; иначе возвращает 1 или 0 по результату str_starts_with(path, <строка по адресу 0x353448>) — того же второго образца, что в _php_get_fs_prefix2 ↩

  108. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c032 · code · android-atv; прошивка 260724_0207_r24 · Корни в _php_path_needs_prefix.part.0 сравниваются как префикс без проверки границы каталога: str_starts_with(path, s) возвращает результат strncmp(path, s, strlen(s)) == 0, поэтому проверку проходят и /firmware_ext/…, /tmpX, /config2/…, /flashdata_old/… ↩

  109. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c002 · code · android-atv; прошивка 260724_0207_r24 · _php_get_fs_prefix2(path) при заданной FS_PREFIX возвращает строку "/tmp/mnt", если path равен "/D" (strcmp) или начинается со второй строки-образца (str_starts_with); в остальных случаях и без FS_PREFIX — NULL ↩

  110. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c006 · code · android-atv; прошивка 260724_0207_r24 · Без переменной FS_PREFIX _php_add_fs_prefix путь под корнями не меняет: возвращает *out, если он не NULL, иначе исходный path ↩

  111. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c026 · code · android-atv; прошивка 260724_0207_r24 · _php_add_fs_prefix вызывают в 24 местах 22 функции: _php_curl_setopt (2 вызова), zif_simplexml_load_file, zim_simplexml_element_asXML, zif_chdir, zif_glob, zif_readfile, zif_rename (2), zif_unlink, php_do_chgrp.isra.1, php_do_chown.isra.2, zif_disk_total_space, zif_disk_free_space, zif_chmod, zif_touch, fcn.0020d018 (у Ghidra — php_clear_stat_cache), php_stat, _php_stream_mkdir, _php_stream_rmdir, _php_stream_stat_path, _php_stream_opendir, _php_stream_open_wrapper_ex и zend_stream_open ↩

  112. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c025 · code · android-atv; прошивка 260724_0207_r24 · virtual_file_ex(state, path, …) для path, начинающегося с '/', собирает во внутреннем буфере строку _php_get_fs_prefix(path) + _php_get_fs_prefix2(path) + path (префиксы — если не NULL; _php_get_fs_prefix2 вызывается, только если первый не NULL) и передаёт этот буфер в tsrm_realpath_r; относительный path дописывается через '/' к пути из state без префиксов ↩

  113. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c033 · code · android-atv; прошивка 260724_0207_r24 · virtual_file_ex вызывают в 22 местах 21 функция: virtual_chdir, virtual_realpath, virtual_filepath_ex, virtual_fopen, virtual_access, virtual_utime, virtual_chmod, virtual_chown, virtual_open, virtual_creat, virtual_rename (2 вызова), virtual_stat, virtual_lstat, virtual_unlink, virtual_mkdir, virtual_rmdir, virtual_opendir, tsrm_realpath, expand_filepath_ex, php_do_open_temporary_file и php_zip_extract_file.isra.3 ↩

  114. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c040 · code · android-atv; прошивка 260724_0207_r24 · _php_stream_open_wrapper_ex(path, mode, options, …) при сброшенном бите 1 в options пропускает path через _php_add_fs_prefix до php_stream_locate_url_wrapper; при установленном бите 1 _php_add_fs_prefix не вызывает, а разрешает path через указатель zend_resolve_path ↩

  115. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c041 · code · android-atv; прошивка 260724_0207_r24 · Если mode начинается с 'r', path равен "/sys/class/net/eth0/address" и переменная HD_APK задана (php_is_apk() не 0), _php_stream_open_wrapper_ex при сброшенном бите 1 в options подменяет path на "/tmp/run/dune_mac.txt" и уже его пропускает через _php_add_fs_prefix ↩

  116. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c044 · code · android-atv; прошивка 260724_0207_r24 · php_is_apk() возвращает 1, если getenv("HD_APK") не NULL, иначе 0; содержимое значения HD_APK не проверяется. ↩

  117. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c008 · code · android-atv; прошивка 260724_0207_r24 · _php_add_fs_prefix_to_cmd вызывают php_exec, zif_shell_exec, zif_popen, zif_proc_open и virtual_popen (перекрёстные ссылки radare2 в листинге) ↩

  118. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c014 · code · android-atv; прошивка 260724_0207_r24 · _php_add_fs_prefix_to_cmd ищет в команде символы '/' и проверяет путь, только если перед '/' стоит пробел, '!', '&', апостроф, '(', ')', ';', '<', '>' или обратная кавычка; после двойной кавычки, '=', '|', ':', табуляции и прочих символов путь не переписывается ↩

  119. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c011 · code · android-atv; прошивка 260724_0207_r24 · Если первое слово команды оканчивается на /php-cgi (strstr "/php-cgi " раньше первого пробела), _php_add_fs_prefix_to_cmd заменяет его на $FS_PREFIX/firmware_ext/php/php-cgi, дописывает « -c » и исходный каталог этого php-cgi (часть слова до /php-cgi, без префикса), а остаток команды разбирает дальше ↩

  120. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c012 · code · android-atv; прошивка 260724_0207_r24 · Если команда начинается с $FS_PREFIX или с пути, для которого _php_path_needs_prefix.part.0 не 0, и этот путь (после префикса) не начинается с /firmware/bin/ или /firmware_ext/php/, _php_add_fs_prefix_to_cmd начинает результат со строки «sh » (3 байта) ↩

  121. fw-tv188b-261021-0117-r25--libphp5.c085 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd, если команда начинается с '/' и путь требует префикса (_php_path_needs_prefix.part.0), но не начинается с /firmware/bin/ или /firmware_ext/php/, ставит в начало результата «sh ». ↩

  122. fw-tv188b-261021-0117-r25--libphp5.c086 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd дописывает $FS_PREFIX к пути у '/', только если байт перед '/' — пробел, '!', '&', апостроф, '(', ')', ';', '<', '>' или '`'; для '/' в первом символе команды проверяется байт перед началом строки. ↩↩

  123. fw-tv188b-261021-0117-r25--libphp5.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 exec команды /config/kbp11_x.sh first-word из php_server вернул rc=127 и sh: /config/kbp11_x.sh: No such file or directory; file_get_contents того же пути с use_include_path=true прочитал 49 байт. ↩↩↩

  124. fw-tv188b-261021-0117-r25--libphp5.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 file_get_contents(lib/kbp11_steps.php,true) из php_server прочитал 15678 байт. ↩

  125. fw-tv188b-261021-0117-r25--libphp5.c078 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 proc_open с cwd=/tmp из php_server вернул rc=0, pwd=/tmp и увидел каталог kb_probe11. ↩↩

  126. fw-tv188b-261021-0117-r25--libphp5.c079 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 proc_open с env={KB11_E:one} из php_server вернул rc=0, KB11_E=one и PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.. ↩↩

  127. fw-tv188b-261021-0117-r25.c354 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) PATH=/data/data/com.dunehd.app/firmware/bin:/data/data/com.dunehd.app/bin:/bin:/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin. ↩↩↩

  128. fw-tv188b-261021-0117-r25--libphp5.c093 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 shell_exec("echo x; /config/kbp13_x.sh after-semicolon") выполнил скрипт по пути /data/data/com.dunehd.app/config/kbp13_x.sh: путь после «; » получил $FS_PREFIX (один прогон). ↩↩

    • fw-tv188b-261021-0117-r25--libphp5.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 с PHP_DEBUG=1 exec("/config/kbp13_x.sh first-word 2>&1") в php_server вернул rc=127 и «sh: /config/kbp13_x.sh: No such file or directory» — путь первым словом префикс $FS_PREFIX не получил (повтор наблюдения запроса 11, один прогон).
    • fw-tv188b-261021-0117-r25--libphp5.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 exec("echo /config/kbp13_x.sh") в php_server напечатал /data/data/com.dunehd.app/config/kbp13_x.sh, а exec("sh /config/kbp13_x.sh after-sh") запустил скрипт с argv0 /data/data/com.dunehd.app/config/kbp13_x.sh: путь после пробела получил $FS_PREFIX (один прогон).

    ↩

  129. fw-tv188b-261021-0117-r25--libphp5.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 после шага g_subst с PHP_DEBUG=1 grep «=H=>» по /tmp/run/kb_probe13.log не нашёл ни одной строки; строк о замене команд в выводе нет (один прогон). ↩↩

    • fw-tv188b-261021-0117-r25.c147 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после регистрации плагина из $FS_PREFIX/flashdata/plugins появляется пустой каталог /tmp/plugins/

      (владелец system).

    • fw-tv188b-261021-0117-r25.c148 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после регистрации плагина, положенного через adb push, появляется каталог $FS_PREFIX/flashdata/plugins_data/

      (владелец system).

    ↩

    • fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml.
    • fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'».
    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c073 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при замене установленного плагина (fcn.00291428) старому вызывается nav_plugin_delete_plugin_data (fcn.00261034) с флагом 1: удаляются только каталоги установки (список fcn.0021bab0 и plugin->path) и ещё одно поле плагина (+0x14); /tmp/plugin_updater_.txt, поля +0x10, +0x18…+0x24, /tmp/www/plugins/, /tmp/www/cgi-bin/plugins/ и файл, путь которого строит fcn.0027ee94, удаляются только при флаге 0; затем новый каталог копируется (из /tmp/) или переименовывается в <хранилище>/plugins/, снимается флаг скрытия, удаляется /tmp/plugin_updater_.txt и плагин перезагружается

    ↩

    • fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true.
    • fw-tv188b-261021-0117-r25.c231 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги данных плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins_data/

      , в том числе для встроенных из firmware_ext (widget, radiotime, s928x_dvfel и др.) и dune_internal; в /data/data/com.dunehd.app/config/plugins_data есть только bluray. Других каталогов plugins_data поиск по ФС не нашёл, кроме тех же путей через /data/user/0 и /data_mirror.

    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 онлайн-обновление сохраняет cookies плагина и его data_dir_path: v2 и v3 получили в plugin_cookies значение kbp7u_mark, записанное v1, файл kbp7u_mark.txt v1 в flashdata/plugins_data/ остался с прежним mtime.

    ↩

    • fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true.
    • fw-tv188b-261021-0117-r25.c294 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 пустой каталог /tmp/plugins/<плагин> PHP-плагина существует уже после регистрации плагина, до первого вызова и запуска его php_server: kb_probe5 — в 13:24 при первом вызове в 13:37:59, kb_probe6 — в 15:06 при первом вызове в 15:08:02 (местное время).

    ↩

  130. fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000. ↩↩↩

  131. fw-tv188b-261021-0117-r25.c303 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/run/<плагин>.pid переписывается при каждом новом запуске php_server: у kb_probe5 файл последовательно содержал 17362, 17676, 17849, 17924, а его mtime совпадал со временем запуска нового процесса (13:37:59.827, 13:39:39.787, 13:40:31.655, 13:40:46.215). ↩

    • fw-tv188b-261021-0117-r25.c123 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/mnt содержит каталоги network, smb и storage, все drwxrwxrwx system:system.
    • fw-tv188b-261021-0117-r25.c124 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 SMB-ресурсы из /tmp/run/network_mount_list.xml (path="/tmp/mnt/smb/", status="mounted") смонтированы как cifs в /tmp/mnt/smb/: например, //<адрес в LAN>/usb_tb — в /tmp/mnt/smb/5.

    ↩

  132. fw-tv188b-261021-0117-r25--libphp5.c069 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 успешно создал и удалил kbp11_w.tmp в /sdcard, /config, /tmp, tmp_dir_path и data_dir_path. ↩

  133. fw-tv188b-261021-0117-r25--libphp5.c070 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fopen на запись /data/data/com.dunehd.app/firmware/kbp11_w.tmp из php_server вернул ошибку failed to open stream: Read-only file system. ↩

  134. fw-tv188b-261021-0117-r25.c375 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 /data/data/com.dunehd.app/tmp оказался символической ссылкой на /tmp. ↩↩

  135. fw-tv188b-260827-0003-r24.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Скрипт /system/xbin/dunehd/init монтирует tmpfs в /tmp, запускает dunehd_service и выставляет FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 ↩

  136. fw-apk-260724-0207-r24--data-deploy.c028 · code · android-atv; прошивка 260724_0207_r24 · В режиме fw_apk класс содержит другой путь: fwApkEnsureTmpDir удаляет настоящий каталог /tmp и заменяет его симлинком на системный /tmp, а fwApkEnsureSymlinks ставит /firmware → /system/dunehd/firmware и /firmware_ext → /system/dunehd/firmware_ext ↩

  137. fw-tv188b-260827-0003-r24--plugin-loader.c054 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит флаги однократных действий /tmp/run/%s_plugin_boot_action_executed.flag и /tmp/run/%s_plugin_boot_end_action_executed.flag с сообщениями «boot action already executed» ↩

  138. fw-tv188b-261021-0117-r25.c075 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 флаги boot/boot_end встроенных и ранее установленных плагинов (Dune_backup, radiotime, widget_ext, s928x_dvfel) имели mtime 2026-10-25 01:54 — момент загрузки системы, если вычесть /proc/uptime (127797 с) из времени начала прогона 2026-10-26 13:24. ↩

  139. fw-tv188b-261021-0117-r25.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при следующих стартах приложения (после am force-stop и после restart_gui) boot и boot_end плагина kb_probe5 не выполнялись повторно — в shell.log «[plugin] kb_probe5: boot action already executed» и «[plugin] kb_probe5: GUI boot action already executed». ↩

  140. fw-tv188b-261021-0117-r25.c308 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после каждого перезапуска php_server (по touch main.php, после Fatal error, после exit(0)) статические переменные плагина начинаются заново: счётчик KbProbe5Fw::$n в первом вызове нового процесса снова равен 1 (pid 17676, 17849, 17924). ↩

  141. doc-sdk-plugins.c066 · doc · any-documented; прошивка — · data_dir_path (постоянные данные) недоступен на устройствах без System Storage и Flash Memory Storage — тогда ключ не задан ↩

  142. doc-sdk-plugins.c067 · doc · any-documented; прошивка — · После каждой записи в постоянное хранилище нужно сразу выполнять sync (команду или системный вызов) ↩

  143. fw-tv188b-261021-0117-r25.c256 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 shell_exec во встроенном PHP (php_server и php-cgi CGI) выполняет команду через /system/bin/sh: readlink /proc/$$/exe даёт /system/bin/sh, $0 — sh. ↩

  144. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c019 · code · android-atv; прошивка 260724_0207_r24 · Дочерний процесс proc_open берёт путь оболочки из getenv("PHP_PROC_OPEN_SH"), а если переменной нет — "/bin/sh" ↩

  145. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c020 · code · android-atv; прошивка 260724_0207_r24 · Затем дочерний процесс proc_open вызывает execl(<оболочка>, "sh", "-c", <команда>, NULL), а при заданном аргументе env — execle(…, <массив env>); если exec не удался — _exit(127) ↩

  146. fw-tv188b-261021-0117-r25.c257 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server PHP-плагинов (kb_probe6, shell_ext, dune-hd.tv, android_apps) PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh; $FS_PREFIX/bin/sh — ссылка на /data/data/com.dunehd.app/lib/libxxx_bash.so. ↩

  147. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c021 · code · android-atv; прошивка 260724_0207_r24 · Аргумент cwd в zif_proc_open передаётся в chdir() дочернего процесса как есть: единственный вызов функций phpfs_prefix в листинге zif_proc_open — _php_add_fs_prefix_to_cmd для команды ↩

    • fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).
    • fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).

    ↩

  148. fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib. ↩↩↩

  149. fw-tv188b-261021-0117-r25.c394 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 $FS_PREFIX/firmware/bin/ffmpeg — символическая ссылка на /data/data/com.dunehd.app/lib/libxxx_ffmpeg.so, а firmware/scripts/ffmpeg.sh — обычный файл 457 байт (один прогон). ↩

  150. fw-tv188b-261021-0117-r25.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в /system/bin 46 файлов libxxx_*.so, все root:shell с правами -rwxr-xr-x. ↩

    • fw-tv188b-261021-0117-r25.c095 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/bin/httpd — симлинк на /data/data/com.dunehd.app/lib/libxxx_busybox.so, и в $FS_PREFIX/apk_bin_map.txt есть строка «bin/httpd libxxx_busybox.so».
    • fw-tv188b-261021-0117-r25.c351 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/bin/wget — симлинк на $FS_PREFIX/lib/libxxx_busybox.so; /system/bin/libxxx_busybox.so — отдельный файл root:shell размером 987728 байт.

    ↩

  151. fw-tv188b-260827-0003-r24--http-api.c112 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libxxx_busybox.so в tv188b r24 — BusyBox v1.35.0, собранный 2023-11-24 ↩

  152. fw-apk-260724-0207-r24--data-deploy.c015 · code · android-atv; прошивка 260724_0207_r24 · apk_bin_map.txt ставит в /bin/ 32 ссылки: sh и bash → libxxx_bash.so; tar → libxxx_tar.so; smbd, nmbd, smbpasswd, nmblookup → одноимённые libxxx_*.so; 24 апплета busybox (nohup, uptime, od, touch, tee, sync, sed, xargs, mktemp, killall, awk, date, gunzip, gzip, httpd, ifconfig, netstat, ps, telnetd, unzip, vi, wget, zcat, tail) и сам busybox → libxxx_busybox.so ↩

    • fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Клиент dunehd_service имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117).
    • fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Сервисный ELF dunehd_service имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117).
    • fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Обёртка dunehd_service.sh имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117).
    • fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Файл окружения dunehd_service.env имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117).

    ↩↩

  153. fw-tv188b-261021-0117-r25--app-launch.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Удаление пакета (run_uninstall_cmd, r25) PHP выполняет сам через system() командой /system/dunehd/dunehd_service do LD_LIBRARY_PATH= pm uninstall '<пакет>', а не через launch_ext_app. ↩

  154. fw-tv188b-261021-0117-r25--app-launch.c071 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в запросе 9 в launch_ext_app выбор ветки виден в shell.log: cmd, начинающаяся с «/system/dunehd/dunehd_service do am start …», идёт в ветку «run command» (pclose 0, command status 0), а cmd «am start --user 0 …» — в ветку «launch activity for command» и apk_helper (activity launch status −1, error_action). ↩

  155. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c098 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды IP Control ждут, пока идёт handle_user_input плагина: launch_media_url, отправленный через 4 с после начала 20-секундной операции, получил ответ только после её конца — и для точки входа того же плагина, и для другого плагина. ↩

  156. fw-tv188b-261021-0117-r25.c343 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие PROG_BLUE, нажатое в 22:10:24 во время операции таймера (sleep 3), дошло до плагина в 22:10:26.592 — сразу после timer end в 22:10:26.588, то есть ждало конца операции. ↩

  157. fw-tv188b-260827-0003-r24--shell-ext.c070 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Протокол async_worker через файлы в /tmp/plugins/<плагин>/async_worker: wake_flag (разбудить), stop_flag (остановить), request. (запрос, читается при пробуждении) и response. (ответ, содержимое — time()); данные — /flashdata/plugins_data/<плагин> ↩

  158. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--support.c051 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Конструктор HDHttpLoader создаёт пару UNIX-сокетов AF_UNIX/SOCK_STREAM и делает pcntl_fork; в родителе закрывается $this->parent, в ребёнке — $this->child; ребёнок выполняет child_loop и завершается с кодом 33. ↩

  159. plg-dc-dune-backup.c048 · code · unknown; прошивка — · bin/gui_start.sh запрещает повторный запуск demon_as.sh (проверка ps w и pidof), затем запускает демон через /system/dunehd/dunehd_service do, если этот файл есть, иначе напрямую. ↩↩

  160. fw-tv188b-260827-0003-r24.c056 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 фоновый процесс установленного плагина Dune_backup «sh $FS_PREFIX/flashdata/plugins/Dune_backup/bin/demon_as.sh» (pid 3881 и 27104) работает от root с SELinux-меткой u:r:shell:s0 и PPID 1. ↩

  161. fw-tv188b-261021-0117-r25--libphp5.c071 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 shell_exec(sleep 61 >/dev/null 2>&1 &) вернулся за 0.01 с; процесс sleep 23847 с PPid=1 оставался после kill php_server 23841 и сохранял открытые pipe-дескрипторы 93/98. ↩↩↩

  162. fw-tv188b-261021-0117-r25--libphp5.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед bg2 запроса 12 шаг noop завершился в новом php_server 2929; последующая выборка процессов показала этот сервер и не вывела ни одного sleep 61. ↩

  163. fw-tv188b-261021-0117-r25--libphp5.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 12 чистый bg2 записал begin и метку перед shell_exec("sleep 61 &") из php_server 2929; в сохранённом отчёте нет записи возврата, а ожидание end bg2 показало 0 → 0 за 75 с. ↩↩

  164. fw-tv188b-261021-0117-r25--libphp5.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В чистом bg2 запроса 12 оболочка отменила handle_user_input по тайм-ауту 30.0 с, убила PHP-server и записала отмену операции через 30.333 с с сообщением «Превышено время операции». ↩

  165. fw-tv188b-261021-0117-r25--libphp5.c084 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · После окна ожидания bg2 запроса 12 выборка процессов в 11:45:06 не вывела sleep 61 и его pipe/socket fd, а заголовок сообщил php_server(kb_probe12)=нет. ↩

  166. fw-tv188b-261021-0117-r25--libphp5.c095 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В чистом bg2 запроса 13 php_server 15502 записал метку перед shell_exec("sleep 61 &"), записи о возврате нет; оболочка через 30 с отменила handle_user_input по тайм-ауту, убила PHP-server и показала «Превышено время операции» (один прогон, повтор запроса 12). ↩

  167. fw-tv188b-261021-0117-r25--libphp5.c096 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В bg2 запроса 13 процесс sleep 61 (15964) на 1, 5, 29, 32 и 45 с имел PPid 1 и держал fd 1 на pipe, а также fd 101 (чтение) и 110 (запись) на pipe — те же номера, что в аргументах php_server «… 101 110» (один прогон). ↩

  168. fw-tv188b-261021-0117-r25--libphp5.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В bg2 запроса 13 php_server 15502 был в заголовке в 20:01:21 и исчез к 20:01:24 (отмена в 20:01:22), а sleep 61 оставался и после этого до 45 с и не был виден на 62 и 70 с — завершился сам, а не вместе с php_server (один прогон). ↩

  169. plg-dc-widget-ext.c041 · code · unknown; прошивка — · Плагин вызывает свои shell-скрипты из PHP через shell_exec("<путь> > /dev/null &") — в фоне, без ожидания ↩↩

  170. fw-tv188b-260827-0003-r24--php-framework.c005 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php снимает ограничение времени выполнения PHP: set_time_limit(0) ↩

  171. fw-tv188b-260827-0003-r24--php-framework.c082 · code · tv188b, tv175u, android-dune-fw; прошивка 240619_0210_r22, 250815_1012_r22, 260724_0207_r24, 260827_0003_r24 · bootstrap.php, dune_config.php, dune_plugin.php и dunelib/dune_countries.php одинаковы (sha256) в tv175u 240619_0210_r22, tv188b 250815_1012_r22 и r24-прошивках; dunelib/config_utils, dune_languages, expr, utils в r22-прошивках отсутствуют ↩↩

  172. fw-tv188b-261021-0117-r25.c310 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 handle_user_input kb_probe5 со sleep(15) при «start (timeout=60.0s)» доработал без отмены: результат («result action») пришёл через ~15 с после старта, сообщений об отмене по тайм-ауту нет, а следующий вызов исполнил тот же php_server 17676. ↩

  173. plg-dc-screenshoter.c060 · code · unknown; прошивка — · В CGI фреймворк плагина не подключается: do_config.php сам объявляет класс DuneSystem и заполняет DuneSystem::$properties из $_ENV (PLUGIN_NAME, PLUGIN_INSTALL_DIR_PATH, …) ↩

  174. fw-tv188b-261021-0117-r25.c335 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · shell_ext/www/cgi-bin/php.ini r25 задаёт cgi.force_redirect = 0, cgi.redirect_status_env = yes, date.timezone = UTC, error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (E_WARNING включён), magic_quotes_gpc = 0, display_errors = 0, log_errors = 1 и error_log = /tmp/run/shell_ext_cgi.log. ↩↩

  175. fw-tv188b-260827-0003-r24--shell-ext.c046 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Конструктор MainPlugin вызывает gc_disable() и HD::init(20); main_plugin.php ставит memory_limit 300M ↩

  176. fw-tv188b-260827-0003-r24--shell-ext.c072 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · AsyncWorker shell_ext ставит memory_limit 200M, читает /tmp/run/installed_plugins.xml и хранит версию формата данных 2 в /flashdata/plugins_data/shell_ext/data_format_version.txt ↩

  177. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--support.c037 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Memory::get_used_mb возвращает memory_get_usage(true)/1048576; Memory::check при used>0, used > mem_limit-50 и mem_limit<500 увеличивает лимит на 50 МБ, вызывает ini_set('memory_limit','M') и не уменьшает его; начальный mem_limit=300, максимум 500. ↩

  178. fw-tv188b-260827-0003-r24--php-framework.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php устанавливает ini date.timezone из date_default_timezone_get(), с комментарием «Use timezone from the environment (TZ)» как обход известной проблемы PHP с 5.3.0 ↩

  179. fw-tv188b-261021-0117-r25.c247 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server PHP-плагина ini date.timezone = Europe/Moscow и date_default_timezone_get() = Europe/Moscow при getenv('TZ') = false; date() даёт MSK +0300, getprop persist.sys.timezone — Europe/Moscow. ↩↩↩

  180. fw-tv188b-261021-0117-r25.c248 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина с php.ini без date.timezone ini date.timezone пуст; date_default_timezone_get() возвращает Europe/Moscow, но date() и date_default_timezone_get() пишут PHP Warning «It is not safe to rely on the system's timezone settings… We selected 'Europe/Moscow' for 'MSK/3.0/no DST' instead». ↩↩↩

  181. fw-tv188b-261021-0117-r25.c330 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 метки времени в /tmp/run/<плагин>.log и shell.log на 3 часа меньше местного времени: вызов, который date() в php_server kb_probe5 записал как 13:38:00, в логе плагина помечен 10:38:00.049. ↩↩

  182. fw-tv188b-261021-0117-r25.c331 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 openssl_x509_parse() в php_server и в php-cgi даёт validTo_time_t = -1 (gmdate — 1969-12-31 23:59:59) у всех сертификатов /firmware/certs/ca-bundle.crt со сроком позже 2038-01-19 03:14:07 UTC (57 из 143), а более ранние сроки переводит верно; 2147483647 (2038-01-19 03:14:07) — настоящий срок сертификата GlobalSign. ↩

  183. doc-sdk-plugins.c139 · doc · sigma-smp86xx, sigma-smp87xx, android; прошивка — · Лог плагина — /tmp/run/.log (Sigma: tail -F через telnet; Android: busybox tail -F через telnet/ADB) ↩↩

  184. fw-tv188b-261021-0117-r25.c326 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ошибки и предупреждения PHP в коде плагина php_server пишет в /tmp/run/<плагин>.log строкой вида «[<полный путь файла>:<строка>] [E_WARNING] …» / «[…] [E_ERROR] …». ↩

  185. fw-tv188b-261021-0117-r25.c327 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 предупреждение PHP попадает в /tmp/run/<плагин>.log и для выражения с оператором подавления @: @mkdir(...) в main.php:11 зонда при существующем каталоге дал строку «[…/main.php:11] [E_WARNING] mkdir() …: File exists» при каждом запуске php_server. ↩↩

  186. fw-tv188b-260827-0003-r24--php-framework.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php определяет hd_print($str): выводит строку через echo с суффиксом $HD_NEW_LINE (по умолчанию ''), а при заданном $HD_OB_PREFIX — с этим префиксом и вызовом ob_flush() ↩

  187. fw-tv188b-260827-0003-r24--php-framework.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php регистрирует hd_error_handler через set_error_handler и hd_shutdown_handler через register_shutdown_function; обработчик печатает ошибку через hd_print в формате «[файл:строка] [E_ТИП] сообщение» ↩

  188. fw-tv188b-260827-0003-r24--php-framework.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · hd_silence_warnings() выключает вывод ошибок (error_reporting(0) и пустой обработчик hd_error_silencer), hd_restore_warnings() восстанавливает обработчик и error_reporting(E_STRICT | E_ALL) ↩

  189. doc-sdk-plugins.c048 · doc · any-documented; прошивка — · bootstrap.php настраивает вывод ошибок PHP во внутренний лог, текущий часовой пояс и определяет hd_print() — её следует использовать вместо echo/print/printf ↩

  190. fw-tv188b-260827-0003-r24--plugin-loader.c036 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · run_plugin_cgi пишет stderr CGI-скриптов в $FS_PREFIX/tmp/dune_apk_cgi_err.log и переносит лог в .old, когда он больше 10000 байт ↩

  191. fw-tv188b-261021-0117-r25.c234 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку), выполнивший curl_multi на 4 хендла к httpd самого плеера (http://127.0.0.1/plugins/…, http://127.0.0.1:80/cgi-bin/plugins/…, http://localhost/cgi-bin/plugins/…), доходит до curl_multi_info_read и получает все 4 сообщения с msg=1 result=0, после чего php-cgi завершается с кодом 139 и в /tmp/dune_apk_cgi_err.log появляется «Segmentation fault»; повторный запуск дал то же самое. ↩

  192. fw-tv188b-261021-0117-r25.c166 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после вызовов sh-CGI плагинов в /tmp/dune_apk_cgi_err.log есть строки «WARNING: linker: Warning: unable to normalize "./lib" (ignoring)». ↩

  193. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c017 · code · android-atv; прошивка 260724_0207_r24 · Если команда изменена и задана переменная PHP_DEBUG, _php_add_fs_prefix_to_cmd печатает в stdout « -C-> EEE orig command: %s» с исходной и « -C-> EEE repl command: %s» с новой командой ↩

  194. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c039 · code · android-atv; прошивка 260724_0207_r24 · После замены URL при заданной PHP_DEBUG _php_add_fs_prefix_to_http печатает в stdout « =H=> EEE orig http: %s» с исходным и « =H=> EEE repl http: %s» с новым URL ↩

  195. fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG"). ↩

  196. fw-tv188b-261021-0117-r25--libphp5.c076 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после wget с putenv(PHP_DEBUG=1) собранный grep EEE по /tmp/run/kb_probe11.log не вывел строк; успешный результат самого wget записан. ↩

  197. fw-tv188b-261021-0117-r25--libphp5--curl-http.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 с PHP_DEBUG=1 и HD_HTTP_LOCAL_PORT=80 curl_setopt(CURLOPT_URL, http://127.0.0.1/cgi-bin/plugins/kb_probe13/host.sh) дал в логе плагина «=H=> EEE orig http» с исходным URL и «repl http: http://127.0.0.1:80/cgi-bin/plugins/kb_probe13/host.sh», а CURLINFO_EFFECTIVE_URL — тот же URL с :80 (один прогон). ↩

    • fw-tv188b-261021-0117-r25--libphp5.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 после шага g_subst с PHP_DEBUG=1 grep «=H=>» по /tmp/run/kb_probe13.log не нашёл ни одной строки; строк о замене команд в выводе нет (один прогон).
    • fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c017 · code · android-atv; прошивка 260724_0207_r24 · Если команда изменена и задана переменная PHP_DEBUG, _php_add_fs_prefix_to_cmd печатает в stdout « -C-> EEE orig command: %s» с исходной и « -C-> EEE repl command: %s» с новой командой

    ↩

  198. fw-tv188b-261021-0117-r25--libphp5.c005 · device · android-dune-fw; прошивка 261021_0117_r25 · На tv188b 261021_0117_r25 запуск php-cgi -v из collect5 завершился CANNOT LINK EXECUTABLE: library libphp5.so not found. ↩

  199. fw-tv188b-261021-0117-r25.c238 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php-cgi, запущенный CGI-обёрткой плагина без изменения LD_LIBRARY_PATH, стартует и выполняет скрипт; в окружении php-cgi LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib. ↩

    • fw-tv188b-261021-0117-r25.c304 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после touch main.php плагина kb_probe5 следующий вызов handle_user_input сначала перезапускает php_server: в shell.log того же процесса оболочки «[kb_probe5] [php] start_call(): PHP-script modification detected (1793009215). Restarting PHP-server-process...», «shutting down...», «stopped.», «server started; pid: 17676.», и вызов исполняет уже новый процесс 17676.
    • fw-tv188b-261021-0117-r25.c306 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 правка файла lib/kbp5_lib.php, подключаемого из main.php через require_once, без изменения main.php не перезапустила php_server kb_probe5: следующий вызов исполнил тот же процесс 17362 (n=5) со старой версией функции (lib=v1), в shell.log между «start» и «result action» сообщений о перезапуске нет.

    ↩↩

    • fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог.
    • fw-tv188b-261021-0117-r25.c255 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 во встроенном PHP (php_server и php-cgi CGI плагина) путь /flashdata существует: is_dir('/flashdata') = true, realpath — /data/data/com.dunehd.app/flashdata, хотя в корне ФС (adb shell) /flashdata нет.

    ↩

    • fw-tv188b-261021-0117-r25.c246 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi константы JSON_BIGINT_AS_STRING, JSON_UNESCAPED_UNICODE, JSON_UNESCAPED_SLASHES и JSON_PRETTY_PRINT не определены; JSON_NUMERIC_CHECK (32), JSON_HEX_TAG (1), JSON_FORCE_OBJECT (16), JSON_ERROR_UTF8 (5) определены.
    • fw-tv188b-261021-0117-r25.c250 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi не определены константы CURLOPT_ACCEPT_ENCODING, CURLOPT_RESOLVE, CURL_SSLVERSION_TLSv1_2, CURLOPT_SSL_VERIFYSTATUS, CURLOPT_TCP_KEEPALIVE, CURLMOPT_PIPELINING и CURLMOPT_MAXCONNECTS; CURLOPT_ENCODING (10102), CURLOPT_SSLVERSION, CURLOPT_CAINFO, CURLOPT_TIMEOUT_MS, CURLOPT_CONNECTTIMEOUT_MS, CURLOPT_NOSIGNAL и CURLOPT_IPRESOLVE определены.

    ↩

    • fw-tv188b-261021-0117-r25.c235 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тот же зонд curl_multi (4 хендла к httpd плеера) в php_server PHP-плагина (операция handle_user_input) доходит до curl_multi_info_read со всеми 4 сообщениями msg=1 result=0; результата операция не возвращает: через ~0,25 с после её начала оболочка пишет в shell.log «[kb_probe6] [php] E: op 11 failed (read status: 2).», «shutting down...», «stopped.» и «Error: operation returned PHP_CALL_FAILED.».
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c029 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi запроса 12 оболочка получила EOF от PHP-сервера, записала PHP_CALL_FAILED и stopped; end multi за 25 с не появился, а при сборе php_server зонда уже не найден.
    • fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)».
    • fw-tv188b-261021-0117-r25--php-framework.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после E_ERROR от вызова несуществующего HD::make_json_rpc_request в handle_user_input оболочка записала «poll_calls() E: treating empty result as failure and stopping server», остановила php_server, получила PHP_CALL_FAILED и выполнила plugin_show_error («FATAL ERROR detected (msg = Ошибка приложения)»).
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если call_plugin PHP-плагина возвращает null, php_server ничего не пишет в ответ и завершает цикл по EOF канала, а оболочка печатает «poll_calls() E: treating empty result as failure and stopping server», «Error: operation returned PHP_CALL_FAILED.», «result status failed», выполняет plugin_show_error и «FATAL ERROR detected (msg = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.».

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 12 чистый bg2 записал begin и метку перед shell_exec("sleep 61 &") из php_server 2929; в сохранённом отчёте нет записи возврата, а ожидание end bg2 показало 0 → 0 за 75 с.
    • fw-tv188b-261021-0117-r25--libphp5.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В чистом bg2 запроса 12 оболочка отменила handle_user_input по тайм-ауту 30.0 с, убила PHP-server и записала отмену операции через 30.333 с с сообщением «Превышено время операции».
    • fw-tv188b-261021-0117-r25--libphp5.c095 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В чистом bg2 запроса 13 php_server 15502 записал метку перед shell_exec("sleep 61 &"), записи о возврате нет; оболочка через 30 с отменила handle_user_input по тайм-ауту, убила PHP-server и показала «Превышено время операции» (один прогон, повтор запроса 12).
    • fw-tv188b-261021-0117-r25--libphp5.c096 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В bg2 запроса 13 процесс sleep 61 (15964) на 1, 5, 29, 32 и 45 с имел PPid 1 и держал fd 1 на pipe, а также fd 101 (чтение) и 110 (запись) на pipe — те же номера, что в аргументах php_server «… 101 110» (один прогон).
    • fw-tv188b-261021-0117-r25--libphp5.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В bg2 запроса 13 php_server 15502 был в заголовке в 20:01:21 и исчез к 20:01:24 (отмена в 20:01:22), а sleep 61 оставался и после этого до 45 с и не был виден на 62 и 70 с — завершился сам, а не вместе с php_server (один прогон).
    • fw-tv188b-261021-0117-r25--libphp5.c071 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 shell_exec(sleep 61 >/dev/null 2>&1 &) вернулся за 0.01 с; процесс sleep 23847 с PPid=1 оставался после kill php_server 23841 и сохранял открытые pipe-дескрипторы 93/98.

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c033 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после отмены handle_user_input по тайм-ауту оболочка выполняет plugin_show_error, и на экране — диалог «Превышено время операции» с кнопкой OK (перевод plugin_operation_timed_out).
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал.

    ↩

  200. fw-tv188b-261021-0117-r25--libphp5.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · www.ssl.com на tv188b r25 из php_server (uid 1000) с полным бандлом, без корня Entrust и только с корнем Entrust при включённой проверке TLS даёт errno 60 «self signed certificate in certificate chain»; без проверки — HTTP 200, а цепочка заканчивается самоподписанным SSL.com TLS RSA Root CA 2022. ↩

  201. fw-tv188b-261021-0117-r25--libphp5.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · kodikapi.com на tv188b r25 из php_server (uid 1000) во всех четырёх режимах (full, no_entrust, only_entrust, no_verify) получил errno 35 «OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to kodikapi.com:443» и HTTP 0; причина не установлена. ↩

    • fw-tv188b-261021-0117-r25.c353 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вызов $FS_PREFIX/bin/wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) в том же прогоне вернул пустой вывод, а [exit 0] — код head в конвейере; причина не установлена.
    • fw-tv188b-261021-0117-r25.c352 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команда wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) вернула начало XML-ответа <param name="protocol_version" value="6"; [exit 0] — код head в конвейере, а не wget.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c074 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 прямой вызов /data/data/com.dunehd.app/bin/wget и вызов sh с тем же путём из php_server оба вернули rc=126 и cannot execute binary file.
    • fw-tv188b-261021-0117-r25--libphp5.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 which wget из php_server показал /data/data/com.dunehd.app/bin/wget — ссылку на libxxx_busybox.so; вызов по имени wget к /ping компьютера вернул ok и rc=0.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 exec команды /config/kbp11_x.sh first-word из php_server вернул rc=127 и sh: /config/kbp11_x.sh: No such file or directory; file_get_contents того же пути с use_include_path=true прочитал 49 байт.
    • fw-tv188b-261021-0117-r25--libphp5.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 с PHP_DEBUG=1 exec("/config/kbp13_x.sh first-word 2>&1") в php_server вернул rc=127 и «sh: /config/kbp13_x.sh: No such file or directory» — путь первым словом префикс $FS_PREFIX не получил (повтор наблюдения запроса 11, один прогон).
    • fw-tv188b-261021-0117-r25--libphp5.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 exec("echo /config/kbp13_x.sh") в php_server напечатал /data/data/com.dunehd.app/config/kbp13_x.sh, а exec("sh /config/kbp13_x.sh after-sh") запустил скрипт с argv0 /data/data/com.dunehd.app/config/kbp13_x.sh: путь после пробела получил $FS_PREFIX (один прогон).
    • fw-tv188b-261021-0117-r25--libphp5.c085 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd, если команда начинается с '/' и путь требует префикса (_php_path_needs_prefix.part.0), но не начинается с /firmware/bin/ или /firmware_ext/php/, ставит в начало результата «sh ».
    • fw-tv188b-261021-0117-r25--libphp5.c086 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd дописывает $FS_PREFIX к пути у '/', только если байт перед '/' — пробел, '!', '&', апостроф, '(', ')', ';', '<', '>' или '`'; для '/' в первом символе команды проверяется байт перед началом строки.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c070 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fopen на запись /data/data/com.dunehd.app/firmware/kbp11_w.tmp из php_server вернул ошибку failed to open stream: Read-only file system.
    • fw-tv188b-261021-0117-r25--libphp5.c069 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 успешно создал и удалил kbp11_w.tmp в /sdcard, /config, /tmp, tmp_dir_path и data_dir_path.

    ↩

    • fw-tv188b-261021-0117-r25.c241 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware_ext/php/php-cgi, запущенный из adb shell (adbd root) с LD_LIBRARY_PATH=$FS_PREFIX/lib:$LD_LIBRARY_PATH, не стартует — «CANNOT LINK EXECUTABLE … library "libiconv.so.2" not found: needed by main executable», код 1 (и с -v, и с -q -f).
    • fw-tv188b-261021-0117-r25.c238 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php-cgi, запущенный CGI-обёрткой плагина без изменения LD_LIBRARY_PATH, стартует и выполняет скрипт; в окружении php-cgi LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib.

    ↩

  202. fw-tv188b-261021-0117-r25.c355 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HOME=/data/user/0/com.dunehd.app/app_vlc. ↩

  203. fw-tv188b-261021-0117-r25.c356 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) TMPDIR=/data/data/com.dunehd.app/tmp. ↩

  204. fw-tv188b-261021-0117-r25.c357 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) FS_BIN_PREFIX=/data/data/com.dunehd.app. ↩

  205. fw-tv188b-261021-0117-r25.c358 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) APK_PACKAGE_NAME=com.dunehd.app. ↩

  206. fw-tv188b-261021-0117-r25.c359 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_APK=1. ↩

  207. fw-tv188b-261021-0117-r25.c360 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_FW_APK=1. ↩

  208. fw-tv188b-261021-0117-r25.c361 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_HTTP_LOCAL_PORT=80. ↩

  209. fw-tv188b-261021-0117-r25.c362 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_DSSD_AMEM=0xecc5679c; в прогоне kb_probe5 (collect5) у php_server было HD_DSSD_AMEM=0x2e78afb7 — значение меняется между прогонами. ↩

  210. fw-tv188b-261021-0117-r25.c363 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_RMCL_DISABLE_CLOPTNS=1. ↩

  211. fw-tv188b-261021-0117-r25--libphp5.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 /proc/self/environ php_server kb_probe11 содержал PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, FS_PREFIX=/data/data/com.dunehd.app, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app и HD_HTTP_LOCAL_PORT=80. ↩

  212. fw-tv188b-261021-0117-r25.c390 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 /proc/self/environ php_server зонда kb_probe13 содержал, кроме общих с CGI переменных, HOME=/data/user/0/com.dunehd.app/app_vlc, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app, APK_PACKAGE_NAME=com.dunehd.app, PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, LOG_MAX_FILE_SIZE=3072000 и HD_RMCL_DISABLE_CLOPTNS=1 (один прогон). ↩

  213. fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c014 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · client_authenticate берёт числовое значение через getenv(HD_DSSD_AMEM), а при отсутствии переменной использует get_default_env; значение разбирается strtoul с основанием 0. ↩

  214. fw-tv188b-261021-0117-r25.c382 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — это окружение sh-CGI, а не самого процесса php-cgi — содержит FS_PREFIX=/data/data/com.dunehd.app. ↩

  215. fw-tv188b-261021-0117-r25.c388 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в выводе env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), нет переменных HOME, TMPDIR, FS_BIN_PREFIX, APK_PACKAGE_NAME, PHP_PROC_OPEN_SH, HD_DSSD_AMEM и HD_RMCL_DISABLE_CLOPTNS, которые были в окружении php_server kb_probe8. ↩

  216. fw-tv188b-261021-0117-r25.c392 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 набор имён переменных в /proc/self/environ php-cgi совпал с набором имён в env sh-обёртки того же CGI-запроса (различие только в значении «_»): окружение php-cgi — это окружение sh-CGI busybox httpd (один прогон). ↩↩

    • fw-tv188b-261021-0117-r25.c350 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды зонда из php_server (uid 1000) дают FS_PREFIX=/data/data/com.dunehd.app; which wget и command -v wget возвращают /data/data/com.dunehd.app/bin/wget.
    • fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть.
    • fw-tv188b-261021-0117-r25.c382 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — это окружение sh-CGI, а не самого процесса php-cgi — содержит FS_PREFIX=/data/data/com.dunehd.app.
    • fw-tv188b-261021-0117-r25.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 скрипт global_action plugin_system (boot, boot_end, gui_start) работает под uid 1000(system) с SELinux-контекстом u:r:system_app:s0, текущим каталогом / и переменной окружения FS_PREFIX=/data/data/com.dunehd.app; $0 — абсолютный путь скрипта.
    • fw-tv188b-261021-0117-r25.c172 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 bin/movie_suppliers_update.sh плагина-поставщика выполняется с uid 1000 и переменной окружения FS_PREFIX=/data/data/com.dunehd.app.
    • fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib.
    • fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin.

    ↩

    • fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).
    • fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).
    • fw-tv188b-261021-0117-r25.c384 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит HD_APK=1 и HD_FW_APK=1.
    • fw-tv188b-260827-0003-r24.c069 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть HD_HTTP_LOCAL_PORT=80, HD_APK=1, HD_FW_APK=1, HD_DSSD_AMEM=0x0744a101, HD_RMCL_DISABLE_CLOPTNS=1, LOG_MAX_FILE_SIZE=3072000 и VLC_DATA_PATH=/system/usr/share.
    • fw-apk-260724-0207-r24--data-deploy.c034 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_APK=1; переменной HD_FW_APK среди его строк нет (const-string метода: LOG_DIR, HD_APK, HD_HTTP_LOCAL_PORT, FS_PREFIX, PATH, LD_LIBRARY_PATH, HOME, PWD, /tmp/run и пути)
    • fw-tv175u-260724-0207-r24.c023 · code · tv175u, android; прошивка 260724_0207_r24 · Скрипт /system/dunehd/init не выставляет HD_APK, HD_FW_APK и FS_PREFIX: перед запуском dunehd_service он экспортирует только PATH, LD_LIBRARY_PATH=/firmware/lib:/lib:/usr/lib и LOG_DIR=/tmp/run

    ↩

    • fw-tv188b-261021-0117-r25.c361 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_HTTP_LOCAL_PORT=80.
    • fw-tv188b-261021-0117-r25--libphp5.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 /proc/self/environ php_server kb_probe11 содержал PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, FS_PREFIX=/data/data/com.dunehd.app, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app и HD_HTTP_LOCAL_PORT=80.
    • fw-tv188b-261021-0117-r25.c381 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe6 (запрос 6) HD_HTTP_LOCAL_PORT=80.
    • fw-tv188b-261021-0117-r25.c383 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит HD_HTTP_LOCAL_PORT=80.
    • fw-tv188b-261021-0117-r25.c391 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 php-cgi (/data/data/com.dunehd.app/firmware_ext/php/php-cgi, php_sapi_name cgi-fcgi, uid 0), запущенный busybox httpd для /cgi-bin/plugins/kb_probe13/env, имел FS_PREFIX, HD_HTTP_LOCAL_PORT=80, LD_LIBRARY_PATH, PATH, LOG_DIR, HD_APK, PLUGIN_NAME, PLUGIN_CGI_DIR и DUNEHD_SERVICE_DONT_FORK, а getenv(HOME) и getenv(TMPDIR) вернули false (один прогон).
    • fw-tv188b-260827-0003-r24.c069 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть HD_HTTP_LOCAL_PORT=80, HD_APK=1, HD_FW_APK=1, HD_DSSD_AMEM=0x0744a101, HD_RMCL_DISABLE_CLOPTNS=1, LOG_MAX_FILE_SIZE=3072000 и VLC_DATA_PATH=/system/usr/share.
    • fw-apk-260724-0207-r24--data-deploy.c033 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_HTTP_LOCAL_PORT=11080 (константа HDConfig.HD_HTTP_LOCAL_PORT, подставлена в байткод как const/16 11080)

    ↩

    • fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).
    • fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).
    • fw-tv188b-261021-0117-r25.c385 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит PATH, начинающийся с /data/data/com.dunehd.app/firmware/bin:/data/data/com.dunehd.app/bin:/bin, тот же, что в php_server kb_probe8.
    • fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib.
    • fw-tv188b-261021-0117-r25.c354 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) PATH=/data/data/com.dunehd.app/firmware/bin:/data/data/com.dunehd.app/bin:/bin:/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin.

    ↩

    • fw-tv188b-261021-0117-r25.c238 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php-cgi, запущенный CGI-обёрткой плагина без изменения LD_LIBRARY_PATH, стартует и выполняет скрипт; в окружении php-cgi LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib.
    • fw-tv188b-261021-0117-r25.c386 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib.
    • fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib.

    ↩

    • fw-tv188b-261021-0117-r25.c257 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server PHP-плагинов (kb_probe6, shell_ext, dune-hd.tv, android_apps) PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh; $FS_PREFIX/bin/sh — ссылка на /data/data/com.dunehd.app/lib/libxxx_bash.so.
    • fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть.
    • fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib.

    ↩

  217. fw-tv188b-261021-0117-r25.c387 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит LOG_DIR=/tmp/run и DUNEHD_SERVICE_DONT_FORK=1. ↩

    • fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000.
    • fw-tv188b-261021-0117-r25.c387 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит LOG_DIR=/tmp/run и DUNEHD_SERVICE_DONT_FORK=1.
    • fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib.
    • fw-tv188b-260827-0003-r24.c069 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть HD_HTTP_LOCAL_PORT=80, HD_APK=1, HD_FW_APK=1, HD_DSSD_AMEM=0x0744a101, HD_RMCL_DISABLE_CLOPTNS=1, LOG_MAX_FILE_SIZE=3072000 и VLC_DATA_PATH=/system/usr/share.

    ↩

    • fw-tv188b-261021-0117-r25.c390 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 /proc/self/environ php_server зонда kb_probe13 содержал, кроме общих с CGI переменных, HOME=/data/user/0/com.dunehd.app/app_vlc, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app, APK_PACKAGE_NAME=com.dunehd.app, PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, LOG_MAX_FILE_SIZE=3072000 и HD_RMCL_DISABLE_CLOPTNS=1 (один прогон).
    • fw-tv188b-261021-0117-r25.c391 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 php-cgi (/data/data/com.dunehd.app/firmware_ext/php/php-cgi, php_sapi_name cgi-fcgi, uid 0), запущенный busybox httpd для /cgi-bin/plugins/kb_probe13/env, имел FS_PREFIX, HD_HTTP_LOCAL_PORT=80, LD_LIBRARY_PATH, PATH, LOG_DIR, HD_APK, PLUGIN_NAME, PLUGIN_CGI_DIR и DUNEHD_SERVICE_DONT_FORK, а getenv(HOME) и getenv(TMPDIR) вернули false (один прогон).
    • fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib.

    ↩↩

  218. fw-tv188b-260827-0003-r24.c069 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть HD_HTTP_LOCAL_PORT=80, HD_APK=1, HD_FW_APK=1, HD_DSSD_AMEM=0x0744a101, HD_RMCL_DISABLE_CLOPTNS=1, LOG_MAX_FILE_SIZE=3072000 и VLC_DATA_PATH=/system/usr/share. ↩

  219. fw-tv188b-261021-0117-r25.c153 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении CGI плагина SERVER_SOFTWARE=busybox httpd/1.35.0 и GATEWAY_INTERFACE=CGI/1.1. ↩

    • fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c017 · code · android-atv; прошивка 260724_0207_r24 · Если команда изменена и задана переменная PHP_DEBUG, _php_add_fs_prefix_to_cmd печатает в stdout « -C-> EEE orig command: %s» с исходной и « -C-> EEE repl command: %s» с новой командой
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG").

    ↩

  220. fw-tv188b-261021-0117-r25--libphp5.c028 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Наборы имён curl_multi_* (12) и CURLOPT_* (111) в strings libphp5.so совпадают у всех пяти исследованных сборок. ↩

  221. fw-tv188b-261021-0117-r25.c246 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi константы JSON_BIGINT_AS_STRING, JSON_UNESCAPED_UNICODE, JSON_UNESCAPED_SLASHES и JSON_PRETTY_PRINT не определены; JSON_NUMERIC_CHECK (32), JSON_HEX_TAG (1), JSON_FORCE_OBJECT (16), JSON_ERROR_UTF8 (5) определены. ↩

    • fw-tv188b-261021-0117-r25--libphp5.c001 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка PHP/5.3.6.
    • fw-tv188b-261021-0117-r25--libphp5.c006 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует версия OpenSSL 1.0.1u от 22 Sep 2016.
    • fw-tv188b-261021-0117-r25--libphp5.c007 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка версии PCRE 8.11 2010-12-10.

    ↩

  222. fw-tv188b-261021-0117-r25--libphp5.c036 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · CA-бандлы всех пяти исследованных сборок совпадают по SHA-256 722be2869ed2c2a949e5edb75b030f1e737e869ca8e8f70bc8d876dd93227ead. ↩

  223. fw-tv188b-261021-0117-r25--libphp5.c029 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so tv188b r25 присутствует _php_add_fs_prefix_to_http вместо имени _php_add_http_port из r24 и r22. ↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG").
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http вызывает lcreg при отсутствии HD_HTTP_LOCAL_PORT либо для http:// URL, не попавшего под CGI-подстановку; при заданной HD_HTTP_LOCAL_PORT URL без префикса http:// выходит до lcreg.

    ↩

  224. fw-tv188b-261021-0117-r25--libphp5--curl-http.c022 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 zif_curl_exec перед curl_easy_perform читает сохранённый URL из поля handle +0x16c; если хост (после http:// или https://, без userinfo и порта) не localhost/localhost. и не разрешается getaddrinfo в 127.x или ::1, либо URL пуст или с другой схемой, ставит опцию 0x4ec3 с обработчиком _php_curl_opensocket_remote. ↩

  225. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 php_server содержит путь /tmp/run/%s.pid и импорт FS_writestring, которых нет в strings php_server r24 ↩

  226. fw-tv188b-260827-0003-r24.c052 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22, 260827_0003_r24 · В 260827_0003_r24 по сравнению с 250815_1012_r22 в firmware_ext/php/include/dunelib/ добавлены config_utils.php, dune_languages.php, expr.php, utils.php: в r22 там только dune_countries.php ↩

  227. fw-tv188b-260827-0003-r24.c053 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22, 260827_0003_r24 · В 260827_0003_r24 по сравнению с 250815_1012_r22 изменены firmware_ext/php/dune_api.php (119788 → 127635 байт) и dune_plugin_fw.php (6211 → 6653 байт) ↩

    • fw-tv188b-260827-0003-r24--init-runtime.c033 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22 · В tv188b r22 цикл запуска $FS_PREFIX/config/boot записан прямо в init (отдельного вызова binit.sh нет)
    • fw-tv188b-260827-0003-r24--init-runtime.c031 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · binit.sh находит файлы в $FS_PREFIX/config/boot (find … -type f) и по очереди, без фонового запуска, выполняет исполняемые (-x), записывая в лог код возврата каждого

    ↩

    • fw-tv188b-260827-0003-r24--shell-ext.c074 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · www/cgi-bin/php.ini shell_ext: cgi.force_redirect = 0, cgi.redirect_status_env = yes, error_reporting без E_NOTICE/E_STRICT/E_DEPRECATED/E_WARNING, magic_quotes_gpc = 0
    • fw-tv188b-261021-0117-r25.c335 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · shell_ext/www/cgi-bin/php.ini r25 задаёт cgi.force_redirect = 0, cgi.redirect_status_env = yes, date.timezone = UTC, error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (E_WARNING включён), magic_quotes_gpc = 0, display_errors = 0, log_errors = 1 и error_log = /tmp/run/shell_ext_cgi.log.

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Отмена операции PHP-плагина (php_plugin.c, fcn.00272050) находит дескриптор операции по id, печатает «Cancelling... Output-data: %p.» и ставит в дескрипторе байт-флаг отмены — и больше ничего: ни php_server, ни PHP-коду отмена не передаётся.
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал.

    ↩

    • doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url
    • fw-tv188b-261021-0117-r25.c288 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 DuneSystem::$properties у PHP-плагина kb_probe5 из flashdata содержит 8 ключей: sdk_version '1.0.0', plugin_name 'kb_probe5', install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url, few_buttons_remote_type '0'.

    ↩↩↩

    • doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url
    • doc-sdk-plugins.c095 · doc · any-documented; прошивка — · Встроенный HTTP-сервер отдаёт $install_dir_path/www/* по http:///plugins//* и исполняет CGI из www/cgi-bin/* по http:///cgi-bin/plugins//*
    • fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml.

    ↩

    • doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url
    • doc-sdk-plugins.c065 · doc · any-documented; прошивка — · tmp_dir_path — каталог под /tmp для временных данных плагина; Dune GUI гарантирует его существование
    • fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true.
    • fw-tv188b-261021-0117-r25.c294 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 пустой каталог /tmp/plugins/<плагин> PHP-плагина существует уже после регистрации плагина, до первого вызова и запуска его php_server: kb_probe5 — в 13:24 при первом вызове в 13:37:59, kb_probe6 — в 15:06 при первом вызове в 15:08:02 (местное время).

    ↩

    • doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url
    • doc-sdk-plugins.c066 · doc · any-documented; прошивка — · data_dir_path (постоянные данные) недоступен на устройствах без System Storage и Flash Memory Storage — тогда ключ не задан
    • doc-sdk-plugins.c067 · doc · any-documented; прошивка — · После каждой записи в постоянное хранилище нужно сразу выполнять sync (команду или системный вызов)
    • fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true.

    ↩

    • doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url
    • fw-tv188b-261021-0117-r25.c289 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у kb_probe5 plugin_www_url = 'http://127.0.0.1:80/plugins/kb_probe5/', plugin_cgi_url = 'http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/' — с явным портом 80.

    ↩↩

  228. fw-tv188b-261021-0117-r25--downloads.c043 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · torrserverActionGet включает API_OPT_LONG_INT_AS_STRING: перед json_decode клиент заменяет значения из 10 и более десятичных цифр после ключа \w+ на JSON-строки. ↩

  229. plg-hdtv-remtor.c114 · code · unknown; прошивка — · При hack_big_int TransmissionRPC переписывает регулярным выражением целые числа JSON (значения вида "key":123) в строки, чтобы большие размеры не теряли точность. ↩

  230. plg-dc-torrent-center.c082 · code · unknown; прошивка — · torrserverActionGet перед json_decode переписывает в строки числовые значения после ключа из символов слова перед запятой, а отдельным выражением — значения length. ↩

  231. plg-dc-torrent-center.c079 · code · unknown; прошивка — · TorrServer::actionGetTorrentList запускает вложенный php-cgi -f www/cgi-bin/run.php с action=torrentTorrServList через HD::asyncExec. ↩

  232. plg-gh-kocourkuba-proiptv.c061 · code · unknown; прошивка — · run_bg_epg_indexing запускает фоновую индексацию EPG, если allow_index истинно или включён delay-load пиконов при is_delay_load_supported(), или движок XMLTV/combined; источник должен существовать и не быть заблокирован is_index_locked. Он пишет JSON-конфиг в tmp, экспортирует DuneSystem и запускает отдельный процесс ' bin/index_epg.php ' через shell_exec с перенаправлением в лог; check_and_run_bg_indexing выставляет plugin_cookies->ticker, когда индексация запущена. ↩

    • plg-hdtv-rclone.c081 · code · unknown; прошивка — · SmartConfig::do_cmd удаляет старый exec_log, а на android выполняет команду через /system/dunehd/dunehd_service do с экранированием двойных кавычек; на остальных платформах — через system().
    • plg-hdtv-rclone.c082 · code · unknown; прошивка — · Результат shell-команд передаётся в PHP через JSON-файл exec_log: do_exec_log декодирует его json_decode и складывает поля в $this->execLogObj, откуда вызывающий код читает status/descr.

    ↩

  233. plg-dc-globaltv.c072 · code · unknown; прошивка — · Плагин вызывает date_default_timezone_set("UTC"), а смещение пояса вычисляет из вывода shell-команды date +%z. ↩

  234. plg-hdtv-megaanime.c076 · code · unknown; прошивка — · Копия lib/default_dune_plugin_fw.php в MegaAnime отличается от копии эталона HdKinoTeatr: добавляет флаг tracing_enabled, в create_plugin ставит date_default_timezone_set('UTC') и ini_set('date.timezone', 'UTC'), а call_plugin получил обработку ошибок и трассировку. ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c040 · code · unknown; прошивка — · set_time_limit(0) вызывают anidub_main, anidub_main_year, anidub_main_studii, get_main_menu_items и Youtube::retrieve_playback_url.
    • plg-hdtv-folder-cache-vod.c050 · code · unknown; прошивка — · Youtube::retrieve_playback_url() и General_main() снимают ограничение времени через set_time_limit(0); в Youtube это подписано комментарием «no more plugin restarts».

    ↩

  235. plg-dune-remote-control.c074 · code · unknown; прошивка — · При подключении m3u.class.php выполняет error_reporting(0) и set_time_limit(15), перекрывая error_reporting(E_ALL), заданный в do.php. ↩

    • plg-dc-widget-ext.c086 · code · unknown; прошивка — · boot.sh проверяет каталог /flashdata/plugins_data без $FS_PREFIX, а остальные скрипты — $FS_PREFIX/flashdata/plugins_data
    • plg-dc-widget-ext.c087 · code · unknown; прошивка — · PHP-часть вызывает /firmware/scripts/run_widget.sh без $FS_PREFIX, а shell-скрипты — $FS_PREFIX/firmware/scripts/run_widget.sh

    ↩

  236. plg-gh-vladikshkwok-lampa-dune-plugins.c044 · code · android; прошивка — · CGI-обёртка api задаёт FS_PREFIX по умолчанию /data/data/com.dunehd.app и добавляет в LD_LIBRARY_PATH каталоги firmware/lib, lib и системные. ↩

  237. plg-gh-vladikshkwok-lampa-dune-plugins.c046 · forum · android; прошивка — · Комментарии CGI-обёртки api утверждают, что run_plugin_cgi вызывает файл через sh даже на Android 11, а php-cgi предпочитает SCRIPT_FILENAME опции -f при наличии REQUEST_METHOD. ↩

  238. plg-gh-vladikshkwok-lampa-dune-plugins.c123 · forum · android; прошивка — · Комментарий bridge.php заявляет совместимость с PHP 5.3 и отсутствие распространения SDK, демона и внешнего сервиса метаданных. ↩

  239. plg-hdtv-kohana-channel.c048 · code · unknown; прошивка — · Controller перед возвратом результата печатает в stdout имя операции: echo 'get_tv_info: ' . $media_url и аналогичные строки в get_folder_view, get_next_folder_view, get_tv_stream_url, get_vod_info, get_vod_stream_url, get_regular_folder_items, get_day_epg, get_tv_playback_url, change_tv_favorites. ↩

  240. plg-hdtv-cleanup.c013 · code · unknown; прошивка — · check_children добирает дочерние процессы двумя способами: по общим pipe-файловым дескрипторам из /proc//fd и по PPID через pgrep -P, объединяет их, убирает дубликаты и убивает каждый через kill. ↩

  241. fw-tv188b-261021-0117-r25.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd запущен как «$FS_PREFIX/bin/httpd -h /data/data/com.dunehd.app/tmp/www», то есть корень веб-сервера — $FS_PREFIX/tmp/www; процесс работает от root (метка u:r:shell:s0, PPID 1). ↩

  242. fw-tv188b-260827-0003-r24--php-framework.c075 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В HD::format_timestamp есть комментарий, что PHP на Dune требует явной таймзоны (нет встроенной информации о таймзонах?) ↩

  243. plg-dc-globaltv.c071 · code · unknown; прошивка — · Комментарий в библиотеке: PHP на Dune требует явного указания часового пояса (встроенной информации о часовых поясах, видимо, нет). ↩

  244. doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина. ↩

  245. fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. ↩

  246. doc-sdk-plugins.c042 · doc · any-documented; прошивка — · По SDK тайм-аут операций плагина по умолчанию составляет 10 секунд; operation_timeout задаёт общий () и потиповой (N) тайм-аут. ↩

    • fw-tv188b-261021-0117-r25--libphp5.c085 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd, если команда начинается с '/' и путь требует префикса (_php_path_needs_prefix.part.0), но не начинается с /firmware/bin/ или /firmware_ext/php/, ставит в начало результата «sh ».
    • fw-tv188b-261021-0117-r25--libphp5.c086 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd дописывает $FS_PREFIX к пути у '/', только если байт перед '/' — пробел, '!', '&', апостроф, '(', ')', ';', '<', '>' или '`'; для '/' в первом символе команды проверяется байт перед началом строки.

    ↩

  247. fw-tv188b-261021-0117-r25--libphp5.c072 · device, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после kill php_server и запуска collect11 шага bg2 операция handle_user_input была отменена через 30.0 с с operation timed out; step_bg2.txt не появился, а в сохранённом steps.txt нет begin bg2 между end bg1 и begin wget. ↩

  248. fw-tv188b-261021-0117-r25--libphp5.c098 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, shell_exec("sleep 61 &") в php_server не возвращается потому, что фоновый sleep наследует pipe stdout (fd 1) и держит его открытым до конца, а shell_exec ждёт EOF; наследование fd 101/110 php_server тоже не закрывается перед exec. ↩

  249. fw-tv188b-261021-0117-r25--libphp5.c087 · inference · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd вызывается из php_exec (exec, system, passthru), zif_shell_exec, zif_popen, zif_proc_open и virtual_popen, то есть exec и shell_exec переписывают команду одной функцией. ↩

  250. fw-tv188b-261021-0117-r25--libphp5.c088 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · rc=127 и «sh: /config/kbp11_x.sh: No such file or directory» у exec("/config/kbp11_x.sh first-word") в запросе 11 согласуются с тем, что путь стоит первым словом: _php_add_fs_prefix_to_cmd добавил «sh », но $FS_PREFIX к первому слову не дописал (байт перед строкой не разделитель); в shell_exec запроса 6 /config/c стоял после пробела и префикс получил. Различие — по позиции слова, а не по функции exec/shell_exec. ↩

  251. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c029 · inference · android-dune-fw; прошивка 260827_0003_r24 · Вероятно, на tv188b 260827_0003_r24 подстановка путей и команд в PHP работает так же, как в APK: там тот же libphp5.so, а init и dunehd_service.env задают FS_PREFIX=/data/data/com.dunehd.app ↩

  252. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c030 · inference · android-dune-fw; прошивка 260724_0207_r24 · Вероятно, на tv175u 260724_0207_r24 libphp5.so пути и команды не переписывает: файл тот же, что в APK, а скрипт /system/dunehd/init FS_PREFIX не задаёт, так что getenv("FS_PREFIX") пуст ↩

  253. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c031 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK PHP-плагин, обращаясь файловыми функциями к /tmp/…, /config/…, /flashdata/…, /fconfig/…, /firmware…, фактически работает с $FS_PREFIX/tmp/… и т. д., к /D/… — с $FS_PREFIX/tmp/mnt/D/…, а пути, уже начинающиеся с $FS_PREFIX (/data/data/<пакет>), не меняются; поэтому годятся и абсолютные пути прошивки, и getenv("FS_PREFIX") . "/config/…" ↩

  254. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c003 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, вторая строка-образец _php_get_fs_prefix2 (адрес 0x353448) — "/D/": к путям /D и /D/… после FS_PREFIX добавляется /tmp/mnt, то есть /D/x превращается в $FS_PREFIX/tmp/mnt/D/x ↩

  255. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c009 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, подстановке FS_PREFIX в командах подвержены PHP-функции exec, system и passthru (через php_exec), shell_exec (и оператор …), popen и proc_open ↩

  256. fw-tv188b-261021-0117-r25.c353 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вызов $FS_PREFIX/bin/wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) в том же прогоне вернул пустой вывод, а [exit 0] — код head в конвейере; причина не установлена. ↩

  257. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c013 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK программа плагина, запущенная exec/shell_exec по абсолютному пути вне /firmware/bin/ и /firmware_ext/php/ (например /flashdata/plugins/<плагин>/bin/x или $FS_PREFIX/…), запускается как «sh <путь>»: shell-скрипт так работает и без бита x, а ELF-бинарник — нет ↩

  258. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c016 · inference · android-atv; прошивка 260724_0207_r24 · Для '/' в самом начале команды _php_add_fs_prefix_to_cmd проверяет байт перед началом строки (вне команды), поэтому, вероятно, путь первым словом (/config/x.sh …) получает FS_PREFIX непредсказуемо — в зависимости от памяти перед строкой; «sh » при этом добавляется ↩

  259. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c022 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK proc_open(<команда>, …, $cwd) с $cwd вида /tmp/… или /config/… переходит в системный каталог Android, а не в $FS_PREFIX/…: пути в команде переписываются, а cwd — нет ↩

  260. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c023 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, при переданном в proc_open массиве $env дочерний процесс получает только эти переменные: FS_PREFIX, PATH, LD_LIBRARY_PATH и прочее окружение php_server в него не попадают, если плагин их не передал ↩

  261. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c034 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK при заданной FS_PREFIX абсолютные пути под корнями /config и /tmp, разрешаемые realpath(), include/require, проверкой open_basedir и созданием временных файлов tempnam/tmpfile через virtual_file_ex, получают FS_PREFIX перед разрешением. ↩

  262. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c035 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, _php_add_fs_prefix применяют к путям PHP-функции chdir, glob, readfile, rename, unlink, chgrp, chown, chmod, touch, disk_total_space, disk_free_space, clearstatcache, stat-семейство (php_stat: stat, filemtime, file_exists, is_dir…), mkdir, rmdir, opendir/scandir, открытие потоков (_php_stream_open_wrapper_ex: fopen, file_get_contents, file_put_contents и т. п.), include/require (zend_stream_open), simplexml_load_file, SimpleXMLElement::asXML и curl_setopt ↩

  263. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c042 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK при заданных HD_APK и FS_PREFIX плагин, читающий /sys/class/net/eth0/address через fopen с режимом на 'r' или file_get_contents без поиска по include_path, получает содержимое $FS_PREFIX/tmp/run/dune_mac.txt ↩

    • fw-tv188b-261021-0117-r25--libphp5.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 exec команды /config/kbp11_x.sh first-word из php_server вернул rc=127 и sh: /config/kbp11_x.sh: No such file or directory; file_get_contents того же пути с use_include_path=true прочитал 49 байт.
    • fw-tv188b-261021-0117-r25--libphp5.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 file_get_contents(lib/kbp11_steps.php,true) из php_server прочитал 15678 байт.

    ↩

  264. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c043 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, при открытии потока с поиском по include_path (fopen($f, $mode, true), file_get_contents($f, true) — бит 1 options, USE_PATH) _php_stream_open_wrapper_ex путь не переписывает, и FS_PREFIX к нему приписывается разве что при разрешении через virtual_file_ex ↩

  265. fw-tv188b-260827-0003-r24.c070 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 окружение php_server отдельно не снято: сбор 24-environ выбирал процессы по pgrep -f dunehd, а в argv php_server строки dunehd нет; при этом окружение родителя com.dunehd.app не содержит FS_PREFIX, HD_APK, HD_FW_APK, LOG_DIR, TMPDIR и PHP_PROC_OPEN_SH, поэтому наличие этих переменных у php_server на r24 не установлено. ↩

  266. fw-apk-260724-0207-r24--data-deploy.c046 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, PHP-код плагина в APK исполняется в процессе php_server, который оболочка запускает fork + FS_execv("/firmware/bin/php_server", …) без отдельного окружения, поэтому он наследует окружение процесса оболочки: FS_PREFIX, HD_APK=1, HD_HTTP_LOCAL_PORT=11080, APK_PACKAGE_NAME, PATH, LD_LIBRARY_PATH, PHP_PROC_OPEN_SH; HD_FW_APK не задан ↩

  267. fw-tv188b-260827-0003-r24--php-framework.c308 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server, вероятно, исполняет вызов плагина как PHP-код «$in = <<<EOL …EOL; $out = <выражение>($in);», где выражение (например DunePluginFw::$instance->call_plugin) приходит от оболочки в CallPacket ↩

  268. fw-tv188b-260827-0003-r24--php-framework.c033 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пути require_once 'dunelib/…' разрешаются, только если каталог firmware_ext/php/include/ есть в include_path PHP; где он задаётся, из модуля не видно ↩

  269. fw-tv188b-260827-0003-r24--php-framework.c309 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Системные PHP-файлы /firmware_ext/php подключаются до кода плагина: так сказано в SDK; для tv188b r24 порядок из строк php_server не следует ↩

  270. fw-tv188b-260827-0003-r24--plugin-loader.c081 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · data_dir_path, вероятно, — <хранилище>/plugins_data/; для плагина из flashdata — с префиксом $FS_PREFIX ($FS_PREFIX/flashdata/plugins_data/); варианты persistfs и запасной /config/plugins_data, а также правило выбора не установлены. ↩

  271. fw-tv188b-260827-0003-r24--plugin-loader.c082 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · tmp_dir_path, вероятно, — $FS_PREFIX/tmp/plugins/ (для плагина из flashdata); shell-переменная bluray задаёт тот же путь без префикса — /tmp/plugins/. ↩

  272. fw-tv188b-260827-0003-r24--plugin-loader.c047 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки установщика %s/bin/php-cgi, %s/www/cgi-bin/php-cgi, /firmware/bin/%s и сообщения «non-working binary detected», «created symlink(%s -> %s)»; вероятно, нерабочий бинарник плагина заменяется ссылкой на /firmware/bin/<имя>; связь %s/bin/php-cgi с этой заменой не установлена, а /firmware/bin/php-cgi в этой прошивке нет ↩

  273. fw-tv188b-261021-0117-r25.c151 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd запускает ссылку run_plugin_cgi с $0, равным имени файла CGI без каталога, из каталога, последний компонент которого — имя плагина: обёртка строит SCRIPT_FILENAME как $dir_path/$0 и PLUGIN_NAME как ${PWD##*/}, и для /cgi-bin/plugins/kb_probe5/env.sh получились …/www/cgi-bin/env.sh и kb_probe5. Полный путь каталога запуска не наблюдался. ↩

  274. plg-hdtv-zlostnyi-iptv.c068 · inference · unknown; прошивка — · Передача по ссылке на месте вызова (call-time pass-by-reference) в PHP 5.3 — лишь предупреждение deprecated, в 5.4+ — ошибка разбора; в прошивке r25 PHP 5.3.6, поэтому код работает, но на PHP 5.4+ файлы с такими вызовами не загрузятся. ↩

  275. plg-dc-dunemdb-supplier-movies-rus.c021 · inference · unknown; прошивка — · Не доказано, что запущенный из описателя php-cgi читает bin/php.ini: ключ -c не передан, а путь php.ini по умолчанию задан при сборке PHP. ↩

  276. fw-tv188b-261021-0117-r25--libphp5.c025 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Строка mcrypt в libphp5.so пяти сборок входит в общий перечень авторов расширений PHP. ↩

  277. fw-tv188b-260827-0003-r24--shell-ext--entry-handler.c088 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · get_update_service_plugins_action пропускает установленный сервисный плагин при version_index>1; version_index<=1 ведёт к установке/обновлению. ↩

  278. fw-tv188b-261021-0117-r25.c377 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 ls и cat /data/data/com.dunehd.app/config/lcreg.txt вернули No such file or directory. ↩

  279. fw-tv188b-261021-0117-r25--libphp5--curl-http.c007 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 lcreg_kind выбирается через atoi первой строки lcreg.txt: 0 выбирает встроенную таблицу lcreg_ru_pairs, 1 читает lcreg_pairs.txt; ошибка открытия/чтения lcreg.txt, результат вне 0/1 или недоступный файл пар дают lcreg_kind=-1. ↩