Программно-аппаратная платформа CHERIoT 1.0 для повышения безопасности кода на языке Си

Представлен финальный вариант спецификации программной-аппаратной платформы CHERIoT 1.0 (Capability Hardware Extension to RISC-V for Internet of Things), определяющей расширение набора команд (ISA) для создания защищённых устройств. CHERIoT предоставляет аппаратные возможности для отслеживания доступа к памяти, проверки корректности работы с указателями и обеспечения изоляции блоков кода. Одновременно опубликован стабильный релиз эталонной формальной модели CHERIoT ISA, определённой на языке Sail. Наработки проекта распространяются под лицензией BSD.

Проект CHERIoT был создан компанией Microsoft для решения проблем с безопасностью в существующем коде на языках C и С++ и защиты подобного кода без необходимости его переработки. Защита реализуется через применение модифицированного компилятора, использующего расширенный набор процессорных инструкций (ISA) для обеспечения целостности указателей, контроля за границами при работе с памятью и предотвращения обращения к освобождённой памяти. В 2023 году наработки CHERIoT были открыты и преобразованы в совместный проект, к которому подключились и другие компании.

Аппаратные компоненты CHERIoT оформлены в виде микроконтроллера на базе архитектуры RISC-V, реализующего защищённую процессорную архитектуру CHERI (Capability Hardware Extension to RISC-V) c моделью управляемого доступа к памяти на основе «capability» (каждая операция чтения и записи в память авторизуется). На базе предоставляемой в CHERIoT архитектуры набора команд (ISA) построена программная модель, гарантирующая безопасность работы с памятью на уровне отдельных объектов, предоставляющая защиту от обращения к уже освобождённой памяти и реализующая легковесную систему изоляции доступа к памяти.

Указанная программная модель защиты напрямую отражается в языковую модель C/C++, что позволяет применять её для существующих приложений, для защиты которых требуется лишь перекомпиляция и запуск на оборудовании, поддерживающем ISA CHERIoT. Например, применение CHERIoT позволяет без внесения изменений в код реализовать автоматическую проверку границ, отслеживание времени жизни областей памяти и обеспечение целостности указателей в компонентах, обрабатывающих не заслуживающие доверия данные.

Среди проблем, блокируемых при помощи CHERIoT:

  • Выход за границы объекта в памяти;
  • Подмена указателей (при применении CHERIoT все указатели должны порождаться от уже существующих указателей);
  • Обращение к памяти после освобождения (любой доступ к памяти по некорректному указателю или указателю, ссылающемуся на освобождённый объект приводит при применении CHERIoT к генерации исключения).

Помимо спецификации и формальной модели проектом развивается эталонная реализация 32-разрядного RISC-V CPU Ibex c поддержкой ISA CHERIoT и модифицированный инструментарий LLVM. Cхемы прототипа CPU и описания аппаратных блоков на языке Verilog распространяются под лицензией Apache 2.0. В качестве основы для CPU использовано ядро Ibex от проекта lowRISC. На базе ядра CHERIoT Ibex готовятся к массовому производству чипы ICENI, поступление в продажу которых запланировано на следующий год. Отдельно компанией Microsoft развивается микроконтроллер Kudu с поддержкой ISA CHERIoT. Ibex и Kudu уже полностью поддерживают спецификацию CHERIoT 1.0. Ведётся работа по стандартизации CHERI-расширений для процессоров RISC-V в организации RISC-V International.

Дополнительно развивается эмулятор платформы на базе FPGA и Docker-контейнер для разработчиков с предустановленным инструментарием и симулятором CPU Ibex, реализованным при помощи Verilator. Кроме того, на базе CHERIoT подготовлен прототип операционной системы реального времени CHERIoT RTOS, предоставляющей возможность изоляции компартментов (compartment) даже на встраиваемых системах с 256 МБ ОЗУ. Код CHERIoT RTOS написан на языке С++ и распространяется под лицензией MIT. В форме компартментов оформлены базовые компоненты ОС, такие как загрузчик, планировщик и система распределения памяти.

Компартмент в CHERIoT RTOS представляет собой изолированную комбинацию кода и глобальных переменных, которая напоминает разделяемую библиотеку, но в отличие от последней может менять своё состояние (mutable) и запускаться в отдельном контексте безопасности. Никакой код извне не может передать управление коду в компартменте и получить доступ к объектам, за исключением обращения к специально определённым точкам входа и использования указателей на объекты, явно переданные при вызове другого компартмента. Для кода и глобальных объектов в компартменте гарантируется целостность и конфиденциальность.

Источник: http://www.opennet.ru/opennews/art.shtml?num=64180