CHERI: аппаратная память безопасность и изоляция для C/C++ без переписывания кода
Архитектура CHERI от Кембриджского университета переопределяет указатели, обеспечивая пространственную и временную безопасность памяти для C/C++, масштабируется до микроконтроллеров и заменяет дорогостоящие межпроцессные вызовы легковесной компартментализацией. Рассказываем, как это работает и почему не требует переписывания кодовой базы.

Безопасность памяти остаётся одной из самых острых проблем разработки на C и C++: по данным Microsoft и Google, около 70% уязвимостей в их продуктах связаны именно с ошибками работы с памятью. Архитектура CHERI (Capability Hardware Enhanced RISC Instructions), разрабатываемая Кембриджским университетом совместно с SRI International и другими партнёрами, предлагает аппаратное решение, которое позволяет достичь пространственной и временной безопасности памяти без переписывания существующего кода. На конференции QCon London 2025 Дэвид Чисналл, старший научный сотрудник Microsoft Research и один из ключевых разработчиков CHERI, представил доклад, в котором объяснил, как эта архитектура меняет подход к изоляции и совместному использованию данных, а также как она масштабируется от микроконтроллеров до полноценных серверов.
Суть CHERI в том, что она переопределяет понятие указателя: вместо простого адреса памяти каждый указатель становится «capability» — объектом, который несёт в себе не только адрес, но и границы допустимого диапазона, права доступа и метаданные о состоянии. Это позволяет процессору аппаратно проверять каждое обращение к памяти, предотвращая выход за границы буфера, доступ к уже освобождённой памяти и другие классические ошибки. При этом CHERI не требует изменений в исходном коде: компилятор автоматически генерирует обновлённый машинный код, а операционная система может использовать новые возможности для изоляции процессов и модулей.
CHERI: аппаратная безопасность памяти и компартментализация
CHERI — это не просто набор инструкций, а полноценная архитектурная надстройка, которая может быть реализована на базе различных RISC-процессоров, включая RISC-V и ARM. Основная идея заключается в том, что каждый указатель в программе становится «capability» — объектом, который содержит не только адрес, но и информацию о границах допустимой области памяти, правах на чтение, запись и выполнение, а также флаги, указывающие на состояние объекта. Это позволяет процессору аппаратно проверять каждое обращение к памяти, предотвращая выход за границы буфера, доступ к уже освобождённой памяти и другие классические ошибки.
Ключевое преимущество CHERI — совместимость с существующим кодом. Разработчикам не нужно переписывать программы: достаточно перекомпилировать их с помощью специального компилятора, который автоматически преобразует обычные указатели в capabilities. При этом производительность снижается незначительно — по оценкам исследователей, не более 10–15% для большинства приложений, что приемлемо для систем, где безопасность критична.
Кроме того, CHERI предоставляет механизм тонкой компартментализации: программа может быть разделена на изолированные модули, каждый из которых имеет собственные права доступа к памяти. Это позволяет заменить дорогостоящие межпроцессные вызовы (IPC) и системные вызовы операционной системы на лёгкие переходы между компартментами, которые выполняются аппаратно и не требуют переключения контекста ядра. Такой подход повышает производительность и упрощает аудит безопасности, поскольку каждый модуль можно проверять независимо.
Предыстория и контекст
Проблема безопасности памяти не нова: ещё в 1970-х годах исследователи предлагали различные механизмы, от сегментации до тегов, но все они были либо слишком дорогими, либо несовместимыми с существующими архитектурами. Современные подходы, такие как AddressSanitizer или MemorySafe, работают на уровне программного обеспечения и накладывают значительные накладные расходы, что делает их непригодными для продакшена в большинстве случаев. CHERI решает эту проблему аппаратно, что позволяет достичь безопасности без существенного снижения производительности.
Проект CHERI начался в 2010 году в Кембриджском университете. За эти годы было создано несколько прототипов, включая CHERI-MIPS, CHERI-RISC-V и CHERI-ARM. В 2023 году была выпущена спецификация CHERI ISA, которая стала основой для коммерческих реализаций. В настоящее время CHERI активно тестируется в проекте Morello от Arm, который предоставляет экспериментальный чип на базе ARMv8, а также в проекте CHERIoT, нацеленном на микроконтроллеры и встраиваемые системы.
Дэвид Чисналл, который является одним из ведущих экспертов в области безопасного программирования и ранее работал над языком D, в своём докладе подчеркнул, что CHERI — это не просто исследовательский проект, а зрелая технология, готовая к внедрению. Он отметил, что уже существуют операционные системы, такие как CheriBSD (ответвление FreeBSD), которые полностью поддерживают CHERI, и что крупные компании, включая Microsoft и Google, изучают возможность использования CHERI в своих продуктах.
Как CHERI обеспечивает пространственную и временную безопасность?
Пространственная безопасность достигается за счёт того, что каждый capability содержит границы допустимой области памяти. При каждом обращении к памяти процессор проверяет, находится ли адрес в пределах этих границ, и если нет — генерирует исключение. Это предотвращает такие ошибки, как переполнение буфера, чтение за пределами массива и доступ к неинициализированным данным. Временная безопасность решается с помощью механизма «tagged memory»: при освобождении памяти все capabilities, указывающие на неё, аннулируются, и последующие попытки обращения к ним вызывают ошибку. Это предотвращает использование после освобождения (use-after-free) и двойное освобождение.
Важно, что все эти проверки выполняются аппаратно, поэтому они не замедляют выполнение программ так сильно, как программные аналоги. По оценкам, накладные расходы составляют от 5 до 15% в зависимости от нагрузки, что приемлемо для большинства применений. Кроме того, CHERI позволяет разработчикам постепенно внедрять безопасность: можно начать с перекомпиляции всего проекта и получить базовую защиту, а затем постепенно добавлять компартментализацию для критических частей.
Технические подробности: как работает компартментализация
Традиционная изоляция между процессами в операционных системах основана на виртуальной памяти и требует переключения контекста, которое является дорогостоящим. CHERI предлагает альтернативу: компартменты — это изолированные области памяти внутри одного адресного пространства, которые имеют собственные capabilities. Переход между компартментами выполняется с помощью специальной инструкции, которая проверяет права доступа и передаёт управление, не привлекая ядро. Это значительно быстрее, чем IPC, и позволяет создавать очень мелкие модули, что упрощает аудит безопасности.
Например, в CheriBSD каждый процесс может быть разделён на несколько компартментов, каждый из которых имеет доступ только к определённым областям памяти. Если один компартмент скомпрометирован, атакующий не сможет получить доступ к данным других компартментов, так как у него не будет соответствующих capabilities. Это ограничивает ущерб от атаки и упрощает локализацию проблемы.
CHERIoT — это вариант CHERI для микроконтроллеров, который использует 16-битные указатели и может работать на устройствах с очень ограниченными ресурсами. Это открывает возможность использования безопасной памяти в интернете вещей, где встроенные устройства часто имеют слабую защиту и становятся лёгкой мишенью для атак. CHERIoT уже используется в некоторых коммерческих продуктах, например, в микроконтроллерах от компании SCI Semiconductor.
Кого затронет и как
CHERI представляет интерес для широкого круга специалистов. Разработчики на C и C++ получат возможность создавать безопасные приложения без переписывания кода, что особенно актуально для систем с высокими требованиями к безопасности, таких как финансовые сервисы, медицинское оборудование, автомобильные системы и авионика. Инженеры по безопасности смогут использовать CHERI для построения изолированных сред и борьбы с эксплуатацией уязвимостей. Операционные системы и компиляторы, такие как FreeBSD и LLVM, уже имеют поддержку CHERI, что облегчает внедрение.
В России и СНГ интерес к CHERI также растёт, особенно в контексте импортозамещения и необходимости создания надёжных систем для критической инфраструктуры. Однако массового внедрения пока нет, так как требуются аппаратные платформы и обучение специалистов. Тем не менее, исследовательские группы в МГУ и ИСП РАН уже изучают возможности CHERI для защиты от уязвимостей в системном ПО.
Что будет дальше
Ожидается, что в ближайшие годы CHERI будет внедряться в коммерческие процессоры. Arm уже выпустила экспериментальный чип Morello, который доступен для тестирования, и планирует включить поддержку CHERI в будущие версии архитектуры ARM. RISC-V также активно развивает поддержку CHERI, и несколько компаний, включая SiFive, уже анонсировали процессоры с этой технологией. Microsoft Research продолжает исследования в этой области, а компания SCI Semiconductor выпускает микроконтроллеры с CHERIoT.
Однако остаются вопросы, требующие решения. В частности, необходимо разработать эффективные методы перехода на CHERI для больших кодовых баз, а также обеспечить совместимость с существующими библиотеками и инструментами. Кроме того, важно оценить влияние CHERI на производительность в реальных приложениях и разработать методики тестирования безопасности.
Итог
CHERI — это зрелая и перспективная технология, которая может кардинально изменить подход к безопасности памяти в C/C++. Она обеспечивает аппаратную защиту без переписывания кода, масштабируется от микроконтроллеров до серверов и уже поддерживается в популярных операционных системах и компиляторах. Внедрение CHERI в коммерческие продукты может существенно снизить количество уязвимостей и повысить надёжность критических систем. Следить за развитием этой технологии стоит всем, кто занимается разработкой встраиваемых систем, системным программированием или обеспечением безопасности.