В популярной открытой платформе для робототехники LeRobot, разрабатываемой компанией Hugging Face, обнаружена критическая уязвимость. Проблема получила идентификатор CVE-2026-25874 и связана с компонентом PolicyServer (сервер принятия решений), который отвечает за удалённый запуск моделей искусственного интеллекта. Уязвимость позволяет неаутентифицированному злоумышленнику выполнять произвольные команды операционной системы на сервере, где запущен данный сервис.
Что такое LeRobot и почему это важно
LeRobot - это платформа с открытым исходным кодом, созданная Hugging Face для реальной робототехники и машинного обучения. Она помогает разработчикам обучать и развёртывать алгоритмы управления роботами с помощью моделей ИИ. Архитектура платформы разделяет управление роботом и выполнение тяжёлых вычислений: RobotClient (клиент робота) работает непосредственно на устройстве, а PolicyServer запускается на отдельном сервере с графическим процессором. Робот отправляет на сервер данные с камер и датчиков, а сервер возвращает команды движения.
Такая архитектура повышает производительность и позволяет создавать более лёгких и дешёвых роботов, ведь им не нужно нести на борту мощный вычислитель. Однако именно эта сетевая архитектура и стала причиной уязвимости: сервер, принимающий данные по сети, оказался незащищённым.
Техническая суть проблемы
Корень уязвимости кроется в небезопасной десериализации данных. Сервер PolicyServer использует стандартный модуль Python под названием pickle для распаковки данных, полученных от клиентов по протоколу gRPC (протокол удалённого вызова процедур). Проблема в том, что формат pickle не предназначен для обработки данных из ненадёжных источников. В отличие от безопасных форматов вроде JSON, pickle может воссоздавать произвольные объекты Python и выполнять встроенные команды прямо в процессе распаковки.
В коде сервера есть два уязвимых обработчика. Первый называется SendPolicyInstructions() - он принимает настройки политики управления от клиента и сразу же передаёт полученные байты в функцию pickle.loads(). Второй обработчик, SendObservations(), делает то же самое с данными наблюдений от робота. И в том, и в другом случае проверка типа данных происходит только после десериализации, когда вредоносный код уже мог выполниться. Примечательно, что в исходном коде стоят комментарии # nosec, которые подавляют предупреждения статических анализаторов безопасности. То есть разработчики знали о рисках, но не устранили их.
Как работает атака
Злоумышленнику достаточно подключиться к открытому порту PolicyServer и отправить специально сформированные байты. Для этого создаётся класс Python с переопределённым методом __reduce__(), который указывает, какую функцию и с какими аргументами нужно вызвать при распаковке. Обычно это os.system() или subprocess.Popen(). После сериализации такого объекта через pickle.dumps() полученные байты отправляются на сервер. Когда сервер вызывает pickle.loads(), команда выполняется автоматически.
Исследователи безопасности подтвердили уязвимость в реальном тестовом окружении. Они установили официальную версию пакета lerobot v0.4.3 из PyPI без каких-либо изменений, запустили сервер PolicyServer с настройками по умолчанию и успешно выполнили команду cat /etc/passwd, записав результат в файл. Это доказывает, что атака работает без каких-либо дополнительных условий.
Последствия и риски
Уязвимость особенно опасна из-за контекста, в котором обычно работает LeRobot. Серверы с графическими процессорами, на которых запускается PolicyServer, часто имеют повышенные привилегии в системе и доступ к ценным ресурсам: наборам данных, моделям ИИ, внутренним сетям и дорогостоящему оборудованию.
После успешной атаки злоумышленник может полностью скомпрометировать сервер. Он способен украсть ключи доступа, учётные данные SSH, файлы моделей и другие конфиденциальные данные. Полученные секреты могут быть использованы для дальнейшего проникновения в инфраструктуру. Кроме того, атакующий может нарушить работу сервиса, повредить модели или остановить операции роботов. В сценариях, где платформа управляет физическими роботами, существует и риск безопасности: вредоносные команды могут вызвать небезопасные движения оборудования.
Отдельного внимания заслуживает потенциальная возможность перемещения по внутренней сети. Серверы с графическими процессорами и робототехнические среды часто находятся в привилегированных сегментах сети, что делает их привлекательной целью для злоумышленников, стремящихся проникнуть глубже в инфраструктуру организации.
Что делать
Проблема требует немедленного внимания от всех, кто использует LeRobot в продуктовой среде. Основная рекомендация - заменить использование pickle.loads() на безопасные форматы сериализации, такие как JSON, protobuf или safetensors. Pickle не должен применяться для обработки данных, поступающих из ненадёжных источников, поскольку это прямой путь к выполнению кода.
Также необходимо включить шифрование TLS для всех gRPC-соединений вместо небезопасного соединения по умолчанию. Следует внедрить аутентификацию клиентов с помощью токенов, сертификатов mTLS или JWT. Важно ограничить сетевой доступ к серверу: он не должен быть доступен из публичных сетей, только из доверенных внутренних сегментов с использованием файрволов и VPN.
До выхода официального патча можно временно отключить компонент PolicyServer, если он не используется, и запускать инференс локально на самом роботе. Систему, на которой работает сервис, стоит запускать от непривилегированного пользователя в изолированном контейнере с ограничениями AppArmor или SELinux.
Выводы
Обнаруженная уязвимость в LeRobot - классический пример того, как удобство разработки вступает в конфликт с безопасностью. Использование форматов сериализации, предназначенных для доверенного локального окружения, в сетевых сервисах создаёт критические риски. Отсутствие аутентификации и шифрования лишь усугубляет ситуацию. Этот случай напоминает, что в инфраструктуре машинного обучения и робототехники, где всё большее значение приобретает сетевое взаимодействие компонентов, безопасность проектирования должна быть приоритетом с самого начала, а не исправляться постфактум.
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2026-25874
- https://www.resecurity.com/es/blog/article/cve-2026-25874-hugging-face-lerobot-unauthenticated-rce-via-pickle-deserialization
- https://chocapikk.com/posts/2026/lerobot-pickle-rce/