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 не влияет на устройство.