Персонализираното ядро ​​на Kirisakura за OnePlus 8 Pro позволява Control Flow Integrity (CFI) за по-добра сигурност

Технически подробности относно целостта на контролния поток

„Наличието на огромен брой функционални указатели в ядрото подпомага популярността на този модел на атака. Дори ако нападателите не могат да инжектират свой собствен изпълним код, произволни части от съществуващия код на ядрото могат да бъдат изпълнени, за да завършат експлойта си.

LLVMCFI на CFI се опитва да смекчи тези атаки, като ограничава валидните цели на повикване и принуждава паника на ядрото при откриване на нарушение на CFI. Добавя се проверка преди всеки индиректен клон, за да се потвърди, че целевият адрес сочи към валидна функция с правилен подпис. Това предотвратява непряк клон от прескачане до произволно местоположение на код и дори ограничава функциите, които могат да бъдат извикани. Нападателят все още ще може да промени указател на функция, ако грешка позволява достъп. Но CFI на LLVM ограничава 55% от непреките повиквания до най-много 5 възможни цели и 80% до най-много 20 цели. За да определи всички валидни цели за повикване за всеки индиректен клон, компилаторът трябва да види целия код на ядрото наведнъж.

Използването на LTO (Оптимизиране на времето за връзка) прави това възможно. CFI на LLVM изисква използването на LTO, където компилаторът произвежда специфичен за LLVM биткод за всички C компилационни единици, а LTO-съзнаващ линкер използва бекенда на LLVM, за да комбинира биткода и да го компилира в роден код.

В допълнение към разрешаването на използването на CFI, LTO постига по-добра производителност по време на изпълнение чрез анализ на цялата програма и оптимизиране на различни модули.

ThinLTO почти настигна подобрението на производителността на LTO. В режим ThinLTO, както при обикновен LTO, дрънкане излъчва LLVM биткод след фазата на компилиране. ThinLTO bitcode е допълнен с компактно резюме на модула. По време на стъпката на свързване само обобщенията се четат и обединяват в комбиниран обобщен индекс, който включва индекс на местоположения на функции за по-късно импортиране на функция между модули. След това се извършва бърз и ефективен анализ на цялата програма върху комбинирания обобщен индекс. ThinLTO позволява многонишков процес на свързване, което води до намалено време за компилиране.

Тъй като CFI прекъсва изпълнението на програмата при срещане на определени класове грешки, той също се класифицира като инструмент за намиране на грешки, както беше споменато по-рано, когато се използва в разрешителен режим. Permissive CFI ще покаже нарушения на CFI в регистрационния файл на ядрото, без да предизвиква паника в ядрото. Основните ядра 4.9 (устройства от поколение Pixel 3) и 4.14 (устройства от поколение Pixel 4) имаха няколко типа функции несъответствия, водещи до нарушения на CFI, които бяха адресирани от Google в набори от корекции, налични в ядрото/common репо сделки.

Въпреки това, поради естеството на екосистемата на Android, тези несъответствия вероятно ще бъдат намерени и в специфичния код на производителя на SoC (в този случай Qualcomm) или OEM (OnePlus). Няколко нарушения на CFI в кода на Qualcomm, различен от ядрото 4.19, бяха коригирани в ядрото Kirisakura за OnePlus 8 Pro (пример: 1, 2, 3).

Изпълнението на ядрото в разрешителен CFI разкри нарушения на CFI в кода, свързан и с драйверите на OnePlus (могат да бъдат намерени съответните ангажименти тук и тук). Ядрото на Kirisakura за OnePlus 8 Pro работи с наложен CFI, защитавайки своите потребители срещу този вид атаки за повторно използване на код."

Прочетете още

Направи си сам ентусиаст (т.е. спасител на стари компютърни части). Страстен потребител на Android от времето на Eclair, Skanda също обича да следва последните тенденции в развитието на света на едноплатковите компютри.