Стоило Илону Маску пообещать нам создание умных помощников вроде C-3PO, как исследователи безопасности тут же решили проверить, не получится ли вместо этого настоящий Терминатор. Мы разобрали нашумевшее исследование команды Dark Navy и рассказываем, как популярного робота-гуманоида Unitree G1 за $16 000 превратили в хакерскую марионетку. 

В статье мы детально разберем цепочку уязвимостей: от перехвата нестандартного радиопротокола через SDR до инъекций кода в LLM-мозги робота и получения root-доступа. Вы узнаете, как исследователям удалось обойти защиту обфусцированного кода, выполнить полноценный джейлбрейк бюджетной версии робота и почему функция eval() в коде андроида страшнее любого восстания машин.

Кунг-фу есть, а где безопасность?

Всего десять лет назад человекоподобные роботы двигались с грацией железного дровосека. Теперь они паркурят, крутят сальто и даже обучаются кунг-фу. 

Технологии машинного обучения обеспечили впечатляющий и быстрый прорыв. Но пока маркетологи Tesla и Unitree снимают проморолики, где роботы заменяют нас на «грязной, скучной и опасной работе», этичные хакеры задают неудобный вопрос: а что с безопасностью? Выясняется, что пока роботы существовали лишь в научной фантастике, люди боялись их восстания. Зато теперь, как ни странно, никому нет дела до реальных рисков роботизации.

Оставим лирику и познакомимся с объектом исследования — роботом Unitree G1. На данный момент это, возможно, самый массовый андроид: его продажи уже перевалили за 50 тысяч единиц. Unitree G1 покупают и простые энтузиасты, и серьезные исследовательские институты. Что ж, отличная цель для ИБ-аудита. 

Команда Dark Navy приобрела для тестов самую «доступную» версию робота — G1 Air. Это самый бюджетный вариант, не предполагающий запуск пользовательских программ. За $16 000 такой андроид может выполнять лишь узкий набор заранее прописанных действий вроде ходьбы вперед и назад, поворотов и рукопожатия. Увы, никакого кунг-фу. Но исследователи решили исправить это при взломе.

Радиоперехват на коленке

В комплекте с G1 Air идет два инструмента управления: мобильное приложение и радиочастотный пульт, похожий на геймпад. Именно он первым привлек внимание исследователей. Каждый такой пульт имеет уникальный шестизначный PIN-код, который нужно ввести в приложении. В результате робот начинает слушать только свой пульт.

Но что за протокол здесь применяется? Чтобы выяснить это, исследователи разобрали пульт управления. На плате они обнаружили: 

  • микроконтроллер, для которого не было доступной прошивки и документации;

  • сервисный Bluetooth-чип, который, как выяснилось, использовался только для взаимодействия с приложением и тестирования кнопок; 

  • неизвестный радиомодуль на обратной стороне платы.

Маркировка на чипах радиомодуля была стерта, словно производитель специально пытался усложнить его идентификацию. Поэтому исследователи переключились в режим black-box реверса, комбинирующего OSINT и угадывание методом «научного тыка».

Поиск по открытым источникам дал первую серьезную зацепку. На просторах сети хакеры нашли утекший даташит, который позволил опознать таинственный радиомодуль. 

Стало ясно, что пульт управления роботом использует модуль дальней радиосвязи LoRa. Его эффективный радиус действия составляет десятки, а в идеальных условиях — даже сотни километров.

Утекший даташит дал ориентиры по частотам и полосе, но оказался неточным: реальные параметры радиоканала не совпадали с заявленными. Тем не менее, это уже была рабочая отправная точка. Теперь можно было переходить к перехвату эфира.

Исследователи вооружились SDR (Software-Defined Radio), популярным HackRF One, и начали сканировать радиоэфир в момент общения пульта с роботом. Сигнал был чистый, но представлял собой непонятный набор данных.

Процесс реверс-инжиниринга начался с анализа формы сигнала. Это позволило методом проб и ошибок подобрать один из ключевых параметров — коэффициент расширения спектра. Spreading factor оказался равен 5.

Так исследователям удалось получить из эфира первые осмысленные, хотя и «мусорные» байты. Пакеты приходили хаотично и не целиком, потому что протокол использовал технологию frequency hopping (FHSS) — скачкообразную перестройку частоты. Пульт постоянно «прыгал» по 80 разным каналам. Без знания алгоритма этих «прыжков» перехватить полную последовательность, казалось, было невозможно.

