Найти в Дзене

Скачивание прошивок устройств Яндекс v2

В 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 подобного вида:

version_code можно подставить в заголовок build-fingerprind и загрузить следующую версию
version_code можно подставить в заголовок build-fingerprind и загрузить следующую версию

P.S.
В реальности, запросы к
https://quasar.yandex.net/tv/api/v4/updates идущие с устройств дополнительно подписаны - но сейчас сервер отвечает и без подписи.
Для подписи используются ключи, которые хранятся в keymaster. Как пользоваться утилитой keymaster_proxy_app для вычисления подписи, запустив ее на устройстве, а также как сдампить и расшифровать ключи из keymaster для использования их на ПК (это возможно например, на камере) я напишу как-нибудь в другой раз.

mamaichmamaich dzen