В 2023 году я описал, каким образом устройства Яндекс скачивают обновления своих прошивок. В современных устройствах данный способ по прежнему используется, но, судя по тому, что я вижу в дампе трафика, на устройствах с YaOS он уже не является основным.
В устройствах с операционной системой Android проверка наличия обновлений производится по ссылке https://quasar.yandex.net/tv/api/v4/updates. Данная ссылка не только возвращает информацию о свежей прошивке, но и сообщает какие APK пакеты следует обновить. По данной ссылке требуется отправить POST запрос с JSON, содержащим информацию об установленных пакетах:
И добавить HTTP заголовки, описывающие устройство. Заголовки требуются следующие:
"Build-Fingerprint: Yandex/yandexstation_2/yandexstation_2:9/PPR1.180610.011/3112819406:user/release-keys"
"X-YaQuasarPlatform: yandexstation_2"
"X-YaQuasarDeviceId: 1234567890abcdef"
"Content-Type: application/json; charset=utf-8"
"Host: quasar.yandex.net"
Build-Fingerprint: значение ro.system.build.fingerprint из файла build.prop
X-YaQuasarPlatform: код модели устройства (аналогично кодам платформы из прошлой статьи).
X-YaQuasarDeviceId: серийный номер устройства. В качестве серийника можно указать любой набор символов - сервер проверяет только наличие заголовка.
Остальные два HTTP заголовка - стандартные.
Для отправки запроса я использую утилиту curl. Вот пример команды curl целиком:
curl -H "Build-Fingerprint: Yandex/yandexmodule2/yandexmodule2:9/PI/1702990681:user/release-keys" -H "X-YaQuasarPlatform: yandexmodule_2" -H "X-YaQuasarDeviceId: 1234567890abcdef" -H "Content-Type: application/json; charset=utf-8" -H "Host: quasar.yandex.net" --compressed -X POST https://quasar.yandex.net/tv/api/v4/updates -d "{\"installed_apps\":[{\"package_name\":\"ru.kinopoisk.yandex.tv\",\"version_code\":73918,\"version_name\":\"2.183.3\"}]}"
В данном примере указана только версия пакета Кинопоиска. Устройства отправляют на сервер полный список APK пакетов, независимо от Яндекса они или поставлены вручную.
Примеры build.fingerprint:
Yandex/yandexmodule2/yandexmodule2:9/PI/1702990681:user/release-keys
yandex/magritte/magritte:11/RD2A.211001.002/3172496625:user/dev-keys
SK68Y/malevich/malevich:14/UP1A.231005.007.A1/3190421630:user/dev-keys
Yandex/yandexstation_2/yandexstation_2:9/PPR1.180610.011/3112819406:user/release-keys
Amlogic/chiron/chiron:11/RQ3A.210805.001.A1/2792473108:user/dev-keys
Выделенные жирным цифры - номер билда. Можно заменить на 0, либо подставить реальный номер. Я сильно не игрался, но похоже, что из всей этой строки проверяется только номер билда, так как можно указать X-YaQuasarPlatform отличный от устройства, указанного в fingerprint, и получить валидный ответ. Например, таким образом можно получить прошивку для Яндекс IP камеры, которая работает на чистом Linux, а не на YaOS:
curl -H "Build-Fingerprint: Yandex/yandexmodule2/yandexmodule2:9/PI/0:user/release-keys" -H "X-YaQuasarPlatform: mike" -H "X-YaQuasarDeviceId: 67890a" -H "Content-Type: application/json; charset=utf-8" -H "Host: quasar.yandex.net" --compressed -X POST https://quasar.yandex.net/tv/api/v4/updates -d "{\"installed_apps\":[]}"
(Прошивка IP камеры зашифрована, для расшифровки нужно иметь устройство - инструкцию опубликую где-то через неделю).
В качестве ответа сервер возвращает json подобного вида:
P.S.
В реальности, запросы к https://quasar.yandex.net/tv/api/v4/updates идущие с устройств дополнительно подписаны - но сейчас сервер отвечает и без подписи.
Для подписи используются ключи, которые хранятся в keymaster. Как пользоваться утилитой keymaster_proxy_app для вычисления подписи, запустив ее на устройстве, а также как сдампить и расшифровать ключи из keymaster для использования их на ПК (это возможно например, на камере) я напишу как-нибудь в другой раз.