ShadowCallStack

ShadowCallStack (SCS) — это инструментальный режим LLVM , который защищает от перезаписи адреса возврата (например, переполнения буфера стека) путем сохранения адреса возврата функции в отдельно выделенном ShadowCallStack в прологе функции неконечных функций и загрузки адреса возврата из ShadowCallStack в функцию. эпилог. Адрес возврата также хранится в обычном стеке для совместимости с размотчиками, но в остальном он не используется. Это гарантирует, что атаки, изменяющие адрес возврата в обычном стеке, не повлияют на поток управления программой.

В aarch64 инструментарий использует регистр x18 для ссылки на ShadowCallStack, а это означает, что ссылки на ShadowCallStack не нужно хранить в памяти. Это позволяет реализовать среду выполнения, которая не раскрывает адрес ShadowCallStack злоумышленникам, которые могут считывать произвольную память.

Выполнение

Android поддерживает ShadowCallStack как для ядра, так и для пользовательского пространства.

Включение SCS для ядра

Чтобы включить ShadowCallStack для ядра, добавьте следующую строку в файл конфигурации ядра:

CONFIG_SHADOW_CALL_STACK=y

Включение SCS в пользовательском пространстве

Чтобы включить ShadowCallStack в компонентах пользовательского пространства, добавьте следующие строки в файл схемы компонента:

sanitize: {
  scs: true
}

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

Проверка

Тестов CTS специально для SCS нет. Вместо этого убедитесь, что тесты CTS проходят с включенным SCS и без него, чтобы убедиться, что SCS не влияет на устройство.