Маршрутизатор Starlink будет перезагружаться каждые 20 дней. Реверс-инжиниринг прошивки
Маршрутизатор Starlink
Инженер встраиваемых систем и астрофизик Олег Кутков в ожидании тарелки Starlink разобрал фирменный маршрутизатор и начал разбор прошивки. Хотя по функциональности это обычный WiFi-роутер, но обнаружилось несколько интересных деталей реализации.
Маршрутизатор не спроектирован для лёгкого разбора и самостоятельного ремонта. Крышка не прикручена винтами, а скреплена внутренним креплением, так что при снятии придётся слегка помять алюминиевый корпус.
Весь металлический корпус про сути работает как большой радиатор, это одна цельная деталь.
Здесь и далее фото Олега Куткова
Внутри довольно простая материнская плата.
Маршрутизатор работает на популярной однокристалльной системе Qualcomm IPQ4018: это 4-ядерный ARM Cortex A7 (тактовая частота 717 МГц), 802.11ac WiFi, по два канала 5 и 2,4 ГГц, SIMD DSP, Crypto Engine, QualcommTrusted Execution Environment (TEE) и т.д.
Компоненты на нижней стороне материнской платы подписаны на фотографии, в том числе микросхема TPS2378 и флэш-память NAND W25N01GV с операционной системой маршрутизатора.
На лицевой стороне платы самый интересный компонент — микросхема STSAFE-A110 для криптографических операций Linux с аппаратной поддержкой OpenSSL. На этом чипе хранится конфигурация платы и сертификаты. А также микросхема NOR флэш-памяти GD25Q128B с загрузчиком Qualcomm и некоторой дополнительной информацией.
Олег Кутков извлёк с платы чипы NOR и NAND, произвёл анализ прошивки, в том числе проприетарных файлов, которые отсутствуют в официальном репозитории SpaceX. Прошивка основана на OpenWRT.
С чипа NAND удалось снять образ Linux, образ rootfs файловой системы SquashFS с операционной системой OpenWRT и софтом SpaceX, а также образ ubifs с конфигурационными файлами.
Там лежит защищённый файл /etc/config/WifiConfig
, это бинарник, который используется проприетарными программами SpaceX.
В целом, базовая прошивка не особенно отличается от ванильной OpenWRT, кроме нескольких специфических параметров SpaceX в скриптах. Например, такая настройка с любопытными комментариями:
# SpaceX: As a failsafe, we limit the uptime of our devices to 20 days. After 20 days
# this script will stop petting the watchdog, which will lead to it rebooting after
# about 2 minutes. To do this, we first take manual control of the watchdog from
# procd, using the ubus commands.
pet_watchdog() {
# Wait one minute to let ubus system fully boot
sleep 60
echo "Start Petting Watchdog"
ubus call system watchdog '{"magicclose": true}'
ubus call system watchdog '{"stop": true}'
# Pet every 10 seconds for 20 days (1,728,000 seconds)
for var in `seq 1 172800`; do echo 1 ; sleep 10; done > /dev/watchdog
}
Здесь объясняется, что аптайм маршрутизатора Starlink ограничен 20 днями, после чего он будет автоматически перезагружаться, что гарантирует ему даунтайм на 1 минуту. Говорят, что это нормальная практика в мире встраиваемых систем. Многие из них уходят в принудительную перезагрузку по таймеру, зачастую это происходит незаметно для пользователя.
Среди файлов особое любопытство вызывает бинарник /usr/sbin/wifi_control
: это гигантское приложение на Go, которое контролирует все аспекты работы маршрутизатора. Судя по всему, некоторые параметры типа серверных IP-адресов и URL зашиты прямо в код.
Автор запустил прошивку на сторонней плате AP.dk04. Кроме того, он подключил криптографический чип STSAFE-A110 к Raspberry Pi через специальный адаптер.
С помощью официальной библиотеки и набора инструментов можно протестировать содержимое чипа и извлечь из него сертификат, действительный до 2050 года.
В данный момент автор продолжает анализ вышеупомянутого проприетарного файла /usr/sbin/wifi_control
, который делает много интересного: поднимает серверы gRPC (основной протокол связи в Starlink), отправляет телеметрию в SpaceX и многое другое.
Сейчас Олег Кутков производит реверс-инжиниринг внутреннего протокола, чтобы можно было нормально общаться с серверами Starlink. Например, запрашивать обновления прошивки с предъявлением сертификата и т. д.
Ждём продолжения.