Technische details over Control Flow-integriteit
"De beschikbaarheid van een groot aantal functieaanwijzers in de kernel draagt bij aan de populariteit van dit aanvalspatroon. Zelfs als aanvallers geen eigen uitvoerbare code kunnen injecteren, kunnen willekeurige delen van de bestaande kernelcode worden uitgevoerd om hun exploit te voltooien.
LLVM's CFI probeert deze aanvallen te beperken door geldige oproepdoelen te beperken en een kernelpaniek te forceren bij het detecteren van een CFI-schending. Vóór elke indirecte vertakking wordt een controle toegevoegd om te bevestigen dat het doeladres verwijst naar een geldige functie met een correcte handtekening. Dit voorkomt dat een indirecte vertakking naar een willekeurige codelocatie springt en beperkt zelfs de functies die kunnen worden aangeroepen. Een aanvaller kan nog steeds een functieaanwijzer wijzigen als een bug toegang toestaat. Maar de CFI van LLVM beperkt 55% van de indirecte oproepen tot maximaal vijf mogelijke doelen en 80% tot maximaal twintig doelen. Om alle geldige aanroepdoelen voor elke indirecte vertakking te bepalen, moet de compiler alle kernelcode in één keer zien.
Het gebruik van LTO (Optimalisatie van de linktijd) maakt dit mogelijk. De CFI van LLVM vereist het gebruik van LTO, waarbij de compiler LLVM-specifieke bitcode produceert voor alle C compilatie-eenheden, en een LTO-bewuste linker gebruikt de LLVM-backend om de bitcode te combineren en te compileren inheemse code.
Als aanvulling op het toestaan van het gebruik van CFI, behaalt LTO betere runtime-prestaties door middel van analyse van het hele programma en optimalisatie van meerdere modules.
DunneLTO heeft de prestatieverbetering van de LTO bijna ingehaald. In de ThinLTO-modus, net als bij gewone LTO, Klang zendt LLVM-bitcode uit na de compileerfase. De ThinLTO-bitcode is aangevuld met een compacte samenvatting van de module. Tijdens de koppelingsstap worden alleen de samenvattingen gelezen en samengevoegd tot een gecombineerde samenvattingsindex, die een index van functielocaties bevat voor latere import van functieoverschrijdende functies. Daarna wordt een snelle en efficiënte analyse van het hele programma uitgevoerd op de gecombineerde samenvattende index. ThinLTO maakt een multi-threaded koppelingsproces mogelijk, wat resulteert in een kortere compilatietijd.
Omdat CFI de uitvoering van het programma onderbreekt bij het raken van bepaalde bugklassen, wordt het, zoals eerder vermeld, ook geclassificeerd als een hulpmiddel voor het opsporen van bugs, wanneer het in de permissieve modus wordt gebruikt. Toegeeflijke CFI zal CFI-schendingen in het kernellogboek weergeven, zonder een kernelpaniek te forceren. De kernkernels 4.9 (apparaten van de Pixel 3-generatie) en 4.14 (apparaten van de Pixel 4-generatie) hadden verschillende functietypen mismatches resulterend in CFI-schendingen, die door Google zijn verholpen in patchsets die beschikbaar zijn op de kernel/common repository's.
Vanwege de aard van het Android-ecosysteem zijn deze mismatches echter waarschijnlijk ook te vinden in de specifieke code van de SoC-fabrikant (in dit geval Qualcomm) of OEM (OnePlus). Verschillende CFI-schendingen in de Qualcomm-code die specifiek zijn voor de 4.19-kernel zijn opgelost op de Kirisakura-kernel voor de OnePlus 8 Pro (bijvoorbeeld: 1, 2, 3).
Het uitvoeren van de kernel in tolerante CFI onthulde ook CFI-overtredingen in code met betrekking tot OnePlus-stuurprogramma's (relevante commits kunnen worden gevonden hier En hier). De Kirisakura-kernel voor de OnePlus 8 Pro draait met CFI-afdwinging en beschermt gebruikers tegen dit soort aanvallen op hergebruik van code."
Lees verder
Doe-het-zelver (d.w.z. berger van oude pc-onderdelen). Skanda is een fervent gebruiker van Android sinds de Eclair-dagen en volgt ook graag de recente ontwikkelingstrends in de wereld van single-board computing.