Samenvatting
1. Inleiding
2. Achtergrond
3. Bedreigingsmodel
4. Tag Lekkage Gadgets Vinden
5. TIKTAG Gadgets
6. Praktijkaanvallen
6.1. Chrome Aanvallen
7. Evaluatie
8. Gerelateerd werk
9. Conclusie en Referenties
\
Om de exploiteerbaarheid van TIKTAG gadgets in MTE-gebaseerde mitigatie te demonstreren, ontwikkelt dit hoofdstuk twee praktijkaanvallen tegen Chrome en de Linux-kernel (Figuur 9). Er zijn verschillende uitdagingen bij het lanceren van praktijkaanvallen met TIKTAG gadgets. Ten eerste moeten TIKTAG gadgets worden uitgevoerd in de doeladresruimte, waardoor de aanvaller gadgets moet construeren of vinden in het doelsysteem. Ten tweede moet de aanvaller de cachestatus kunnen controleren en observeren om de tag-controleresultaten te lekken. In het volgende demonstreren we de praktijkaanvallen met TIKTAG gadgets op twee real-world systemen: de Google Chrome browser (§6.1) en de Linux-kernel (§6.2), en bespreken we de mitigatiestrategieën.
\ 6.1. Chrome Aanvallen
Browser Een webbrowser is een primair aanvalsoppervlak voor webgebaseerde aanvallen omdat deze onbetrouwbare webinhoud verwerkt, zoals JavaScript en HTML. We geven eerst een overzicht van het bedreigingsmodel (§6.1.1) en presenteren een TIKTAG gadget geconstrueerd in de V8 JavaScript-engine (§6.1.2). Vervolgens demonstreren we de effectiviteit van TIKTAG gadgets bij het exploiteren van de browser (§6.1.3) en bespreken we de mitigatiestrategieën (§6.1.4).
\ ==6.1.1. Bedreigingsmodel.== We volgen het typische bedreigingsmodel van Chrome browseraanvallen, waarbij de aanvaller streeft naar het exploiteren van geheugencorruptiekwetsbaarheden in het renderer-proces. We nemen aan dat de slachtoffergebruiker de door de aanvaller gecontroleerde website bezoekt, die een kwaadaardige webpagina aanbiedt. De webpagina bevat gemanipuleerde HTML en JavaScript, die geheugencorruptiekwetsbaarheden exploiteren in het renderer-proces van het slachtoffer. We nemen aan dat alle state-of-the-art mitigatietechnieken van Chrome aanwezig zijn, waaronder ASLR [18], CFI [15], site-isolatie [53] en V8 sandbox [56]. Bovendien nemen we als orthogonale verdediging aan dat het renderer-proces willekeurige MTE-tagging in PartitionAlloc [2] inschakelt.
\ ==6.1.2. TIKTAG Gadget Construeren.== In de V8 JavaScript-omgeving werd TIKTAG-v2 succesvol geconstrueerd en lekte de MTE-tags van elk geheugenadres. We vonden echter geen construeerbare TIKTAG-v1 gadget, omdat de strakke timingbeperking tussen BR en CHECK niet haalbaar was in onze speculatieve V8 sandbox escape-techniek (§A).
V8 TikTag-v2 Gadget. Figuur 8 is de TIKTAG-v2 gadget geconstrueerd in de V8 JavaScript-engine en de pseudo-C-code na JIT-compilatie. Met deze gadget kan de aanvaller leren of de geraden tag Tg overeenkomt met de tag Tm toegewezen aan target_addr. De aanvaller bereidt drie arrays voor, slow, victim, probe, en een idx-waarde. slow is een Unit8Array met een lengte van 64 en wordt benaderd in BR om de branch misprediction te activeren. victim is een Float64Array met lengte 64, die wordt benaderd om store-to-load forwarding te activeren. probe is een Uint8Array met lengte 512, en wordt benaderd in
\ TEST om het tag-controleresultaat te lekken. Een Number-type idx-waarde wordt gebruikt bij out-of-bounds toegang tot victim. idx-waarde wordt zo gekozen dat victim[idx] verwijst naar target_addr met een geraden tag Tg (d.w.z., (Tg«56)|target_addr). Om speculatief toegang te krijgen tot target_addr buiten de V8 sandbox, maakten we gebruik van de speculatieve V8 sandbox escape-techniek die we ontdekten tijdens ons onderzoek, die we in detail beschrijven in §A. Regel 8 van Figuur 8a is het BR-blok van de TIKTAG-v2 gadget, dat branch misprediction activeert met slow[0].
\ Regel 12-13 is het CHECK-blok, dat de store-to-load forwarding uitvoert met victim[idx], waarbij toegang wordt verkregen tot target_addr met een geraden tag Tg. Wanneer deze code JIT-gecompileerd wordt (Figuur 8b), wordt een grenscontrole uitgevoerd, waarbij idx wordt vergeleken met victim.length. Als idx een out-of-bounds index is, retourneert de code undefined, maar als het victim.length-veld lang duurt om te laden, voert de CPU speculatief de volgende store- en load-instructies uit.
\ Daarna implementeert regel 17 het TEST-blok, dat de probe benadert met de doorgestuurde waarde val als index. Opnieuw wordt een grenscontrole op val tegen de lengte van probe voorafgegaan, maar deze controle slaagt omdat PROBE_OFFSET kleiner is dan de lengte van de probe-array. Als gevolg hiervan wordt probe[PROBE_OFFSET] alleen in de cache opgeslagen wanneer de store-to-load forwarding slaagt, wat het geval is wanneer Tg overeenkomt met Tm.
\ ==6.1.3. Chrome MTE bypass-aanval.== Figuur 9a illustreert de algemene MTE bypass-aanval op de Chrome browser met willekeurige tag lekkage primitieve van TIKTAG gadgets. We nemen een bufferoverflow-kwetsbaarheid aan in het renderer-proces, waarbij het exploiteren van een temporele kwetsbaarheid (bijv. use-after-free) grotendeels hetzelfde is. De kwetsbaarheid laat een pointer (d.w.z. vuln_ptr) naar een kwetsbaar object (d.w.z. objvuln) overlopen, waarbij het aangrenzende object (d.w.z. objtarget) wordt gecorrumpeerd.
\ Met PartitionAlloc's MTE-handhaving hebben twee objecten verschillende tags met een waarschijnlijkheid van 14/15. Om het opwerpen van een uitzondering te voorkomen, moet de aanvaller ervoor zorgen dat de tags van objvuln en objtarget hetzelfde zijn. TIKTAG-v2 kan worden gebruikt om de tag van objvuln ( 1 ) en objtarget ( 2 ) te lekken. Als beide gelekte tags hetzelfde zijn, exploiteert de aanvaller de kwetsbaarheid, wat geen tag-controle-fout zou veroorzaken ( 3 ). Anders maakt de aanvaller objtarget vrij en wijst het opnieuw toe en gaat terug naar de eerste stap totdat de tags overeenkomen.
\ ==Cache Side-Channel Activeren.== Om succesvol een TIKTAG gadget te exploiteren, moet de aanvaller aan de volgende vereisten voldoen:
i) branch training,
ii) cache-controle, en
iii) cache-meting. Aan alle drie de vereisten kan worden voldaan in JavaScript.
Ten eerste kan de aanvaller de branch predictor trainen door de gadget uit te voeren met een niet-nul slow[0] en in-bounds idx, en de branch misprediction activeren in BR met een nulwaarde in slow[0] en out-of-bounds idx.
Ten tweede kan de aanvaller de cachelijnen van slow[0], victim.length en probe[PROBE_OFFSET] verwijderen met JavaScript cache eviction-technieken [8, 21, 70].
Ten derde kan de aanvaller de cachestatus van probe[PROBE_OFFSET] meten met een hoogresolutietimer gebaseerd op SharedArrayBuffer [16, 58].
\ ==Geheugencorruptiekwetsbaarheden Exploiteren.== Gegeven de gelekte MTE-tags, kan de aanvaller ruimtelijke en temporele geheugencorruptiekwetsbaarheden in de renderer exploiteren. De aanvalsstrategie is grotendeels hetzelfde als de traditionele geheugencorruptieaanvallen, maar moet ervoor zorgen dat de kwetsbaarheid geen tag-controle-fout veroorzaakt door gebruik te maken van de gelekte tags. We beschrijven de aanvalsstrategie verder in §C.
\ ==6.1.4. Mitigatie.== Om de TIKTAG gadget-gebaseerde MTE bypass-aanvallen in het browser renderer-proces te mitigeren, kunnen de volgende mitigaties worden toegepast:
i) Speculatieve uitvoering-bewuste sandbox: Om aanvallers te stoppen bij het lanceren van TIKTAG-gebaseerde aanvallen vanuit een gesandboxte omgeving zoals V8 sandbox, kan de sandbox worden versterkt door speculatieve geheugentoegang buiten het geheugengebied van de sandbox te voorkomen. Hoewel moderne webbrowsers een sandbox gebruiken om onbetrouwbare webinhoud te isoleren van de renderer, kijken ze vaak voorbij aan speculatieve paden.
\ Bijvoorbeeld, Chrome V8 sandbox [56] en Safari Webkit sandbox [1] bemiddelen niet volledig de speculatieve paden [27]. Gebaseerd op huidige pointer-compressietechnieken [64], kunnen speculatieve paden worden beperkt tot het sandbox-gebied door de hoge bits van de pointers te maskeren.
\ ii) Speculatiebarrière: Zoals gesuggereerd in §5, kan het plaatsen van een speculatiebarrière na BR voor potentiële TIKTAG gadgets speculatieve tag lekkage-aanvallen voorkomen. Deze mitigatie is echter mogelijk niet toepasbaar in de prestatie-kritische browseromgeving, omdat het aanzienlijke prestatie-overhead kan introduceren.
\ iii) Voorkoming van gadget-constructie: Zoals gesuggereerd in §5.2, kan de TIKTAG-v2 gadget worden gemitigeerd door instructies tussen store- en load-instructies in te voegen. Een TIKTAGv1 gadget, hoewel we er geen exploiteerbare hebben gevonden, kan worden gemitigeerd door instructies tussen een branch en geheugentoegang in te voegen, zoals beschreven in §5.1.
\ 6.2. De Linux-Kernel Aanvallen
De Linux-kernel op ARM wordt veel gebruikt voor mobiele apparaten, servers en IoT-apparaten, waardoor het een aantrekkelijk aanvalsdoel is. Het exploiteren van een geheugencorruptiekwetsbaarheid in de kernel kan de privileges van de gebruiker escaleren, en daarom is MTE een veelbelovend beschermingsmechanisme voor de Linux-kernel. TIKTAG-gebaseerde aanvallen tegen de Linux-kernel bieden unieke uitdagingen die verschillen van de browseraanval (§6.1).
\ Dit komt omdat de adresruimte van de aanvaller is geïsoleerd van de adresruimte van de kernel waar de gadget wordt uitgevoerd. In het volgende geven we eerst een overzicht van het bedreigingsmodel van de Linux-kernel (§6.2.1) en presenteren we een proof-of-concept TIKTAG gadget die we ontdekten in de Linux-kernel (§6.2.2). Ten slotte demonstreren we de effectiviteit van TIKTAG gadgets bij het exploiteren van Linux-kernelkwetsbaarheden (§6.2.3).
\ ==6.2.1. Bedreigingsmodel.== Het bedreigingsmodel hier is grotendeels hetzelfde als dat van typische privilege-escalatieaanvallen tegen de kernel. Specifiek richten we ons op de ARM-gebaseerde Android Linux-kernel, verhard met standaard kernelbeschermingen (bijv. KASLR, SMEP, SMAP en CFI). We nemen verder aan dat de kernel is verhard met een MTE willekeurige tagging-oplossing, vergelijkbaar met de productie-klare MTE-oplossingen, Scudo [3].
\ Om specifiek te zijn, elk geheugenobject wordt willekeurig getagd, en een willekeurige tag wordt toegewezen wanneer een object wordt vrijgemaakt, waardoor zowel ruimtelijke als temporele geheugencorrupties worden voorkomen. De aanvaller is in staat om een onbevoegd proces uit te voeren en streeft ernaar zijn privilege te escaleren door geheugencorruptiekwetsbaarheden in de kernel te exploiteren. Er wordt aangenomen dat de aanvaller geheugencorruptiekwetsbaarheden in de kernel kent, maar geen enkele MTE-tag van het kernelgeheugen kent. Het activeren van geheugencorruptie tussen kernelobjecten met
\ niet-overeenkomende tags zou een tag-controle-fout veroorzaken, wat ongewenst is voor real-world exploits. Een kritieke uitdaging in deze aanval is dat de gadget moet worden geconstrueerd door bestaande kernelcode te hergebruiken en moet worden uitgevoerd door de systeemaanroepen die de aanvaller kan aanroepen. Omdat de ARMv8-architectuur gebruikers- en kernelpaginatabellen scheidt, kunnen gebruikersruimte-gadgets niet speculatief toegang krijgen tot het kernelgeheugen. Deze opstelling verschilt sterk van het bedreigingsmodel van het aanvallen van de browser (§6.1), dat de door de aanvaller geleverde code gebruikte om de gadget te construeren. We sloten de eBPF-gebaseerde gadget-constructie ook uit [17, 28], omdat eBPF niet beschikbaar is voor het onbevoegde Android-proces [33].
\ ==6.2.2. Kernel TikTag Gadget==. Zoals beschreven in §4.1, moeten TIKTAG gadgets aan verschillende vereisten voldoen, en elke vereiste brengt uitdagingen met zich mee in de kernelomgeving.
Ten eerste moet in BR een branch misprediction worden geactiveerd met cond_ptr, die controleerbaar moet zijn vanuit de gebruikersruimte. Aangezien recente AArch64-processors branch prediction-training scheiden tussen de gebruiker en kernel [33], moet de branch training worden uitgevoerd vanuit de kernelruimte.
Ten tweede moet in CHECK guess_ptr worden gederefereerd. guess_ptr moet worden gemanipuleerd vanuit de gebruikersruimte zodat het een geraden tag (Tg) insluit en verwijst naar het kerneladres (d.w.z. target_addr) om de tag (Tm) te lekken. In tegenstelling tot de browser JavaScript-omgeving (§6.1), worden door gebruikers geleverde gegevens zwaar gesaniteerd in systeemaanroepen, dus het is moeilijk om een willekeurige kernelpointer te creëren.
\ Bijvoorbeeld, access_ok() zorgt ervoor dat de door de gebruiker geleverde pointer verwijst naar de gebruikersruimte, en de array_index_nospec macro voorkomt speculatieve out-of-bounds toegang met de door de gebruiker geleverde index. Dus guess_ptr moet een bestaande kernelpointer zijn, specifiek de kwetsbare pointer die geheugencorruptie veroorzaakt. Bijvoorbeeld, een dangling pointer in use-after-free (UAF) of een out-of-bounds pointer in bufferoverflow kan worden gebruikt. Ten slotte moet in TEST test_ptr worden gederefereerd, en test_ptr moet toegankelijk zijn vanuit de gebruikersruimte. Om de cachestatus-meting te vergemakkelijken, moet test_ptr een gebruikersruimte-pointer zijn die wordt geleverd via een systeemaanroepargument.
\ ==Ontdekte Gadgets.== We analyseerden handmatig de broncode van de Linux-kernel om de TIKTAG gadget te vinden die voldoet aan de bovengenoemde vereisten. Als resultaat vonden we één potentieel exploiteerbare TIKTAG-v1 gadget in snd_timer_user_read() (Figuur 10). Deze gadget voldoet aan de vereisten van TIKTAG-v1 (§5.1). Op regel 10 (d.w.z. BR) activeert de switch-instructie branch misprediction met een door de gebruiker controleerbare waarde tu->tread (d.w.z. cond_ptr). Op regels 14-17 (d.w.z. CHECK) wordt tread (d.w.z. guess_ptr) gederefereerd door vier load-instructies. tread verwijst naar een struct snd_timer_tread64-object dat de aanvaller willekeurig kan toewijzen en vrijmaken.
\ Als een temporele kwetsbaarheid tread transformeert tot een dangling pointer, kan het worden gebruikt als een guess_ptr. Op regel 20 (d.w.z. TEST) wordt een gebruikersruimte-pointer buffer (d.w.z. test_ptr) gederefereerd in copy_to_user. Omdat deze gadget niet rechtstreeks bereikbaar is vanuit de gebruikersruimte, hebben we een kleine wijziging aangebracht in de kernelcode; we verwijderden de vroege return voor het standaardgeval op regel 6. Dit zorgt ervoor dat de buffer alleen wordt benaderd in het speculatieve pad om het cachestatus-verschil te observeren als gevolg van speculatieve uitvoering.
\ Hoewel deze wijziging niet realistisch is in een real-world scenario, demonstreert het de potentiële exploiteerbaarheid van de gadget als vergelijkbare codewijzigingen worden aangebracht. We ontdekten verschillende meer potentieel exploiteerbare gadgets, maar we konden het cachestatus-verschil tussen de tag-overeenkomst en niet-overeenkomst niet observeren. Toch denken we dat er een sterk potentieel is voor het exploiteren van die gadgets. Het lanceren van TIKTAG-gebaseerde aanvallen omvat complexe en gevoelige techniek, en daarom konden we niet experimenteren met alle mogelijke gevallen.
\ Vooral TIKTAG-v1 is afhankelijk van de speculatiekrimping bij verkeerde pad-gebeurtenissen, die ook adresvertaalfouten of andere uitzonderingen in het branch misprediction-pad kunnen omvatten. Omdat systeemaanroepen complexe controlestromen omvatten, wordt de speculatiekrimping mogelijk niet zoals verwacht geactiveerd. Bovendien kunnen verschillende gadgets exploiteerbaar worden wanneer kernelcode verandert. Bijvoorbeeld, een TIKTAG-v1 gadget in ip6mr_ioctl() vertoonde geen MTE tag lekkage-gedrag toen het werd aangeroepen vanuit zijn systeemaanroeppad (d.w.z. ioctl). De gadget had echter tag-lekkage toen het werd geporteerd naar andere syscalls (bijv. write) met een eenvoudige controlestroom.
\ ==6.2.3. Kernel MTE bypass-aanval.== Figuur 9b illustreert de MTE bypass-aanvallen op de Linux-kernel. Als voorbeeld van een use-after-free kwetsbaarheid nemen we aan dat de aanvaller een overeenkomstige TIKTAG gadget heeft geïdentificeerd, SysTikTagUAF(), die het tag-controleresultaat van de dangling pointer gecreëerd door de kwetsbaarheid kan lekken. Bijvoorbeeld, de TIKTAG-v1 gadget in snd_timer_user_read() (Figuur 10) kan het tag-controleresultaat van tread lekken, dat een dangling pointer kan worden door een use-after-free of double-free kwetsbaarheid.
\ De aanval verloopt als volgt: Eerst maakt de aanvaller een kernelobject vrij (d.w.z. objvuln) en laat de pointer (d.w.z. vuln_ptr) als een dangling pointer achter ( 1 ). Vervolgens wijst de aanvaller een ander kernelobject (d.w.z. objtarget) toe op het adres van objvuln met SysAllocTarget() ( 2 ). Vervolgens roept de aanvaller SysTikTag() aan met een gebruikersruimte-buffer (d.w.z. ubuf) ( 3 ), en lekt het tag-controleresultaat (d.w.z. Tm == Tg) door de toegangslatentie van ubuf te meten ( 4 ). Als de tags overeenkomen, activeert de aanvaller SysExploitUAF(), een systeemaanroep die de use-after-free kwetsbaarheid exploiteert ( 5 ). Anders wijst de aanvaller objtarget opnieuw toe totdat de tags overeenkomen.
\ ==Cache Side-Channel Activeren.== Zoals in §6.1.3, vereist een succesvolle TIKTAG gadget-exploitatie i) branch training, ii) cache-controle en iii) cache-meting. Voor branch training kan de aanvaller de branch predictor trainen en speculatie activeren met door de gebruiker gecontroleerde branch-condities vanuit de gebruikersruimte. Voor cache-controle kan de aanvaller de gebruikersruimte-buffer (d.w.z. ubuf) flushen, terwijl het kerneladres kan worden verwijderd door cache line bouncing [25]. Voor cache-meting kan de toegangslatentie van ubuf worden gemeten met de virtuele teller (d.w.z. CNTVCT_EL0) of een geheugenteller-gebaseerde timer (d.w.z. bijna CPU-cyclus resolutie).
\ ==Geheugencorruptiekwetsbaarheden Exploiteren.== TIKTAG gadgets maken het mogelijk om MTE te omzeilen en geheugencorruptiekwetsbaarheden in de kernel te exploiteren. De aanvaller kan de TIKTAG gadget in de kernel aanroepen om speculatief de geheugencorruptie te activeren en het tag-controleresultaat te verkrijgen. Vervolgens kan de aanvaller het tag-controleresultaat verkrijgen en de geheugencorruptie alleen activeren als de tags overeenkomen. We beschrijven het Linux-kernel MTE bypass-aanvalsproces in detail in §D.
\ ==6.2.4. Mitigatie.== Om TIKTAG gadget in de Linux-kernel te mitigeren, moeten de kernenontwikkelaars de volgende mitigaties overwegen:
i) Speculatiebarrière: Speculatiebarrières kunnen TIKTAG-v1 gadget in de Linux-kernel effectief mitigeren. Om aanvallers te voorkomen dat ze het tag-controleresultaat lekken via de gebruikersruimte-buffer, kunnen kernelfuncties die toegang hebben tot gebruikersruimte-adressen, zoals copy_to_user en copy_from_user, worden verhard met speculatiebarrières. Zoals beschreven in §5.1, kan het lekken van tag-controleresultaten met store-toegang worden gemitigeerd door een speculatiebarrière voor de store-toegang (d.w.z. TEST) te plaatsen.
\ Bijvoorbeeld, om de gadgets die gebruikmaken van copy_to_user te mitigeren, kan een speculatiebarrière worden ingevoegd vóór de copy_to_user-aanroep. Voor gadgets die gebruikmaken van load-toegang tot de gebruikersruimte-buffer, mitigeren de barrières de gadgets indien ingevoegd tussen de branch en de kernelgeheugentoegang (d.w.z. CHECK). Bijvoorbeeld, om de gadgets die gebruikmaken van copy_from_user te mitigeren, moeten de kernenontwikkelaars de kernelcodebasis zorgvuldig analyseren om het patroon van de voorwaardelijke branch, kernelgeheugentoegang en copy_from_user() te vinden, en een speculatiebarrière invoegen tussen de branch en de kernelgeheugentoegang.
\ ii) Voorkoming van gadget-constructie: Om potentiële TIKTAG gadgets in de Linux-kernel te elimineren, kan de kernelbroncode worden geanalyseerd en gepatcht. Omdat TIKTAG gadgets ook kunnen worden geconstrueerd door compileroptimalisaties, kan een binaire analyse worden uitgevoerd. Voor elke ontdekte gadget kunnen instructies worden herschikt of kunnen extra instructies worden ingevoegd om de gadget-constructie te voorkomen, volgens de mitigatiestrategieën in §5.1 en §5.2.
:::info Auteurs:
:::
:::info Dit paper is beschikbaar op arxiv onder CC 4.0-licentie.
:::
\


