Компания Microsoft открыла наработки, связанные с проектом CHERIoT (Capability Hardware Extension to RISC-V for Internet of Things), нацеленным на блокирование проблем с безопасностью в существующем коде на языках C и С++. CHERIoT предлагает решение, позволяющее защитить существующие кодовые базы на С/C++ без необходимости их переработки. Защита реализуется через применение модифицированного компилятора, использующего специальный расширенный набор процессорных инструкций (ISA), на уровне аппаратного обеспечения отслеживающих доступ у памяти, проверяющих корректность работы с указателями и обеспечивающих изоляцию блоков кода.
Проект создан с оглядкой на то, что низкоуровневый характер языка C становится источником ошибок при работе с памятью, приводящих к таким проблемам, как переполнение буфера, обращение к уже освобождённой памяти, разыменование указателей или двойное освобождение памяти. Практика показывает, что даже крупные корпорации, такие как Google и Microsoft, имеющие жёсткую политику рецензирования изменений и применяющие современные методы разработки и инструменты статического анализа, не могут гарантировать отсутствие ошибок при работе с памятью (например, около 70% уязвимостей в программных продуктах Microsoft и Google вызваны небезопасной работой с памятью).
Проблема может быть решена использованием языков программирования, гарантирующих безопасную работу с памятью, или обвязок с дополнительными проверками, например, применение вместо обычных указателей типа MiraclePtr (raw_ptr), выполняющего дополнительные проверки обращения к освобождённым областям памяти. Но подобные методы больше подходят для нового кода, а уже существующие проекты на С/C++ переработать достаточно проблематично, особенно если они предназначены для выполнения в окружениях с ограниченными ресурсами, таких как встраиваемые системы и устройства интернет-вещей.
Аппаратные компоненты CHERIoT оформлены в виде микроконтроллера на базе архитектуры RISC-V, реализующего защищённую процессорную архитектуу CHERI (Capability Hardware Extension to RISC-V), предоставляющую модель управляемого доступа к памяти на основе “capability” (каждая операция чтения и записи в память авторизуется). На базе предоставляемой в CHERIoT архитектуры набора команд (ISA) построена программная модель, обеспечивающая безопасность работы с памятью на уровне отдельных объектов, предоставляющая защиту от обращения к уже освобождённой памяти и реализующая лековесную систему изоляции доступа к памяти. Указанная программная модель защиты напрямую отражается в языковую модель C/C++, что позволяет применять её для защиты существующих приложений.
Предложенное решение позволяет блокировать ошибки, вызывающие выход за границы объекта в памяти, не допускает подмену указателей (все указатели должны порождаться от уже существующих указателей), отслеживает обращение к памяти после освобождения (любой доступ к памяти по некорректному указателю или указателю, ссылающемуся на освобождённый объект приводит к генерации исключения). Например, применение CHERIoT позволяет без внесения изменений в код реализовать автоматическую проверку границ, отслеживание времени жизни областей памяти и обеспечение целостности указателей в компонентах, обрабатывающих не заслуживающие доверия данные.
Проект включает в себя спецификацию расширенной архитектуры набора команд, эталонную реализацию 32-разрядного CPU RISC-V c поддержкой ISA CHERI и модифицированный инструментарий LLVM. Cхемы прототипа CPU и описания аппаратных блоков на языке Verilog распространяются под лицензией Apache 2.0. В качестве основы для CPU использовано ядро Ibex от проекта lowRISC. Модель кода CHERIoT ISA определена на языке Sail и распространяется под лицензией BSD.
Дополнительно предложен прототип операционной системы реального времени CHERIoT RTOS, предоставляющей возможность изоляции компартментов (compartment) даже на встраиваемых системах с 256 МБ ОЗУ. Код CHERIoT RTOS написан на языке С++ и распространяется под лицензией MIT. В форме компартментов оформлены базовые компоненты ОС, такие как загрузчик, планировщик и система распределения памяти.
Компартмент в CHERIoT RTOS представляет собой изолированную в комбинацию кода и глобальных переменных, которая напоминает разделяемую библиотеку, но в отличие от последней может менять своё состояние (mutable) и запускаться в отдельном контексте безопасности. Никакой код извне не может передать управление коду в компартменте и получить доступ к объектам, за исключением обращения к специально определённым точкам входа и использования указателей на объекты, явно переданных при вызове другого компартмента. Для кода и глобальных объектов в компартменте гарантируется целостность и конфиденциальность.