ShadowCallStack

ShadowCallStack (СКС) представляет собой 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 только в автономных компонентах, которые не будут загружены в устаревшие двоичные файлы.

Проверка

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