Найдена критическая уязвимость CVSS 9.4 в программном обеспечении космических миссий
Исследовательница кибербезопасности обнаружила критическую уязвимость CVSS 9.4 в ПО для управления космическими миссиями AIT-GUI, вызванную четырьмя ошибками проектирования кода.

В мире разработки программного обеспечения такие ошибки, как «забыли отфильтровать ввод» или «нет проверки в POST-запросе», являются повседневным делом. В худшем случае хакер изменит картинку на главной странице или сольет базу данных с email-адресами. Но что происходит, когда подобные строки кода проникают прямо в интерфейс управления NASA/JPL — сервер, отвечающий за мониторинг космических аппаратов, передачу команд и синхронизацию оборудования в далекой-далекой галактике?
В ходе недавнего исследования мы начали изучать код AIT-GUI — веб-интерфейса пользовательского набора инструментов AMMOS Instrument Toolkit. Эта система с открытым исходным кодом используется инженерами и операторами космического агентства для связи с аппаратурой во время космических миссий. Мы даже не предполагали, что обнаружим там критическую уязвимость безопасности (GHSA-p9r8-2q67-fp86), получившую почти максимальную оценку опасности по шкале CVSS — 9.4.
Как четыре мелкие ошибки открывают путь к удаленному выполнению команд
Чтобы понять, насколько критичной была ситуация, представьте ряд запертых дверей, в которых разработчики просто забыли установить замки, повесив табличку «Вход воспрещен». Для доступа не требовались пароль, имя пользователя или специальные привилегии. Сочетание четырех незначительных ошибок привело к созданию смертоносной цепочки атак.
- Сервер, который слушает всех: В коде существовала переменная host, считывающая адрес localhost из настроек. Отличная идея, верно? Вот только разработчик, запускавший сервер, просто забыл передать ей эту переменную.
host = getattr(self, "host", "localhost") # значение считывается, но никогда не используется
...
gevent.pywsgi.WSGIServer(
("0.0.0.0", port), # жестко закодировано: все интерфейсы
App, handler_class=WebSocketHandler,
)
Результат: Сервер остался жестко привязан к адресу 0.0.0.0. Оператор системы уверен, что она изолирована в локальной сети, в то время как его сервер распахнут для любых запросов с любого IP-адреса.
-
Полное отсутствие базовых механизмов защиты: В системе не были внедрены процедуры входа (Login), CSRF-токены или CORS-ограничения. Хуже того, запросы на изменение отправлялись в формате, распознаваемом браузером как «простой» (application/x-www-form-urlencoded), что позволяло выполнять междоменные (Cross-Origin) запросы без предварительной проверки. Проще говоря, оператору достаточно было зайти во время работы на безобидный на вид сайт, чтобы тот инициировал скрытый фоновый запрос на выполнение команд от его имени.
-
Открытый канал для передачи команд (POST /cmd): Система предоставляла конечную точку, позволяющую отправлять команды напрямую операционным компонентам. Без защитных слоев и фильтров поступающий ввод просто разбирался и передавался в командную шину системы (Command Bus):
command = bottle.request.forms.get("command").strip()
args = command.split()
name = args[0].upper()
args = [util.toNumber(t, t) for t in args[1:]]
if self.send(name, *args): # команда передается на шину
- Побег из песочницы (Path Traversal): Вишенкой на торте стал компонент, отвечающий за выполнение скриптов (POST /seq). Код брал имя файла от пользователя и конкатенировал его с корневым путем без проверки границ:
bn_seqfile = bottle.request.forms.get("seqfile")
seqfile = os.path.join(SEQRoot, bn_seqfile)
# отсутствие изоляции; используется только os.path.isfile
gevent.subprocess.Popen(["ait-seq-send", seqfile], ...)
Результат: Злоумышленник может внедрить путь с использованием последовательностей ../../../../, выйти за пределы разрешенной директории и запустить любой файл или скрипт на сервере.
Когда исследователь встречается с агентами ИИ
Одним из самых увлекательных моментов в процессе обнаружения стало использование Agentic AI — автономных агентов искусственного интеллекта для анализа кода. Если человеческий глаз склонен упускать небольшую переменную, которая объявлена в коде, но не передается дальше (как в случае с сервером 0.0.0.0), то агенты ИИ просканировали потоки данных и смогли быстро связать нефильтрованный ввод с драматическими действиями на конечных точках. Синергия между интуицией кибербезопасника и способностью ИИ анализировать код на глубоком уровне позволила нам в кратчайшие сроки расшифровать всю цепочку атаки.
Как и в любом нашем исследовании, сразу после обнаружения уязвимости мы обратились к разработчикам в рамках процедуры ответственного раскрытия информации. В космическом агентстве отреагировали оперативно, приняли отчет и исправили уязвимые компоненты в обновленной версии AIT-GUI 2.5.2.
Нельзя полагаться на изолированную среду
Мир веб-технологий и мир операционных систем (OT) пересекаются сегодня теснее, чем когда-либо. Если скомпрометированный POST-запрос в обычном приложении приведет максимум к сбою базы данных, то в системах OT и тем более в космической инфраструктуре речь идет о командах, отправляемых физическому оборудованию в полевых условиях, и радиус поражения здесь совершенно иной.
Межсетевые экраны (Firewalls) давно перестали быть готовым планом безопасности. Нельзя полагаться на закрытую среду в надежде, что «никто не доберется до внутреннего сервера». Открытый код — даже тот, что пишется для космических проектов, — должен строиться с самого начала на принципах Zero Trust, с жесткими механизмами аутентификации, строгим контролем доступа и тщательной санитарией каждого входящего параметра на уровне кода.
На личном уровне исследователя кибербезопасности есть что-то захватывающее в моменте, когда ты сидишь перед монитором в Тель-Авиве, смотришь на строчки Python и понимаешь, что заглядываешь прямо в пульт управления космическими миссиями. Это напоминает о том, что за самыми амбициозными начинаниями человечества в конечном итоге стоят люди, пишущие код.





