25 уязвимостей в RTOS Zephyr, в том числе эксплуатируемые через ICMP-пакет
Исследователи из компании NCC Group опубликовали результаты аудита свободного проекта Zephyr, развивающего операционную систему реального времени (RTOS), нацеленную на оснащение устройств, соответствующих концепции "Интернет вещей" (IoT, Internet of Things). В ходе аудита было выявлено 25 уязвимостей в Zephyr и 1 уязвимость в MCUboot. Разработка Zephyr ведётся при участии компаний Intel.
В сумме было выявлено 6 уязвимостей в сетевом стеке, 4 - в ядре, 2 - в командной оболочке, 5 в обработчиках системных вызовов, 5 в подсистеме USB и 3 в механизме обновления прошивки. Двум проблемам присвоен критический уровень опасности, двум - высокий, 9 умеренный, 9 - низкий и 4 - для принятия во внимание. Критические проблемы затрагивают IPv4 стек и парсер MQTT, опасные - драйверы USB mass storage и USB DFU. На момент раскрытия информации исправления были подготовлены только для 15 наиболее опасных уязвимостей, неисправленными пока остаются проблемы, приводящие к отказу в обслуживании или связанные с недоработками в механизмах дополнительной защиты ядра.
В IPv4 стеке платформы выявлена удалённо эксплуатируемая уязвимость, приводящая к повреждению памяти при обработке определённым образом модифицированных ICMP-пакетов. Ещё одна серьёзная проблема найдена в парсере протокола MQTT, которая вызвана отсутствием должной проверки длины полей в заголовке и может привести удалённому выполнению кода. Менее опасные проблемы, приводящие к отказу в обслуживании, найдены в IPv6-стеке и реализации протокола CoAP.
Остальные проблемы могут быть эксплуатированы локально для вызова отказа в обслуживании или выполнения кода на уровне ядра. Большая часть из данных уязвимостей связана с отсутствие должных проверок аргументов системных вызовов, и может привести к в записи и чтения произвольных областей памяти ядра. Проблемы охватывают и непосредственно код обработки системных вызовов - обращение по отрицательному номеру системного вызова приводит к целочисленному переполнению. В ядре также выявлены проблемы в реализации защиты ASLR (рандомизация адресного пространства) и механизма установки канареечных меток в стеке, делающие данные механизмы неэффективными.
Много проблем затрагивают USB-стек и отдельные драйверы. Например, проблема в USB mass storage позволяют вызвать переполнение буфера и выполнить код на уровне ядра при подключении устройства к подконтрольному атакующему USB-хосту. Уязвимость в USB DFU, драйвере для загрузки новой прошивки по USB, позволяет загрузить модифицированный образ прошивки во внутренний Flash микроконтроллера без применения шифрования и обойдя режим защищённой загрузки с проверкой компонентов по цифровой подписи. Дополнительно был изучен код открытого загрузчика MCUboot, в котором была найдена одна неопасная уязвимость, которая может привести к переполнению буфера при испльзовании протокола SMP (Simple Management Protocol) через UART.
Напомним, что в Zephyr для всех процессов предоставляется только одно глобальное совместно используемое виртуальное адресное пространство (SASOS, Single Address Space Operating System). Специфичный для приложений код комбинируется с адаптированным под конкретное применение ядром и образует монолитный исполняемый файл для загрузки и запуска на определённом оборудовании. Все системные ресурсы определяются на этапе компиляции, что сокращает размер кода и увеличивает производительность. В системный образ могут включаться только те возможности ядра, которые требуются для выполнения приложения.
Примечательно, что среди ключевых достоинств Zephyr упоминается разработка с оглядкой на безопасность. Утверждается, что все стадии разработки проходят обязательные этапы подтверждения безопасности кода: fuzzing-тестирование, статический анализ, испытания на проникновение, рецензирование кода, анализ внедрения бэкдоров и моделирование угроз.