Tekniska detaljer om Control Flow Integrity
"Tillgängligheten av ett stort antal funktionspekare i kärnan underlättar populariteten av detta attackmönster. Även om angripare inte kan injicera sin egen körbar kod, kan godtyckliga delar av befintlig kärnkod exekveras för att fullborda deras utnyttjande.
LLVMs CFI försöker mildra dessa attacker genom att begränsa giltiga samtalsmål och tvinga fram en kärnpanik när de upptäcker en CFI-överträdelse. En kontroll läggs till före varje indirekt gren för att bekräfta att måladressen pekar på en giltig funktion med korrekt signatur. Detta förhindrar en indirekt gren från att hoppa till en godtycklig kodplats och begränsar till och med de funktioner som kan anropas. En angripare kommer fortfarande att kunna ändra en funktionspekare om en bugg tillåter åtkomst. Men LLVM: s CFI begränsar 55 % av de indirekta samtalen till högst 5 möjliga mål och 80 % till högst 20 mål. För att fastställa alla giltiga samtalsmål för varje indirekt gren måste kompilatorn se hela kärnkoden på en gång.
Användningen av LTO (Optimering av länktid) gör detta möjligt. LLVM: s CFI kräver användning av LTO, där kompilatorn producerar LLVM-specifik bitkod för alla C kompileringsenheter och en LTO-medveten länkare använder LLVM-backend för att kombinera bitkoden och kompilera den till ursprunglig kod.
Som komplement till att tillåta användningen av CFI, uppnår LTO bättre körtidsprestanda genom analys av hela programmet och optimering över flera moduler.
ThinLTO har nästan kommit ikapp LTOs prestandaförbättring. I ThinLTO-läge, som med vanlig LTO, Klang sänder ut LLVM-bitkod efter kompileringsfasen. ThinLTO-bitkoden utökas med en kompakt sammanfattning av modulen. Under länksteget läses endast sammanfattningarna och slås samman till ett kombinerat sammanfattningsindex, som inkluderar ett index över funktionsplatser för senare funktionsimport över flera moduler. Därefter utförs snabb och effektiv analys av hela programmet på det kombinerade sammanfattningsindexet. ThinLTO tillåter en flertrådig länkningsprocess, vilket resulterar i minskad kompileringstid.
På grund av att CFI avbryter programexekveringen när man träffar vissa buggklasser, klassificeras den också som ett felsökningsverktyg, som tidigare nämnts, när det används i tillåtande läge. Tillåtande CFI kommer att visa CFI-överträdelser i kärnloggen, utan att tvinga fram en kärnpanik. Kärnorna 4.9 (Pixel 3-generationsenheter) och 4.14 (Pixel 4-generationsenheter) hade flera funktionstyper felmatchningar som resulterade i CFI-överträdelser, som åtgärdades av Google i patchset tillgängliga på kärnan/common repor.
Men på grund av Android-ekosystemets natur kommer dessa oöverensstämmelser sannolikt också att finnas i SoC-tillverkaren (i det här fallet Qualcomm) eller OEM (OnePlus) specifik kod. Flera CFI-överträdelser i Qualcomm-koden som skiljer sig från 4.19-kärnan fixades på Kirisakura-kärnan för OnePlus 8 Pro (exempel: 1, 2, 3).
Att köra kärnan i tillåtande CFI avslöjade CFI-överträdelser i kod relaterade till OnePlus-drivrutiner (relevanta åtaganden kan hittas här och här). Kirisakura-kärnan för OnePlus 8 Pro körs med CFI påtvingad, vilket skyddar användarna mot denna typ av återanvändningsattacker."
Läs mer
Gör-det-själv-entusiast (dvs. bärgare av gamla PC-delar). Skanda, en ivrig användare av Android sedan Eclair-dagarna, gillar också att följa de senaste utvecklingstrenderna i världen av enkortsdatorer.