Найдена критическая уязвимость CVSS 9.4 в программном обеспечении космических миссий

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

GeektimeАвтор: Юваль АльберБекэнд-разработчик
Источник
Найдена критическая уязвимость CVSS 9.4 в программном обеспечении космических миссий
Фото: Geektime / תמונה: NASA

В мире разработки программного обеспечения такие ошибки, как «забыли отфильтровать ввод» или «нет проверки в POST-запросе», являются повседневным делом. В худшем случае хакер изменит картинку на главной странице или сольет базу данных с email-адресами. Но что происходит, когда подобные строки кода проникают прямо в интерфейс управления NASA/JPL — сервер, отвечающий за мониторинг космических аппаратов, передачу команд и синхронизацию оборудования в далекой-далекой галактике?

В ходе недавнего исследования мы начали изучать код AIT-GUI — веб-интерфейса пользовательского набора инструментов AMMOS Instrument Toolkit. Эта система с открытым исходным кодом используется инженерами и операторами космического агентства для связи с аппаратурой во время космических миссий. Мы даже не предполагали, что обнаружим там критическую уязвимость безопасности (GHSA-p9r8-2q67-fp86), получившую почти максимальную оценку опасности по шкале CVSS — 9.4.

Как четыре мелкие ошибки открывают путь к удаленному выполнению команд

Чтобы понять, насколько критичной была ситуация, представьте ряд запертых дверей, в которых разработчики просто забыли установить замки, повесив табличку «Вход воспрещен». Для доступа не требовались пароль, имя пользователя или специальные привилегии. Сочетание четырех незначительных ошибок привело к созданию смертоносной цепочки атак.

  1. Сервер, который слушает всех: В коде существовала переменная host, считывающая адрес localhost из настроек. Отличная идея, верно? Вот только разработчик, запускавший сервер, просто забыл передать ей эту переменную.

host = getattr(self, "host", "localhost") # значение считывается, но никогда не используется

...

gevent.pywsgi.WSGIServer(

 ("0.0.0.0", port), # жестко закодировано: все интерфейсы

 App, handler_class=WebSocketHandler,

)

Результат: Сервер остался жестко привязан к адресу 0.0.0.0. Оператор системы уверен, что она изолирована в локальной сети, в то время как его сервер распахнут для любых запросов с любого IP-адреса.

  1. Полное отсутствие базовых механизмов защиты: В системе не были внедрены процедуры входа (Login), CSRF-токены или CORS-ограничения. Хуже того, запросы на изменение отправлялись в формате, распознаваемом браузером как «простой» (application/x-www-form-urlencoded), что позволяло выполнять междоменные (Cross-Origin) запросы без предварительной проверки. Проще говоря, оператору достаточно было зайти во время работы на безобидный на вид сайт, чтобы тот инициировал скрытый фоновый запрос на выполнение команд от его имени.

  2. Открытый канал для передачи команд (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): # команда передается на шину

  1. Побег из песочницы (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 и понимаешь, что заглядываешь прямо в пульт управления космическими миссиями. Это напоминает о том, что за самыми амбициозными начинаниями человечества в конечном итоге стоят люди, пишущие код.

Читайте также