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