Technické podrobnosti o integritě řídicího toku
„Dostupnost velkého počtu funkčních ukazatelů v jádře napomáhá popularitě tohoto vzoru útoku. I když útočníci nemohou vložit vlastní spustitelný kód, mohou být k dokončení jejich zneužití spuštěny libovolné části existujícího kódu jádra.
LLVMCFI se pokouší zmírnit tyto útoky omezením platných cílů volání a vynucením paniky jádra při detekci porušení CFI. Před každou nepřímou větev je přidána kontrola, která potvrzuje, že cílová adresa ukazuje na platnou funkci se správným podpisem. To zabraňuje nepřímé větvi ve skoku na libovolné umístění kódu a dokonce omezuje funkce, které lze volat. Útočník bude stále moci změnit ukazatel funkce, pokud mu chyba umožní přístup. Ale CFI LLVM omezuje 55 % nepřímých volání na maximálně 5 možných cílů a 80 % na maximálně 20 cílů. Aby bylo možné určit všechny platné cíle volání pro každou nepřímou větev, kompilátor potřebuje vidět celý kód jádra najednou.
Využití LTO (Optimalizace doby propojení) to umožňuje. CFI LLVM vyžaduje použití LTO, kde kompilátor vytváří bitkód specifický pro LLVM pro všechny C kompilační jednotky a linker s vědomím LTO používá backend LLVM ke spojení bitového kódu a jeho kompilaci do nativní kód.
Jako doplněk k povolení použití CFI dosahuje LTO lepšího běhového výkonu prostřednictvím analýzy celého programu a optimalizace mezi moduly.
ThinLTO téměř dohnalo zlepšení výkonu LTO. V režimu ThinLTO, stejně jako u běžného LTO, Zvonit po fázi kompilace vysílá bitový kód LLVM. Bitkód ThinLTO je rozšířen o kompaktní shrnutí modulu. Během kroku propojení se přečtou pouze souhrny a sloučí se do kombinovaného souhrnného indexu, který obsahuje index umístění funkcí pro pozdější import funkcí mezi moduly. Poté je provedena rychlá a efektivní analýza celého programu na kombinovaném souhrnném indexu. ThinLTO umožňuje vícevláknový proces propojení, což vede ke zkrácení doby kompilace.
Vzhledem k tomu, že CFI přeruší provádění programu při zasažení určitých tříd chyb, klasifikuje se také jako nástroj pro vyhledávání chyb, jak již bylo zmíněno, když se používá v permisivním režimu. Permisivní CFI zobrazí porušení CFI v protokolu jádra, aniž by vyvolalo paniku jádra. Jádra jádra 4.9 (zařízení Pixel 3 generace) a 4.14 (zařízení Pixel 4 generace) měla několik typů funkcí neshody vedoucí k porušení CFI, které Google řešil v sadách oprav dostupných na kernel/common repos.
Vzhledem k povaze ekosystému Android se však tyto neshody pravděpodobně nacházejí také v kódu specifickém pro výrobce SoC (v tomto případě Qualcomm) nebo OEM (OnePlus). Několik porušení CFI v kódu Qualcomm odlišného od jádra 4.19 bylo opraveno na jádře Kirisakura pro OnePlus 8 Pro (příklad: 1, 2, 3).
Spuštění jádra v permisivním CFI odhalilo porušení CFI v kódu souvisejícím také s ovladači OnePlus (relevantní commity lze nalézt tady a tady). Kernel Kirisakura pro OnePlus 8 Pro běží s vynuceným CFI a chrání své uživatele před tímto druhem útoků s opětovným použitím kódu."
Přečtěte si více
DIY nadšenec (tedy zachránce starých PC dílů). Skanda, vášnivý uživatel Androidu od dob Eclair, také rád sleduje nejnovější vývojové trendy ve světě jednodeskových počítačů.