Apple past ISA-pointers in iOS aan om zero-click-exploits moeilijker te maken

Apple gaat het moeilijker maken voor aanvallers om iPhones zonder tussenkomst van gebruikers aan te vallen. Het bedrijf gaat voortaan ISA-pointers in het OS authenticeren zodat geheugencorruptiebugs en sandbox-escapes minder snel voorkomen.

De verandering zit in de bètaversie van iOS 14.5, de aankomende versie van het besturingssysteem. Dat zeggen verschillende beveiligingsonderzoekers tegen Motherboard nadat ze met de bèta aan de slag waren gegaan. In iOS 14.5 voegt Apple Pointer Authentication Codes of PACs toe aan ISA-pointers. Met een ISA-pointer kan een programma bepalen welke code het moet aanspreken. Tot voorheen werden die pointers niet geauthenticeerd met PACs. Dat maakte het mogelijk om apps via ISA-pointers naar andere code te laten verwijzen.

Het uitbuiten van ISA-pointers in iOS werd voornamelijk gebruikt om apps uit de sandbox te laten ontsnappen. Het kon echter ook worden toegepast om een zeroclick-exploit uit te voeren, een exploit waarbij een gebruiker zelf nergens op hoeft te klikken of te installeren. Zulke exploits zijn zeldzaam en worden voor veel geld verkocht. Zeroclick-aanvallen leveren in Apples eigen bugbountyprogramma tussen de 250.000 en een miljoen dollar op.

De beveiligingsonderzoekers waar Motherboard mee sprak zeggen dat de nieuwe methode het veel moeilijker maakt dergelijke exploits uit te voeren. Volgens Apple is het bij zeroclick-exploits meestal nodig verschillende kwetsbaarheden aan elkaar te kunnen koppelen, en dat het risico daarom nooit volledig verdwijnt.

Door Tijs Hofmans

Nieuwscoördinator

23-02-2021 • 09:35

15

Submitter: Norac

Reacties (15)

15
15
9
5
0
3
Wijzig sortering
Geen idee dat dit bestond in ARMv8, en niet alleen in A-series processors van Apple en iOS. Zie ook https://www.qualcomm.com/...entication-on-armv8-3.pdf
Altijd leuk om te zien dat er bij echte Tweaker artikelen maar weinig reacties zijn. Maar owee als Apple geen lader meelevert. Dan staan er 600+ reacties :-)

Meer van dit soort artikelen, en minder clickbait zou fijn zijn.


Edit: fixed typo.

[Reactie gewijzigd door Anoniem: 9278 op 23 juli 2024 18:18]

Leuk dat er mensen zijn die het bevalt, maar hier snap ik toch wel weinig van, dus inhoudelijk kan ik inderdaad niet echt een reactie plaatsen :) Het is een heel specialistisch onderwerp, daar zullen dus ook specialisten (inhoudelijk) op kunnen reageren :)

Wat ik er van snap is dat er nu iets veiliger is, omdat je kunt verifieren waar een klik vandaan komt ofzo? Ik mis in dit artikel de snelle "PAC/ISA 101 cursus".

EDIT: Dit bedoel ik dus: Na de reactie van johnbetonschaar snapte ik pas dat t niet gaat om pointer=muis, maar pointer=pointer to an object, als een data object.

[Reactie gewijzigd door Martijn.C.V op 23 juli 2024 18:18]

Ik mis toch een stukje informatie.

Wat is een ISA-pointer?

@Grim Dank, ik had over dat zinnetje heen gelezen. Dan nog vind ik het weinig informatief.
@Plainside Dat geeft al een stuk meer info.
@johnbetonschaar Dank!

[Reactie gewijzigd door Keypunchie op 23 juli 2024 18:18]

Het is een pointer naar het 'class object' voor een instantiatie van een object in het geheugen.

Dat klinkt een beetje vaag misschien, maar het idee is dat als ik een instantiatie van een object van het type 'Paard' maak, dan bevat dat object naast de eigenschappen van dat specifieke paard (zijn kleur, naam, hoevaak hij in de wei schijt) ook een pointer naar een beschrijving van wat een Paard is in zijn algemeen, dus welke eigenschappen een paard heeft en welke operaties je op een Paard kunt uitvoeren. Die pointer is de ISA ('is a') pointer.

Objective-C heeft volledige runtime dynamic binding voor method calls, wat zoveel betekent als dat niet op voorhand in de binary is gehardcode wat er gebeurt als je een method van een instance van een object aanroept, in plaats daarvan wordt een method call uitgevoerd door middel van 'message passing' waarbij de runtime pas bij 'ontvangst' van de message opzoekt welk stuk code erbij hoort. Middels de ISA pointer. Dit betekent dus ook dat je het gedrag van de code kunt aanpassen door met de ISA pointer te klooien ('swizzling'), en dat kan dus blijkbaar (wist ik niet) ook op een onveilige manier in iOS op dit moment (de ISA pointer naar een class object laten wijzen met onveilige pointers voor bepaalde methods, waarschijnlijk).

