Многие современные телевизоры имеют скрытые сервисные меню, через которые можно посмотреть и изменить различные параметры, недоступные в обычном пользовательском меню. В телевизорах LG есть 2 основных сервисных меню - InStart и EzAdjust, которые можно вызвать посылкой "секретных" ИК кодов, отсутствующих на обычном пульте. Подробности о том, как открыть эти меню, легко найти в интернете, не буду на этом останавливаться, один из вариантов - в этой статье. К сожалению, многие интересные опции в сервисных меню были недоступны для изменения.
В меню InStart меня заинтересовала строка Access USB Status. Гугление не давало никакой информации о том, что это за Access USB, но интуиция подсказывала, что это что-то интересное.
Кроме того, изучая информацию в интернете, я узнал что у более старых телевизоров была возможность подключиться по RS232 и получить debug консоль. В новых моделях телевизоров физический RS232 отсутствует, однако удалось выяснить, что возможность консольного подключения не исчезла - консольное соединение в новых ТВ можно получить, подключив переходник USB-UART на PL2303. Сделав шнурик из пары PL2303 и введя команду debug я опять наткнулся на упоминание AccessUSB:
Access USB is NOT opened!!!
Решено было разобраться что это за AccessUSB, что даёт, и по какому протоколу работает. Для начала нужно было получить прошивку ТВ. Прошивки для телевизоров LG распространяются в формате epk - это проприетарный формат LG, запакованный, зашифрованный и подписанный, однако её можно распаковать с помощью opensource тулзы epk2extract (большое спасибо создателям этой тулзы). Распаковав прошивку и пройдясь поиском по строке "AccessUSB", я обнаружил основные модули, которые отвечают за взаимодействие с AccessUSB: physical-device-manager - занимается определением подключаемых устройств, и securitymanager - отвечает за авторизацию.
Обнаружение AccessUSB в системе
Для начала надо было выяснить, каким образом AccessUSB вообще определяется в системе, для этого я начал исследовать physical-device-manager. Операционная система LG - WebOS - как и Android, основана на ядре Linux, но использует хромиум вместо явы для исполнения javascript приложений, и естественно другое внутреннее API. Впрочем, системные сервисы представляют собой обычные линуксовые ELF файлы под ARM архитектуру. Несмотря на то, что ядро Linux способно определять и использовать со встроенными драйверами большое число различных устройств, в WebOS будет доступно только то, что определит physical-device-manager, который также представляет собой нативный ELF файл.
При загрузке его в IDA обнаружилось, что почти все присутствующие функции были экспортируемыми, и соответственно известны их имена, что весьма облегчило задачу. Я обнаружил таблицу допустимых устройств и определил названия и типы её полей, чему помимо названий функций также поспособствовали сообщения для логирования.
Видно, что телевизор может поддерживать USB камеры, WIFI модули, и другие устройства, однако большинство из них должны иметь определенный VID/PID, и большинство - VID_043E - LG. Вот так и осуществляется vendor lock.
В списке на предпоследнем месте обнаружилось искомое - AccessUSB, а чуть выше - pl2303 USB2SERIAL, используемый для подключения консоли. Итак, AccessUSB - это устройство с VID_16C0&PID_05E1 и Class_02. USB class 02 - это Communications Device Class - по сути - тот же USB-UART. В линуксе подобные устройства работают через стандартный драйвер cdc_acm и определяются как ttyACM. Я сделал прошивку для микроконтроллера STM32 с поддержкой USB, которая реализует этот протокол с требуемыми ID. При подключении к ТВ он определил это устройство:
При попытке входа в сервисные меню стал запрашиваться 6-символьный пароль вместо обычного 4-символьного (обычно вход в сервисные меню "защищён" дефолтным паролем 0413, который не менялся похоже никогда):
Дальше естественно авторизация не проходила - теперь предстояло исследовать и реализовать протокол авторизации.
Протокол AccessUSB
За авторизацию AccessUSB отвечает securitymanager, также ARM ELF. Я полностью отреверсил протокол, он оказался явно проприетарный, но относительно простой. Выяснилось, что в отличие от захардкоженного 4-символьного пароля, который проверял сам ТВ, 6-символьный пароль передавался в хешированном виде в AccessUSB для проверки (в чем смысл хешировать 6-цифирьный пароль - я без понятия). Еще выяснилось, что помимо ошибки Invalid Password в протоколе предусмотрены также ошибки Time Expiration и Count Expiration - таким образом, оригинальное AccessUSB может иметь ограничения по времени и/или количеству использований.
Но основная проблема оказалась в том, что на последнем этапе авторизации необходимо было сформировать сообщение, зашифрованное RSA2048. В прошивке ТВ был только открытый ключ, а закрытый содержится только в AccessUSB. Кроме того, в протоколе была предусмотрена возможность сменить сертификат авторизации, однако этот сертификат также должен быть подписан, но уже RSA4096 - в общем хрен редьки не слаще.
Поскольку взлом RSA2048 - задача на данный момент нерешаемая, пришлось считерить - заменить ключ RSA в памяти на свой. Таким образом, чтобы получить рут надо уже иметь рут, однако есть способы рутануть телевизор и без AccessUSB, так что проблема решаемая.
Возможности, предоставляемые AccessUSB
Итак, реализовав протокол и заменив ключ RSA, я наконец смог добиться успешной авторизации моего AccessUSB и исследовать предоставляемые им возможности.
В меню InStart изменился статус AccessUSB:
Разблокировались многие недоступные ранее опции, в частности появилась возможность переключить телевизор в debug режим:
Переключение в debug режим само по себе даёт доступы, аналогичные наличию AccessUSB, так что в принципе достаточно получить рут любым способом и найти как включить debug режим - изменением переменной в памяти или ещё как-то.
В меню EzAdjust появилась возможнось без ограничений изменять любые ToolOption-ы, например включить DVR (возможность записывать телепередачи):
Подключившись по консоли и введя команду debug, я попал в консоль Debug Mode:
Enter Debug Mode : if you want exit form debug, input 'x'
По кнопке F1 отображается help:
Hidden text
=================================================================================
[Pages] List of pages of special key
**[system ] for system
[tmanager ] job control
---------------------------------------------------------------------------------
[Global] Helps about global special key
[F01][func:0x00000000]: Show this page help message
[F02][func:0x00000000]: Move to prev page
[F03][func:0x00000000]: Move to next page
[F04][func:0x00000000]: Show Process List
[F07][func:0x00000000]: Toggle kernel print
[F08][func:0x00000000]: Toggle process name
[F09][func:0x00000000]: Toggle debug message output
[F10][func:0x00000000]: Enter debug main menu
---------------------------------------------------------------------------------
[system] Helps about function of special key
[ `][func:0x00000000]: show memory status
[ ~][func:0x00000000]: Setting Marker
[ !][func:0x00000000]: Control Memory Manager
[ @][func:0x00000000]: Toggle log level for SM System
[ #][func:0x00000000]: Control log msg type
[ $][func:0x00000000]: Dump Memory Pool
[ %][func:0x00000000]: Control Memory checking opt
[ ^][func:0x00000000]: Control Memory checking Threshold
[ +][cmd : true]: sload
[ |][func:0x00000000]: check close(0)
[F05][cmd : true]: mask i
[F06][func:0x00000000]: Task Menu
[F11][func:0x00000000]: top
[F12][func:0x00000000]: monitor
[S+F03][cmd : true]: /info/map
[S+F04][cmd : true]: exc -1
[S+F05][cmd : true]: /info/maps -1
[S+F06][cmd : true]: /info/sema -1
[S+F07][func:0x00000000]: show current phy. memory
[S+F08][func:0x00000000]: show all phy. memory
[S+F09][func:0x00000000]: show timelog
[S+F10][func:0x00000000]: gdb menu
=================================================================================
По F10 попадаем в debug main menu, его хелп:
Hidden text
help,? Print this help message
============================================================
md Memory dump
mm Modify memory
mf Memory fill
mmap Map kernel physical memory to user vitrual memory
dsm Disassemble memory
regs Dump current exception registers
num Print number in hex/dec/bin
uptime Print system up time
sload load symbol info
sh enter shell
call Call a function
mask control mask print
esyslog syslog
escreen display screen from file
gdb gdb current process
> ts Show OSA Task status ---> task@systemInfo
> prio set task priority ---> prio@systemInfo
* show Show Various status
remote Remote Login Mode
cfg Show current CFG. set value
ver Show VERsion data
browser Excute Browser shell
reset Reset system
part Show current MTD. map info.
* orgm Enter Org style debug menu
* cmddbg Enter Command-Line Style debug menu
> ejobs Display Process List ---> ejobs@tmgr
> efg Switch focused terminal ---> efg@tmgr
> exc Dump exception log ---> exc@tmgr
> efork Create new cmdline task ---> efork@tmgr
> bcast Broadcast command to all process ---> bcast@tmgr
> print Control Print ---> print@tmgr
> log Dump Log Buffer ---> log@tmgr
> baud Control Baudrate ---> baud@tmgr
> elogout logout network connection ---> elogout@tmgr
------ debugMain ----------------------------------------
* test Test basic functions
* info systemInfo
* mem memory debugging
> mprof Set Msg Profile(per MQ) ---> mprof@memory debugging
* tmgr tmgr
============================================================
exit Exit from debugMain menu
Введя команду sh, получаем рутовую Linux консоль. Можно развлекаться по полной. Можно узнать характеристики процессора (cat /proc/cpuinfo), объем доступной памяти (cat /proc/meminfo) и т.д. Выяснилось, что характеристики Smart TV мягко говоря не очень - способны конкурировать разве что с современными ему самыми дешёвыми смартфонами.
Выводы
В ходе данного исследования я выяснил, что AccessUSB представляет собой аппаратный ключ, вероятно выполненный в форм-факторе USB-флешки, дающий расширенный доступ к сервисным опциям и рутовую консоль.
Позже мне удалось исследовать другой телевизор, на несколько лет моложе моего. Выяснилось что поддержка AccessUSB сохранилась, ни протокол, ни ключи не изменились. У меня нет информации про самые последние модели, но вполне возможно, что и там всё осталось по старому.
На данный момент у меня нет никакой информации о том, кто имеет доступ к оригинальным AccessUSB - только сотрудники LG или эти ключи поставляются также и в сервисные центры, однако наличие возможности установить ограничения по времени и/или числу использований вероятно свидетельствует в пользу того, что какие-то сервисные центры могут их получать.
К сожалению, отсутствие закрытого ключа RSA не даёт возможность создать полнофункциональный аналог оригинального AccessUSB, однако если найдётся кто-то, имеющий доступ к оригинальному AccessUSB и желающий получить полнофункциональный клон без ограничений - пишите в приват или комменты, обсудим что можно сделать.
Комментарии (26)
Ombre
21.03.2022 15:36+7Ну, крут! Ковырялся как-то с подобной проблемой, так что ярко представляю сколько это, на самом деле, стоит труда. Спасибо, было интересно почитать.
lab412
21.03.2022 18:55+6а там вообще что то полезное есть или просто ради интереса туда пытаетесь влезть? ну может он кофе таки начнет готовить или говорить голосом знаменитостей? сервисное меню это хорошо, но практическая польза есть от того что там можно настроить?
iShrimp
21.03.2022 20:23+2Очевидно, чтобы расширить возможности старой, но всё ещё хорошо работающей, техники. Записывать видео, смотреть торренты, да всё что угодно.
WeoM
21.03.2022 20:56+3" получаем рутовую Linux консоль" на телике, а зачем это может пригодится - зависит только от фантазии юзера.
XenRE Автор
21.03.2022 20:59+6Из простого, самое полезное — включить DVR — он обычно отключен. И рутовый доступ — это всегда приятно, как минимум — можно ставить приложения без стора.
dkom
21.03.2022 21:03Когда покупался "серый" тв предназначенный для Европы, то в сервисном меню надо было менять регион для активации нужного набора приложений для своего региона и работы смарт-опций. Но это делалось и с обычного сервисного пульта. Через дебаг -режим, описанный выше, когда становятся доступны все опции можно активировать то что есть в дорогих моделях. Не секрет что плата может быть общая, система тоже, а разделение по моделям выполненно искуственными ограничениями в настройках этого меню. Та же запись эфира, которая была заблокированна по требованиям каналов. Разблокировалась через сервисное меню. Разумеется включаемая функция должна быть в железе. Если например динамическая подсветка не распаяна, то включение опции ее не добавит.
Soukhinov
21.03.2022 22:11+9В детстве мои знакомые пытались скопировать при помощи дискеты графический акселератор с одного компьютера (в котором он был — один из первых) на другой компьютер, без оного. Но у них ничего не получилось. На компьютере без акселератора игры так и тормозили, какие бы файлы они ни копировали.
SandroSmith
23.03.2022 01:23Так они просто (как и я) ярлык на акселератор копировали, а не его самого. И на одну дискетку от не влезет - надо было разбивать и на 7 штук записывать. Ну или 6 раз туда-обратно смотаться.
Vespertilio
23.03.2022 15:09Такой финт сработал бы с маком ) Сам в детстве на те же грабли встал, вот же не логичный UX все таки, если интуитивное действие не дает ожидаемый результат.
Rast1234
21.03.2022 22:57Очень круто! Захотел грохнуть в своем LG картинки дефолтные, которые он показывает как скринсейвер, думал рутануть не проблема, пошел искать... оказалось очень мало легкодоступной инфы и исследователей, видимо просто мало кому оно интересно. Зато нашел протокол управления по ip, и допинал его реализацию немного (для себя на c#, не выкладывал, но на гитхабе автору оригинального проекта на js подсказал как сделать). Рад, что кто-то более хардкорный копнул настолько глубоко!
Nengchak
22.03.2022 01:19Можете поделиться линком? И ещё интересует, там можно ли как-то ограничить подключаемые устройства по бт? Например, чтобы скрин миррор/смарт вью работал только с определеных устройств?
Rast1234
22.03.2022 02:20+1https://github.com/WesSouza/lgtv-ip-control/issues/58
там в комментах pdf с описанием протокола, сам репозиторий - реализация. про bluetooth ничего не знаю
Stringerfury
22.03.2022 11:52+2Возможно это другая тема, но рутануть lg телевизор можно с помощью сервиса rootmy.tv
Будет доступен кастомный магазин приложений, там и Ютуб без рекламы и торренты. Сделал на своей лыже 17 года, не нарадуюсь.
ЗЫ: плюс есть доступ по ssh
TedBeer
22.03.2022 00:31Насчет ограничения по счетчику-времени. Ковырял я как-то принтер большого формата на котором печатают многометровые рекламные банеры. Там надо было каждый год покупать новый USB ключ, чтобы софт, управляющий этим принтером, продолжал работать. Вот похожие ограничения там и были зашиты. Разработчики правда поленились использовать всю мощь ключа и выполнять какие-нибудь вычисления прямо на нем, так что достаточно было пропатчить драйвер в винде, чтобы ключ стал не нужен. Меня попросили поковырять, т.к. когда настал срок очередной покупки продавец пропал и не отвечал неделями (китайский новый год), а заказы взяты и работать надо. Так через меня подстраховались, а потом и продавец вышел на связь.
legioner
22.03.2022 07:23Интересно, есть ли способ включить телевизор через pl2303 в модели без ethernet/wifi? Очень не хочется городить lirc только ради одной функции включения. Подача дополнительного питания на pl2303 ничего не дало.
XenRE Автор
22.03.2022 18:09Драйвера для USB (и pl2303 в частности) работают под линуксом, а линукс стартует при включении ТВ, так что сомнительно. В дежурном режиме питанием управляет какой-то отдельный контроллер, про USB видимо не знающий вообще.
Как вариант — курить манулаы от коммерческих ТВ, смотреть как там это реализовано. Подозреваю, что до сих пор остался RS232.
RIG
22.03.2022 22:54У меня телевизор LG включается с помощью WOL (телевизор даже в спящем режиме подключён к WI-FI сети)
rdo
22.03.2022 08:40+1Читая посты про телевизоры, просто волосы дыбом становятся. Реклама в меню, постоянная отправка информации о том, что смотришь, какие-то секретные инженерные меню. Такое впечатление, что за отрасль никак не брались регуляторы и она осталась на уровне двадцатилетней давности, когда права покупателя вызывают у производителей только смех.
SpaceEngineer
22.03.2022 18:04А аудиокодек DTS можно включить/установить? Надоело искать торренты, где звук не-DTS.
theghost69
22.03.2022 22:51А нет ли у кого-нибудь полной прошивки под vestel-ы, а то ходят по инету апдейты-огрызки... хочу поковырять... У них там operatv/vewd - ну настолько замкнутая на себя вещь, и платное всё насквозь для пользователя...
saboteur_kiev
Естественно, что в любом техническом устройстве есть определенные инженерные доступы, которые затем режутся в продакшене различными методами.
Поскольку разработка телевизоров, включая как и модули ядра ОС, так и аппаратные изменения выполняются разными командами разработчиков и аутсорсеров, нужна возможность блокировать доступ к таким вещам обычным пользователям. И в случае утери инженерных плат (где есть все эти rs232 и так далее разъемы), следовало дополнительно ограничить это еще и хардварными ключами.
Когда я работал в проекте WebOs, у нас у каждого инженера был отдельный телевизор с инженерной платой, и один accessusb на отдел.
Если случайно перевел телевизор в Release режим то вернуть его в debug можно было только при поомщи accessusb
Спасибо за ностальжи, было приятно увидеть скриншоты, которые лет 10 назад были обыденностью на работе =)
XenRE Автор
Подробности не вспомните? Были ли ограничения по time/count, есть ли возможность сейчас достать этот accessusb — вдруг завалялся где?