Тогда исследователи пошли на хитрость. В мире не так много компаний, производящих чипы LoRa. Сравнение параметров из даташитов с тем, что удалось нащупать в эфире, указало на чип SX1280.

Поиск по GitHub показал, что чип SX1280 не поддерживает аппаратный frequency hopping. Выходит, логика «прыжков» частоты была реализована программно, на уровне микроконтроллера пульта. Поскольку чип не дробит пакет данных между частотами аппаратно, исследователи поняли: можно просто игнорировать «прыжки» и слушать один центральный канал. Да, часть пакетов теряется, но те, что попадают в эфир, приходят целиком.

Углубившись в протокол, команда проекта наткнулась на еще один ключевой параметр — syncWord. По сути, это секретное «слово-пароль» на два байта, которое совпадает у приемника и передатчика, позволяя устройствам отличать свои пакеты от чужих. Без правильного syncWord чип просто проигнорирует передачу. К счастью, два байта — это всего 65 536 комбинаций. Для современного компьютера перебрать такое количество — плевое дело.

Исследователи написали и запустили скрипт для перебора, и вскоре нужная комбинация нашлась.

После подбора syncWord пакеты наконец начали декодироваться полностью. Данные внутри них передавались в абсолютно открытом виде — никакого шифрования. Структура пакета была до смешного простой: уникальный идентификатор пульта и команды управления.

В общем, написать свой «пульт» на ноутбуке с SDR-трансивером было не сложно. Теперь можно было управлять любым роботом Unitree G1 в радиусе действия сигнала: заставлять его выполнять простые действия вроде «иди сюда» или «уходи», «поворачивай» и т. д.

Исследователи, как и положено, сообщили об уязвимости вендору. Ответ Unitree был обескураживающим: «Мы знаем о проблеме, но забыли добавить функцию обновления прошивки в пульт, так что исправить это невозможно». Правда, вендор пообещал обеспечить более безопасную связь в новом поколении оборудования.

Сетевой доступ к управлению робота

Исследователи решили не останавливаться на перехвате управления в радиусе действия пульта. Они хотели добиться полного контроля над андроидом и нацелились на бортовой компьютер, который у Unitree G1 основан на чипе RK3588 под управлением кастомизированной ОС Ubuntu.

Вскоре команда Dark Navy наткнулась на уязвимость в сервисе подключения к Wi-Fi. При настройке Wi-Fi через Bluetooth робот принимал имя сети и пароль, которые передавались в shell-скрипт без санитизации и затем попадали в функцию system(). Достаточно было вставить в поле SSID конструкцию вроде “;$(whoami);#”, чтобы любая команда выполнялась с правами суперпользователя.

Пока Dark Navy готовили отчет, другая группа хакеров обнаружила этот же баг в робособаках Go2 и опубликовала эксплойт под названием Unipwn. Вы можете найти его на GitHub. Уязвимость перекочевала в гуманоида G1.

Дальнейший анализ показал, что внутренняя архитектура робота построена на двух протоколах: WebRTC для локальной сети и MQTT для связи с облаком. И оба были реализованы с поразительным уровнем доверия к окружающему миру.

WebRTC использовался для стриминга видео с камер робота в реальном времени. Выяснилось, что любой клиент в той же Wi-Fi сети может подключиться к WebRTC-серверу робота без какого-либо имени пользователя и пароля. Достаточно знать только IP-адрес робота. Авторы доклада иронично отмечают, что подобное поведение может считаться «фичей» для разработчиков, упрощающей отладку. Но для злоумышленника, попавшего в вашу корпоративную или домашнюю сеть Wi-Fi, это настоящий подарок. Он может незаметно подключиться к роботу и шпионить через его камеры.

При этом WebRTC работает по принципу peer-to-peer: видеопоток идет напрямую от робота к пользователю. Это означает, что сам вендор Unitree не имеет доступа к камерам, но и защиты от локального злоумышленника тоже нет.

Для удаленного управления через интернет робот использует протокол MQTT, общаясь с облачными серверами Unitree. Схема аутентификации здесь оказалась чуть сложнее, чем в случае с WebRTC. 

Реверс-инжиниринг показал, что логин — это серийный номер, а пароль генерируется на его основе. Подключившись к брокеру, исследователи обнаружили грамотную настройку прав: топики для чтения и записи были жестко разделены. Зная пароль, можно «слушать» робота, но не управлять им. Тупик?