Hoe het precies zit met Swift weet ik niet, dat werkt anders dan Objective-C en voor zover ik weet zijn method calls daar niet via message-passing geimplementeerd, maar je kunt wel Objective-C aanroepen vanuit Swift, dus wellicht dat daar een mogelijkheid zit om dit soort exploits ook te kunnen gebruiken,
Hoe het precies zit met Swift weet ik niet, dat werkt anders dan Objective-C en voor zover ik weet zijn method calls daar niet via message-passing geimplementeerd
Hier vind je een goed artikel dat diep ingaat op hoe dit werkt in Swift.

[Reactie gewijzigd door Aaargh! op 23 juli 2024 18:18]

Ongeveer wat een VMT pointer in C++ is?
Ja dat is wel redelijk vergelijkbaar, met dien verschil dat de C++ standaard in principe niks voorschrijft over hoe de compiler de VMT implementeert volgens mij, en bijvoorbeeld in bepaalde gevallen virtual method calls mag devirtualiseren of zelfs inlinen als kan worden afgeleid dat dat het gedrag van de code niet verandert, etc. De VMT is in C++ echt een implementatiedetail en C++ biedt geen enkele mogelijkheid om de VMT rechtstreeks op een ondersteunde manier te benaderen of wijzigen. In C++ heb je compile-time dynamic binding en geen runtime-dynamic binding: het gedrag van objecten lig volledig vast in de binary die ze implementeert, op het moment dat je een instance maakt, en daarna kan je in principe runtime het gedrag van een bestaande instance niet meer aanpassen.

Bij Objective-C is dat anders, daar is heel duidelijk gespecificeerd hoe je via de runtime een message naar een object stuurt, hoe de bijbehorende code wordt opgezocht, etc. Er zijn runtime functies die je code kan aanroepen om methods te vervangen, om op te vragen of instnances op bepaalde messages reageren, etc. Een hele berg aan Objective-C language features is bovenop deze runtime dynamic binding gebouwd zoals bijvoorbeeld 'categories' waarbij je een class waarvan je de broncode niet hebt (bijvoorbeeld een OS framework class) alsnog kan uitbreiden met je eigen methods zonder dat je inheritance nodig hebt (daarvoor zou je immers de header files van het object nodig hebben zodat de compiler weet hoe de base class is gedefinieerd). Op die manier kan je bijvoorbeeld in Objective-C een method toevoegen aan *alle* instances van zoiets als een NSString (een Objective-C foundation class), ongeacht wie of wat de string heeft geconstruct en waar je ze vandaan hebt gekregen. Dit werkt achter de schermen ook via de ISA pointer.

[Reactie gewijzigd door johnbetonschaar op 23 juli 2024 18:18]

Was ook mijn vraag, lang antwoord
Snelle scan (cherrypicked) van bron:
Every object has an instance variable called isa. When an object is created, the class sets the isa instance variable of the return object to point back at that class. It is called the isa pointer because an object “is a” instance of that class.
Yup. Het is dus ook niet een ISA-pointer, wat doet vermoeden dat het om een afkorting gaat, maar een 'isa' pointer: een pointer genaamd 'isa'.

https://developer.apple.c...objectivec/id/1418809-isa

[Reactie gewijzigd door R4gnax op 23 juli 2024 18:18]

Uit het originele artikel: " ISA pointers are a related feature of iOS’s code that tells a program what code to use when it runs"

Meer over ISA op wikipedia: https://nl.wikipedia.org/wiki/Instructieset
Waar je naar linkt gaat over een hele andere ISA, die hier niets mee te maken heeft.

[Reactie gewijzigd door Onno op 23 juli 2024 18:18]

Oh, dan was het nieuwsbericht ook mij niet duidelijk.
Staat in het artikel.
Met een ISA-pointer kan een programma bepalen welke code het moet aanspreken.
Wat ik denk te begrijpen is dat ISA pointers een constructie zijn van de Objective C compiler en runtime, i.e. de class laat een reference naar zichzelf achter in een object dat het aanmaakt bij instantiatie. Wat ik dan vervolgens denk te begrijpen is dat deze extra security dus alleen van toepassing is op de Objective C compiler en runtime. Betekent dat de native code pointers nog steeds onbeveiligd werken?

Op dit item kan niet meer gereageerd worden.