Незаметные ошибки памяти, включая переполнение буфера и ошибки указателя, создают бомбы замедленного действия внутри ваших приложений. Злоумышленники могут использовать эти ошибки для выполнения неавторизованного кода, захватывать системы для добавления их в вредоносные бот-сети или просто вызывать сбои приложений и систем. Печально известный Morris Worm 1988 года был одним из первых примеров вредоносного приложения, использующего переполнение буфера. Объявления о проблемах с безопасностью памяти, создающих потенциальные эксплойты, поступают с тревожной частотой либо от исследователей безопасности, либо от обнаруженных в дикой природе.

Яндекс

Воздействие на пользователей может быть значительным. Несанкционированные приложения могут использовать небезопасную память, чтобы получить доступ к конфиденциальным данным, таким как учетные данные и пароли пользователей, что позволяет получить доступ к более высоким уровням привилегий в системе. Это позволяет злоумышленникам получить доступ к конфиденциальным данным или сделать систему частью более крупного ботнета. Не всегда внешние силы вызывают проблемы — иногда небезопасная память приводит к непредсказуемым сбоям системы из-за утечек памяти и связанных с ними проблем, расстраивая пользователей. По оценкам, две трети всех уязвимостей Android связаны с небезопасной памятью.

Расширение тегов памяти Arm

Программные решения, в том числе Address Sanitizer (Asan), помогают смягчить эти проблемы с памятью за счет интеграции обнаружения повреждения памяти в современные компиляторы. Однако Asan требует добавления программных инструментов в код приложения, что может значительно замедлить время выполнения приложения и увеличить использование памяти, что особенно проблематично в мобильных и встроенных системах.

Читайте также:
Графический процессор DG1 уже в продаже, графический процессор Xe-HPG DG2 находится в лабораторных условиях

Что необходимо, так это решение для обнаружения и минимизации ошибок памяти с минимальным влиянием на производительность и использование памяти. Правильная реализация аппаратного метода обнаружения потенциально небезопасного использования памяти приводит к меньшему использованию памяти и повышению производительности, одновременно повышая надежность и безопасность системы.

Компания Arm представила расширение тегов памяти как часть набора инструкций Armv8.5. MTE теперь встроен в Armv9-совместимые процессоры, недавно анонсированные Arm, такие как Cortex-X2, Cortex-A710 и Cortex-A510. Будущие процессоры на базе Armv9 также будут интегрировать MTE. Все они включают тегирование памяти как базовую часть архитектуры.

Идея тегирования памяти довольно проста: добавьте небольшой набор битов к фрагментам памяти, чтобы идентифицировать их как безопасные для использования в приложениях. Arm реализует маркировку памяти как двухфазную систему, известную как замок и ключ:

  • Маркировка адресов. Это добавляет четыре бита к вершине каждого указателя в процессе. Тегирование адресов работает только с 64-битными приложениями, поскольку оно использует игнорирование верхнего байта, что является 64-битной функцией Arm. Адресные теги действуют как виртуальный «ключ».
  • Маркировка памяти. Теги памяти также состоят из четырех бит, но связаны с каждой выровненной 16-байтовой областью в пространстве памяти приложения. Arm обращается к этим 16-байтовым регионам как метка гранул. Эти четыре бита не используются для данных приложения и хранятся отдельно. Тег памяти — это «замок».

Тег виртуального адреса (ключ) должен соответствовать тегу памяти (замку). В противном случае возникает ошибка.

Читайте также:
Google тестирует два новых беспилотника


Фигура 1. Показывает пример блокировки и ключа доступа к памяти

Поскольку тег адреса должен совпадать с тегом памяти, первое, что вы можете заметить, это то, что 4 бита — это всего лишь 16 вариантов. Это делает MTE случайным процессом, а это означает, что ключ может неправильно совпадать с другой блокировкой. По данным Arm, вероятность этого составляет менее 8%.

Поскольку теги адреса и памяти часто создаются и уничтожаются на лету, блоки распределения памяти работают, чтобы гарантировать, что последовательные теги памяти всегда различаются. MTE также поддерживает генерацию случайных тегов. Сочетание понимания распределителем памяти, что последовательные теги должны быть разными, плюс функция генерации случайных тегов означает, что фактическая частота конфликтов тегов довольно низка. Кроме того, использование MTE в парке из миллионов (или миллиардов) устройств может обеспечить надежное обнаружение ошибок для системного и прикладного программного обеспечения.

