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