Не совсем. Анализ входящего трафика показал, что облако отправляет роботу конфигурацию для Relay-сервера. И внутри этого JSON-сообщения, в поле параметров, инженеры Unitree зачем-то передавали пользовательский JWT-токен в открытом виде. Перехват этого токена дает полный контроль над аккаунтом пользователя в облаке Unitree. 

Таким образом, злоумышленник может выполнять любые действия от имени жертвы через облачный API: «отвязать» робота от пользователя, дать доступ к нему третьему лицу, управлять им и так далее.

Промывка мозгов

Как будто этого было мало, Unitree G1 оснастили голосовым ассистентом на базе большой языковой модели (LLM), аналогом ChatGPT. Этот ассистент может транслировать роботу разные команды: «подойди ко мне», «повернись», «потанцуй» и т. д. 

Вот как выглядит этот процесс в общих чертах: 

  • пользователь произносит команду;

  • приложение отправляет аудио на робота; 

  • сервис ChatGo распознает речь и отправляет текстовый запрос в облачный API LLM;

  • модель анализирует запрос и возвращает ответ в формате JSON. Этот ответ может быть двух типов: text_generate для озвучивания или function_call — структурированная команда для робота, например { "function": "rotate", "angle": "90" }.

Копаясь в Python-коде сервиса ChatGo, исследователи обнаружили в обработчике функции rotate подозрительную строку. Код брал значение угла поворота, пришедшее от LLM, и выполнял его с помощью функции eval()

Для любого Python-разработчика это огромный «красный флаг». eval() не просто вычисляет математические выражения, но и исполняет любую переданную ему строку как код Python.

Команда Dark Navy продемонстрировала три способа эксплуатации этой уязвимости. Первый, «промпт-инъекция», заключается в том, чтобы уговорить LLM сгенерировать вредоносный код. Этот метод работал, но не всегда стабильно. 

Второй способ — DNS-спуфинг. Он требует контроля над сетью, но позволяет перенаправить API языковой модели на свой сервер и подсовывать любую полезную нагрузку.

Самым изящным оказался третий метод — перенаправление API. Ключ к нему лежал в уязвимости WebRTC, о кото��ой мы говорили ранее. Оказалось, что сервис ChatGo предоставляет через тот самый неаутентифицированный WebRTC-интерфейс API для смены адреса сервера LLM. Злоумышленник в той же сети может просто отправить роботу команду «Эй, теперь твой мозг находится вот по этому адресу» и указать свой сервер.

Далее исследователи настроили свой сервер по принципу «человек посередине». Обычные запросы от робота пересылались на настоящий LLM-сервер. Если же в запросе содержалось кодовое слово, сервер отвечал вредоносной полезной нагрузкой, которая попадала прямиком в eval() и давала удаленное выполнение кода. Получив стабильный RCE, исследователи первым делом включили в роботе SSH и получили постоянный root-шелл. По умолчанию SSH-сервер на роботе был отключен.

Используя официальный SDK, они написали скрипт, который через внутренние сервисы отправлял низкоуровневые команды на моторы рук. Исследователи создали кастомное движение — резкий, сильный удар рукой. 

Теоретическая уязвимость в eval() превратилась в реальную физическую угрозу: робота научили драться. Для полного счастья осталось дать ему обрез и усадить на байк.

Джейлбрейк обфусцированной прошивки

Итак, исследователи получили root и могли управлять роботом удаленно, но не спешили откупоривать шампанское. Вмес��о этого они решили снять программные ограничения «дешевой» версии Air и сделать полноценный джейлбрейк андроида. Неожиданно, но тут команде пришлось попотеть. 

Ключевые бинарные файлы, отвечающие за управление роботом, оказались сильно обфусцированы. Это была многоуровневая защита: код расшифровывался только в памяти во время выполнения и изобиловал антиотладочными трюками. Его логика была скрыта за семью печатями сложной системой косвенных переходов. Так Unitree защищали свою главную интеллектуальную собственность — алгоритмы управления.

После обхода базовых антиотладочных техник исследователи поняли, что столкнулись с кастомной виртуальной машиной. Бинарник не просто выполнял инструкции ARM64, а содержал интерпретатор и байт-код для него. Чтобы понять внутреннюю логику, пришлось провести титаническую работу: исследователи реверсировали семантику виртуальных инструкций с помощью Unicorn, Angr и GDB, а затем написали собственный дизассемблер для этой кастомной ВМ.

