Целостность потока управления ядром

Целостность потока управления (CFI) — это механизм безопасности, который запрещает внесение изменений в исходный граф потока управления скомпилированного двоичного файла, что значительно усложняет выполнение таких атак.

В Android 9 мы включили реализацию CFI в LLVM в большем количестве компонентов, а также в ядре. Системный CFI включен по умолчанию, но вам необходимо включить CFI ядра.

CFI LLVM требует компиляции с оптимизацией времени соединения (LTO) . LTO сохраняет представление объектных файлов в битовом коде LLVM до времени компоновки, что позволяет компилятору лучше понять, какие оптимизации можно выполнить. Включение LTO уменьшает размер конечного двоичного файла и повышает производительность, но увеличивает время компиляции. При тестировании на Android сочетание LTO и CFI приводит к незначительному снижению размера кода и производительности; в некоторых случаях оба улучшились.

Дополнительные технические подробности о CFI и о том, как выполняются другие проверки прямого управления, см. в проектной документации LLVM .

Выполнение

Патчи kCFI присутствуют во всех поддерживаемых версиях ядра Android. Параметр CONFIG_CFI_CLANG включает kCFI и установлен по умолчанию в GKI.

Поиск неисправностей

После включения устраните любые ошибки несоответствия типов, которые могут возникнуть в их драйверах. Косвенный вызов функции через несовместимый указатель функции приводит к отключению CFI. При обнаружении сбоя CFI ядро ​​выводит предупреждение, в котором указывается как вызванная функция, так и трассировка стека, которая привела к сбою. Исправьте это, обеспечив, чтобы указатели на функции всегда имели тот же тип, что и вызываемая функция.

Чтобы помочь в отладке сбоев CFI, включите CONFIG_CFI_PERMISSIVE , который выводит предупреждение вместо того, чтобы вызывать панику ядра. Разрешительный режим не должен использоваться в производстве.

Проверка

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