Базовая архитектура

Armv8.5 и v9 реализуют новый тип памяти, который Arm дублирует нормальную память с тегами. ЦП может определить безопасность доступа к памяти, сравнивая адресную метку с соответствующей меткой памяти. Разработчики могут выбрать, приводит ли несоответствие тегов к синхронному исключению или сообщается асинхронно, что позволяет приложению продолжить работу. На рисунке 2 показано, как MTE реализован в процессорах ARM.


Фигура 2. Решение Arm Total Compute (Armv9)

Детали асинхронного несоответствия накапливаются в системном регистре. Это означает, что ОС может изолировать несоответствия конкретным потокам выполнения и принимать решения на основе текущих операций.

Читайте также:
Lenovo Smart Cast: cмартфон-проектор от Lenovo

Синхронные исключения могут напрямую идентифицировать конкретную инструкцию загрузки или сохранения, вызывающую несоответствие тегов. Arm добавил множество новых инструкций в набор инструкций для управления тегами, обработки указателя и тегов стека, а также для низкоуровневого использования системы.

Внедрение Arm MTE

MTE обрабатывается аппаратно; Инструкции загрузки и сохранения были изменены для проверки того, что адресный тег соответствует тегу памяти, а выделение аппаратной памяти обеспечивает рандомизацию создания адреса и тега памяти. Это имеет разные последствия для разработчиков ОС и разработчиков приложений для конечных пользователей.

Arm улучшил когерентное межсоединение AMBA 5 для поддержки MTE. Логика проверки тегов обычно встроена в кэш системного уровня, при этом проверка тегов и кэширование тегов происходит перед интерфейсом DRAM. На рисунке 3 показан пример блок-схемы.


Рисунок 3: Пример блок-схемы, показывающей, как MTE может быть реализован в дизайне SoC. (Источник: Arm)

Чтобы полностью поддерживать MTE, необходимо изменить операционные системы. Изначально Arm создал прототип MTE, создав версию ядра Linux, в которой реализованы теги. Google выразил намерение добавить MTE в Android и работает с разработчиками SoC для обеспечения совместимости.

Разработчикам приложений для конечных пользователей немного проще, если операционная система поддерживает MTE. Поскольку MTE происходит за кулисами в ОС и оборудовании, приложения не требуют модификации исходного кода. Добавление тегов MTE к динамической памяти не требует дополнительных усилий. Однако для тегирования памяти в существующих средах выполнения с использованием стековой памяти требуется поддержка компилятора, поэтому существующие двоичные файлы необходимо перекомпилировать. Это просто, поскольку разработчики мобильных приложений и так часто выпускают обновления. На рисунке 4 показан график разработки программного обеспечения при внедрении MTE.

Читайте также:
Apple отрицает свою вину за взрыв наушников


Рисунок 4: График разработки программного обеспечения с помощью MTE

Для обеспечения защиты памяти может потребоваться выравнивание объектов памяти по Грануле тега (16-байтовое выравнивание). Это может увеличить использование стека и памяти, хотя влияние кажется минимальным.

Зачем использовать Arm MTE?

MTE предлагает разработчикам несколько улучшений качества жизни. MTE позволяет программистам быстро находить ошибки, связанные с памятью, ускоряя процесс отладки и разработки приложений. Поскольку ошибки памяти могут быть обнаружены и устранены раньше, такие проблемы, как утечки памяти, состояния гонки памяти и другие сбои, связанные с памятью, становятся более редкими. Это, в свою очередь, улучшает взаимодействие с конечным пользователем.

Ошибки, связанные с безопасностью памяти, составляют около двух третей всех распространенных ошибок, связанных с уязвимостями и уязвимостями (CVE), поэтому MTE позволяет компаниям отправлять приложения быстрее с меньшим количеством ошибок. Конечные пользователи могут часто неохотно переходить на новое оборудование или программное обеспечение операционной системы, но MTE дает им веские причины для обновления, включая повышение стабильности и общей безопасности.

Дальнейшая информация

Вы можете найти более подробную информацию о расширениях тегов памяти Arm в различных источниках.