«Вскрытие» показало, что это стековая виртуальная машина с набором из примерно 80 опкодов. Сложность заключалась в том, что инструкции имели переменную длину (от 2 до 10 байт), а одна инструкция ВМ могла соответствовать десяткам реальных инструкций ARM64. Более того, код использовал хитрые приемы анти-отладки: программа проверяла, открыты ли ее собственные файлы в памяти, пытаясь обнаружить вмешательство. Исследователям пришлось написать кастомную библиотеку-перехватчик, которая «обманывала» функции open и fopen, сообщая программе, что никто за ней не следит.

После нескольких недель мучительного реверс-инжиниринга логика проверок версии робота (базовая Air или продвинутая EDU) была найдена, и исследователи создали патч. Идея заключалась в том, чтобы с помощью LD_PRELOAD внедрить свою библиотеку, которая изменяла бы нужные байты «на лету» после саморасшифровки основного бинарника в памяти. Команда Dark Navy применила патч, перезагрузила робота и… игрушка за $16 000 превратилась в кирпич. Сеть не работала, Wi-Fi не поднимался, а из-за внесенных ранее изменений сломался и Bluetooth-эксплойт. 

Тут все могло бы и закончиться, но в команде были и специалисты по аппаратному хакингу. Они догадались заглянуть в документацию на более дорогую версию робота и заметили, что в ней две платы соединены по Ethernet. Это оказался отладочный интерфейс: но не обычный RJ45, а FPC-коннектор. 

Исследователи спаяли на коленке кастомный переходник на обычный RJ45, подключили ноутбук напрямую к роботу, прописали статический IP и получили SSH-доступ. 

Почему робот «умер»? Выяснилось, что разница между версиями Air и EDU не только в проверке if (model == basic). Бюджетная версия Air принудительно шифрует внутренний трафик по шине DDS, генерируя новые ключи при каждой перезагрузке. Патч отключил проверку модели, ядро системы «решило», что оно теперь EDU, и перестало шифровать команды. А вот периферийные контроллеры моторов все еще ждали зашифрованный поток. Из-за этого «языкового барьера» робот был парализован.

После более тщательной отладки и еще пары патчей исследователям наконец удалось снять все программные ограничения производителя. Теперь «дешевый» G1 Air получил все возможности EDU-версии, поддержку официального SDK и возможность управления каждым из 23 моторов напрямую.

Стоит отметить, что в более новых версиях G1 производитель включил Secure Boot на базе возможностей чипа Rockchip. Впрочем, по словам исследователей, реализована только проверка подписи прошивки без ее шифрования, так что потенциальная возможность взлома сохраняется.

Законы Азимова против root-доступа

Напоследок отвлечемся от технических деталей и подумаем о последствиях, которые влекут вышеописанные уязвимости. Как оказалось, атакующий может не только пассивно шпионить через камеру и микрофон робота, но и совершать активные физические действия: ходить, взаимодействовать с объектами, даже бить. Цепочка уязвимостей позволяет создать «робо-ботнет» и централизованно управлять целыми партиями взломанных андроидов.

Отдельные вопросы вызывают приоритеты производителя. Инженеры Unitree вложили колоссальные усилия в защиту своих алгоритмов, разработав собственную виртуальную машину и сложную обфускацию, но при этом оставили зияющие дыры в базовой безопасности: незащищенный радиопротокол, command injection и отсутствие аутентификации.

После успеха с G1 команда Dark Navy бегло изучила других гуманоидов и обнаружила схожие проблемы. Большинство компаний сегодня настолько сосредоточено на механике, алгоритмах походки и возможностях ИИ, что забывает про основы кибербезопасности. Хотя есть и исключения. Например, Boston Dynamics публикует подробные технические документы по безопасности своего робота Spot и применяет криптографическую подпись прошивок.

Мы все выросли на трех законах робототехники Азимова. Но что они значат в мире, где злоумышленник может получить root-доступ, переписать любые правила и заставить робота нарушить любой из этих законов? В реальности ничто не помешает роботу выполнить вредоносную команду, если она пришла с root-правами. Если производители не начнут внедрять безопасность по умолчанию прямо сейчас, то наше роботизированное будущее может оказаться мрачнее, чем в фантастических фильмах.

Это подводит нас к финальному вопросу. Что опаснее: гипотетический сверхразум в далеком будущем или вполне реальная функция eval() в коде робота, который может оказаться на заводе или даже в вашем доме уже завтра?


PURP — Telegram-канал, где кибербезопасность раскрывается с обеих сторон баррикад

t.me/purp_sec — инсайды и инсайты из мира этичного хакинга и бизнес-ориентированной защиты от специалистов Бастиона