Der letzte 0day-Jailbreak: Tachy0n
(blog.siguza.net)- tachy0n war ein Kernel-Privilege-Escalation-Exploit, der unter iOS 13.0 bis 13.5 funktionierte. Er wurde am 23. Mai 2020 als 0day in unc0ver v5.0.0 aufgenommen und zielte damit direkt auf die damals aktuelle iOS-Version ab.
- Kern war die Lightspeed-Race-Condition in
lio_listio, durch die einkalloc.16-Objekt zweimal freigegeben werden konnte, sodass zwei unterschiedliche Objekte auf denselben Speicher zeigten. - Ein Bug derselben Familie wurde zuvor bereits im Spice-Jailbreak/Untether für iOS 11 verwendet, doch App-Sandbox und
racoon-Umgebung unterschieden sich stark bei Berechtigungen, Sandbox und Spray-Techniken. - Der Exploit für unc0ver beschaffte wiederholt überlappende
OSData-Objekte und nutzteIOBufferMemoryDescriptorsowieIOAcceleratorFamily2, um einen fake task und einen fake mach port aufzubauen. - Seit iOS 14 ist Apple dazu übergegangen, durch getrennte Allocator, Sequestering, PAC und objektbezogene Härtungen die Exploit-Strategien selbst zu blockieren. Öffentliches Wissen über iOS-Kernel-Exploits liegt heute deutlich hinter dem Stand der iOS-13-Zeit zurück.
Warum die Veröffentlichung von tachy0n ungewöhnlich war
- tachy0n ist ein älterer Exploit, der iOS 13.0 bis 13.5 betraf und am 23. Mai 2020 mit unc0ver v5.0.0 öffentlich wurde.
- Nach damaligem Maßstab war es eine typische lokale Kernel-Rechteausweitung (kernel LPE), ungewöhnlich war aber, dass sie als 0day-Jailbreak veröffentlicht wurde, der die aktuelle iOS-Version betraf.
- Apple veröffentlichte etwa eine Woche nach der Exploit-Veröffentlichung einen Patch, der nur diesen Bug adressierte.
- In iOS 13.5 war der Bug ein 0day, zuvor war er jedoch bereits in Form eines 1day ausgenutzt worden.
- Pwn20wnd suchte nach einem aus der App-Sandbox erreichbaren 0day; Ausgangspunkt waren Regressionstests für bekannte 1days.
- SockPuppet aus iOS 12 wurde in iOS 12.3 gepatcht, tauchte aber in iOS 12.4 wieder auf.
- Dieser Fall zeigte, dass Apple für diese Art von Bugs keine Regressionstests hatte, und Pwn20wnd implementierte Regressionstests für mehrere bekannte 1days und erzielte dabei einen Treffer.
Lightspeed: die Race-Condition in lio_listio
- Der Kernbug von tachy0n ist Synacktivs Lightspeed-Bug und steht mit CVE-2020-9859 sowie möglicherweise CVE-2018-4344 in Verbindung.
- Die Schwachstelle liegt im Syscall
lio_listio, der asynchrones oder gebündeltes Datei-I/O ausführt. - Der Kernel allokiert eine
aio_lio_context-Struktur, um die eingereichten I/O-Aufgaben zu verfolgen.- Die Struktur enthält die Felder
io_waiter,io_issuedundio_completed.
- Die Struktur enthält die Felder
- Die eigentliche Arbeit läuft in separaten Threads, und sobald alle I/O-Vorgänge abgeschlossen sind, gibt
do_aio_completiondiesen Kontext frei. - Wenn keine Aufgabe geplant wurde, muss der aktuelle Thread von
lio_listioden Kontext freigeben. - Das Problem ist, dass diese Prüfung eine Race-Condition enthält.
- Eine Aufgabe kann an einen anderen Thread übergeben worden sein, aber bereits vor dem Prüfzeitpunkt abgeschlossen sein, sodass der Kontext freigegeben wurde.
- In diesem Fall prüft
lio_listioden inzwischen zum Dangling Pointer gewordenenlio_contexterneut.
Wie der Double Free zum Exploit führt
- Die für den Exploit nötige Abfolge sieht so aus:
lio_listioallokiert einenlio_context.- Die Aufgabe wird abgeschlossen und
do_aio_completiongibt denlio_contextfrei. - Der freigegebene Speicher wird als vom Angreifer kontrolliertes Objekt neu allokiert und so gestaltet, dass es wie
lio_context->io_issued == 0aussieht. lio_listiosieht das und gibt das Angreiferobjekt erneut frei.- Derselbe Speicher wird als weiteres Objekt neu allokiert, sodass zwei verschiedene Allokationen auf denselben Speicher zeigen.
- Auf 64-Bit-Geräten landet
lio_contextin der kleinsten Zone,kalloc.16. - Vor iOS 14 teilten sich Objekte unabhängig von ihrem Typ dieselbe Allocation Site nach Größenklassen.
- C++-Objekte, Pointer-Arrays und vom Nutzer bereitgestellte Datenpuffer konnten innerhalb desselben Größen-Buckets gegenseitig ihren Speicher wiederverwenden.
- Dieser Double Free verhält sich anders als ein gewöhnlicher Double Free, der ohne Zwischenallokation schnell in einen fatalen Zustand führt.
lio_context->io_issuedist während der Allokation nie 0.- Nach der Freigabe überschreibt der Allocator die ersten 8 Bytes mit einem Canary-Wert und einem Freelist-Pointer oder mit einem XOR-Wert der Objektadresse.
- Deshalb tritt die zweite Freigabe nur dann auf, wenn es dazwischen eine Neuallokation gibt und die Bytes 4 bis 7 0 sind.
- Der tatsächliche Exploit konnte dieses Race mehrfach wiederholen; dass andere Systemobjekte zufällig die nötigen Bytes auf 0 setzen und so den Double Free auslösen, war in der Praxis selten.
Frühere Nutzung in Spice
- Derselbe Bug wurde auch im Spice-Jailbreak/Untether für iOS 11.x verwendet.
- Spice wurde von Jake Blairs Team zusammen mit Sparkey und littlelailo entwickelt; die damals aktuelle Version war iOS 13.x.
- Ziel war es, sowohl in der App-Umgebung als auch in der
racoon-Umgebung mach port forgery zu erzeugen.- Bei Kernel-Exploits vor iOS 14 wurde die weitere Ausnutzung entscheidend einfacher, sobald man den Kernel dazu bringen konnte, einen vom Nutzer bereitgestellten Wert als mach-port-Pointer zu interpretieren.
- Der grundlegende Ablauf, um mit Lightspeed mach port forgery zu erzeugen, war:
- die erste Freigabe von
lio_contextauslösen; - eine mach message mit einem OOL mach ports descriptor der Größe 1 oder 2 sprayen;
- den ersten Eintrag auf
MACH_PORT_NULLsetzen, damit er inkalloc.16landet undio_issuedwie 0 aussieht; - durch die zweite Freigabe das OOL-mach-ports-Array freigeben;
- kontrollierte Daten in
kalloc.16sprayen und so das mach-ports-Array durch einen fake pointer ersetzen.
- die erste Freigabe von
Unterschiedliche Einschränkungen von App-Sandbox und racoon
- Auf A7 bis A9(X) gab es kein PAN, sodass sich Userland-Adressen allein mit
mmapundmlockwie Kernel-Pointer dereferenzieren ließen. - A10 und A11 sollten ebenfalls unterstützt werden, aber in der App-Sandbox fanden sich weder ein passender Leak für Kernel-Adressen noch ein Ziel, um kontrollierte Daten zu platzieren; daher wurde dies nicht fertiggestellt.
- Zu den 1days, die genutzt werden sollten, gehörten Ian Beers Kernel-Stack-Informationsleck und ein Sandbox-Escape über backboardd.
- Der Plan war, Shared-Memory-Pointer zu leaken oder Daten im Kernel-
__DATA-Segment zu platzieren. - Da kein geeignetes Target gefunden wurde, kam A10/A11-Support über den App-Pfad nicht zustande.
- Der Plan war, Shared-Memory-Pointer zu leaken oder Daten im Kernel-
- Der
racoon-Pfad hatte andere Bedingungen.- Er läuft als root, hat aber eine strengere Sandbox als normale Apps.
- Es gab keinen Zugriff auf IOSurface, daher war der übliche
OSUnserializeXML-Spray überIOSurface::setValuenicht nutzbar. - Stattdessen ließ sich der
OSUnserializeXML-Aufruf inRootDomainUserClient::secureSleepSystemOptionsverwenden, um einige Objekte in Leak-Form zu sprayen.
racoonhatte ein Sandbox-Profil, das alle sysctl-Lese- und Schreibzugriffe erlaubte, und lief außerdem mit root-Rechten.- Wenn der Kernel-Slide bekannt war, ließ sich ein sysctl-Global im Kernel-
__DATAals Datenspeicher an einer bekannten Adresse verwenden. - In Spice wurde
vm.swapfileprefixgewählt.
- Wenn der Kernel-Slide bekannt war, ließ sich ein sysctl-Global im Kernel-
- Zur Ermittlung des Kernel-Slides wurde panicalls CVE-2018-4413 verwendet.
- Ein Informationsleck in
sysctl_procargsxkonnte fast eine ganze Page uninitialisierten Kernel-Speichers auskernel_mapleaken. - Dadurch ließen sich Kernel-Code- und Heap-Pointer erhalten und A7 bis A11 abdecken.
- In der App-Sandbox war
sysctl_procargsxblockiert, sodass derselbe Ansatz nicht möglich war.
- Ein Informationsleck in
Aufbau des tachy0n-Exploits für unc0ver
- Ziel von unc0ver waren A8 bis A13, weshalb man A10+ nicht ignorieren und sich nicht auf Userland-Dereferenzierung verlassen konnte.
- Der Exploit wurde wegen der potenziell fehlschlagenden Memory-Corruption-Schritte als zweischichtige Struktur entworfen.
- Die untere Schicht startet freerer-Threads, die
lio_listioaufrufen, und racer-Threads, die über IOSurfaceOSDatadeserialisieren. - Standardmäßig gibt es 4 freerer und 16 racer, konfigurierbar.
- Die untere Schicht startet freerer-Threads, die
- Die über IOSurface deserialisierten Daten waren ein
OSDictionarymit mehrerenOSData-Einträgen.- Die Position, die
io_issuedentspricht, musste 0 sein. - Magic Values wie
0x41414141und0x69696969sowie der Schlüsselwertkwurden zur Erkennung von Overlaps verwendet.
- Die Position, die
- Nach dem Race werden alle
OSData-Werte geprüft.- Objekte, deren Magic Value verändert wurde, gelten als von einem anderen Systemobjekt übernommen und werden später zur Bereinigung markiert.
- Wenn der Schlüssel und der
k-Wert im Buffer voneinander abweichen, wird angenommen, dass ein Overlap vorliegt, bei dem ein anderesOSData-Objekt auf denselben Backing Buffer zeigt.
- Die Funktionen
maybe_reyoinkundoverlapim Code bauen diese Overlap-Informationen auf und geben sie an die obere Schicht weiter. - Die obere Schicht verwendet die überlappenden
OSData-Objekte, um einen fake mach port zu konstruieren.- Ein
OSDatawird freigegeben. - Eine mach message mit OOL-port descriptor wird gesprayt.
- Ein anderes
OSDatawird freigegeben. - Es wird als neues
OSDatamit einem Pointer auf einen fake task port neu allokiert.
- Ein
Kontrollierte Daten an einer bekannten Kernel-Adresse platzieren
- Der Exploit konnte Inhalte, die als OOL-ports-descriptor-Array neu allokiert wurden, als
OSDatalesen und so rohe Kernel-Pointer von mach ports leaken. - In späteren Schritten wurde das genutzt, um die Adressen eines task port und des
IOSurfaceRoot-Service-Ports zu leaken; das Kernproblem war aber, die Kernel-Adresse eines kontrollierbaren Buffers zuverlässig zu erhalten. - Ein in den XNU-Quellen gefundener Kandidat war
IOMemoryDescriptor.- Das Feld
_rangesist ein Array vonIOVirtualRange; ein einzelnerIOVirtualRangepasst exakt inkalloc.16. - Ein gewöhnlicher
IOMemoryDescriptorverwendet bei nur einer Range allerdings_singleRangestatt einer Heap-Allokation.
- Das Feld
IOBufferMemoryDescriptorist eine Ausnahme und ruft für eine einzelne RangeIONew(IOAddressRange, 1)auf, wodurch eine Heap-Allokation erfolgt.- Eine praktische Stelle, um dies beliebig zu allokieren und in den Nutzeradressraum zu mappen, war das AGX-Interface von
IOAcceleratorFamily2.- Öffnet man in
IOGraphicsAccelerator2einen Userclient vom Typ 0, erhält manIOAccelContext2. - Über
::clientMemoryForType()lassen sich drei memory descriptor mappen. - Typ 0 ist 0x8000 Bytes groß und wurde zur Identifikation des victim descriptor verwendet.
- Öffnet man in
- Der Exploit nutzt folgende Schleife:
IOAccelContext2öffnen und zwei überlappendeOSDataerhalten;- ein
OSDatafreigeben; - den zuvor geöffneten
IOAccelSharedUserClient2perIOConnectAddClient()verbinden; - das verbleibende
OSDatalesen und prüfen, ob die ersten 8 Bytes ein page-aligned Kernel-Pointer sind und die nächsten 8 Bytes0x8000betragen; - falls die Bedingungen nicht passen,
IOAccelContext2schließen und wiederholen.
Pageable Memory, fake port, zone_require
- Nachdem der memory descriptor in den Prozess gemappt und die Kernel-Adresse ermittelt war, blieb das Problem, dass der Speicher als
kIOMemoryPageableerzeugt wurde. - Da auf fake mach port und fake task object in Situationen zugegriffen werden kann, in denen Preemption deaktiviert ist, musste der Kernel die betreffende Page faulten.
- Das wurde gelöst, indem external method 2 von
IOAccelContext2::submit_data_buffers, die indirektIOAccelContext2::processSidebandBufferaufruft, zweimal aufgerufen wurde.- Sie liest eine Struktur 0x10 Bytes nach Beginn des Shared Memory.
- Die erste Struktur hat
tok == 0x100und ist so aufgebaut, dass sie die gesamte Page abdeckt und zur zweiten Page weitergeht. - Auf der zweiten Page können anschließend die Daten für fake objects liegen.
- Die nächsten Schritte führen zu fake task, fake port, einem OOL-descriptor switcheroo und dem Aufbau eines Primitives für beliebiges Lesen.
- Auch ein Bypass von
zone_requirewar nötig.- Damals erlaubte
zone_requirePages außerhalb vonzone_mapund interpretierte die ersten0x20Bytes einer Page als Metadaten. - Mit dem richtigen Zone-Index konnte man dies wie eine Zugangsberechtigung für die gewünschte Zone verwenden.
- Deshalb waren zwei Pages nötig: eine für task und eine für mach port.
- Damals erlaubte
- Dieser Exploit ist inzwischen auf GitHub veröffentlicht.
Analyse und Patch nach der Veröffentlichung
- Die Veröffentlichung eines vollständigen 0day-Exploits gegen die aktuell signierte Version zog die Aufmerksamkeit der iOS-Jailbreak-Szene auf sich.
- Brandon Azad, damals bei Project Zero, identifizierte die Schwachstelle innerhalb von 4 Stunden nach der Exploit-Veröffentlichung und informierte Apple.
- Diese Analyse ist in How to unc0ver a 0-day in 4 hours or less zusammengefasst.
- 6 Tage nach der Exploit-Veröffentlichung behandelte Synacktiv in einem neuen Artikel, dass der ursprüngliche Fix in iOS 12 ein Memory Leak erzeugt hatte und dass der Versuch, dieses Memory Leak zu beheben, wahrscheinlich den ursprünglichen Bug wiederbelebte.
- 9 Tage nach der Exploit-Veröffentlichung stellte Apple einen Patch bereit.
- Später wurde XNU ein Regressionstest für diesen Bug hinzugefügt.
- 54 Tage nach der Veröffentlichung wurde eine reverse-engineered Version namens „tardy0n“ in den Odyssey-Jailbreak aufgenommen, ebenfalls für iOS 13.0 bis 13.5.
Die veränderte Exploit-Landschaft seit iOS 14
- iOS 14 zeigt den Strategiewechsel bei Apples Kernel-Sicherheit.
- Vor iOS 14 war das nächste Ziel nach einem ersten Primitive meist ein mach port, egal ob die Ausgangslage Heap Overflow, C++-Objekt-Over-Release, Type Confusion oder etwas anderes war.
- Eine der größten Änderungen in iOS 14 betraf die Allocator
kallocundzalloc.- Die zone map wurde in mehrere „kheap“-Bereiche aufgeteilt.
- Von Nutzern kontrollierte Daten und Kernel-Objekte wurden getrennt in unterschiedliche Heaps gelegt.
- Auf Kernel-Objekte wurde Sequestering angewendet, sodass Virtual-Address-Pages, die einer bestimmten Zone zugewiesen sind, bis zum Neustart nicht für eine andere Zone wiederverwendet werden.
- Physischer Speicher kann freigegeben werden, aber der virtuelle Speicherbereich wird nicht für andere Objekte wiederverwendet, was Kernel-Objekt-Type-Confusion praktisch verhindert.
- Guard Pages, pro Boot variierende Startpositionen der Zone-Allokation und spätere Verfeinerungen senkten die Zuverlässigkeit von Cross-Zone-Angriffen deutlich.
- Apple wechselte von der bloßen Blockade einzelner Bugs zu einem Ansatz, der Exploit-Strategien blockiert.
- Wenn ein Exploit eine kmsg struct als Corruption Target verwendet, wird diese Struktur signiert.
- Wenn ein pipe buffer als stabile Kernel-Lese-/Schreibschnittstelle genutzt wird, werden die zugehörigen Pointer unter PAC gestellt.
- Wenn eine Technik auftaucht, die ein eigentlich unbeteiligtes Objekt als victim nutzt, wird dieser Objekttyp gehärtet.
- In der Folge wurde bei der Exploit-Entwicklung die Exploit-Strategie wertvoller als der initiale Memory-Corruption-0day.
Bruch im öffentlichen Wissen
- Für die Zeit vor iOS 14 wird eingeschätzt, dass öffentliches iOS-Sicherheitsforschungswissen nahezu auf dem Niveau nicht öffentlichen Wissens lag.
- Seit iOS 14 ist der Informationsaustausch, von Ausnahmen abgesehen, praktisch zum Erliegen gekommen.
- Selbst wenige Wochen vor der iOS-19-Beta gibt es demnach keinen öffentlichen Kernel-Exploit für iOS 18 oder iOS 17.
- In Apples Security Notes tauchen gelegentlich in freier Wildbahn ausgenutzte Schwachstellen auf, doch die öffentlichen Informationen halten mit der nicht öffentlichen Forschung nicht Schritt.
- Dass die Veröffentlichung von tachy0n erst 5 Jahre zurückliegt, zeigt, wie schnell sich das Feld der iOS-Kernel-Exploits verändert hat.
2 Kommentare
Apples Hardware ist zwar hervorragend, aber die Software ist voller Absichten, die Nutzer an die Leine zu legen.
Selbst wenn man eine selbst erstellte und gebaute App nur auf dem eigenen Gerät ausführen will, braucht man ein 100-Dollar-Abo.
Wenn man als Entwickler kleinere bis mittelgroße Open-Source-Apps nutzt, sie selbst baut und verwendet,
ist es bequemer, einfach Android zu nutzen, als auf Apple-Geräten Schwachstellen auszunutzen, sie zu jailbreaken und per Sideloading Apps zu installieren.
Meinungen auf Hacker News
Beeindruckend ist, dass die Methode, mit der ein Billion-Dollar-Unternehmen geschlagen wurde, eine einfache, langweilige Aufgabe war, bei der Apple besonders schwach ist: Regressionstests.
SockPuppet, eine der großen Schwachstellen, die für den Jailbreak in iOS 12 genutzt wurden, wurde von Ned Williamson von Project Zero gefunden und an Apple gemeldet, in iOS 12.3 gepatcht und später im Bugtracker von Project Zero veröffentlicht.
Doch in iOS 12.4 tauchte sie wieder auf, als wäre sie nie gepatcht worden; vermutlich hatte Apple XNU für diese Version in einen eigenen Branch geforkt und den Patch dabei nicht übernommen.
Das war ein starkes Signal dafür, dass es für diese Art von Schwachstelle keine Regressionstests gab, und schon die Automatisierung einiger bekannter 1-days hätte Pwn sofort treffen können.
Ich frage mich, wie viele Stellen CI-Farmen betreiben, die alte Schwachstellen kontinuierlich gegen neue Versionen von Projekten wie Linux, FreeBSD, OpenWRT oder OpenSSH laufen lassen.
Vor 20 Jahren habe ich während des Studiums ehrenamtlich QA bei Mozilla gemacht; dort gab es eine ständig wachsende Sammlung von Regressionstests, vor allem für Rendering-/Layout- und JavaScript-Engine-Bugs.
Da man zur Reproduktion und zur Verifikation des Fixes minimale Testfälle erstellte, war es auch einfach, diese in die Build-Pipeline aufzunehmen.
Bugs sind unvermeidlich, aber dass ein Bug, in dessen Behebung Zeit und Geld geflossen sind, wiederaufersteht, ist das Worst-Case-Szenario.
Organisationen, denen Qualität wichtig ist, investieren sicher in Regressionstests, aber viele Organisationen respektieren QA nicht und machen sie entweder gar nicht oder geben sie an den billigsten Outsourcer.
Dass Apple für Jailbreaks, historisch eine der sichtbarsten Bug-Kategorien überhaupt, keine Regressionstests hatte, ist wirklich seltsam.
Mozilla kann heutzutage für vieles kritisiert werden, aber schon Anfang der 2000er hatte man mit Tools wie Tinderbox und Bugzilla recht solide QA und CI/CD.
Als DevOps populär wurde und diese Vorgehensweisen verbreitete, dachte ich, das hätten ohnehin schon alle gemacht – aber das war mein Irrtum.
Das ist eine Art Conway’s Law, entstanden durch die Trennung von Security und Feature-Entwicklung.
Selbst wenn es Build-/Release-Prozesse und eine ausgereifte Sammlung von Regressionstests gibt, ist es aufgrund der internen Organisationsstruktur gut möglich, dass solche Security-Issues dort nicht hineinfallen.
Es waren locker Tausende, und ich glaube, es war SQLite.
Das ist ein nachahmenswerter Ansatz.
Wenn man Fixes nicht backportet, ist es wohl auch wahrscheinlich, dass man die Tests nicht backportet.
Bei Begriffen wie kheap separation, task port mitigation, SSV und SPTM fühlte es sich an, als würde man sich in einer Fremdsprache gut mit einem Freund unterhalten und dann plötzlich in eine Erklärung von Gehirnchirurgie oder Kernphysik abrutschen, woraufhin das Verständnis eine Klippe hinunterfällt.
Ähnlich war es, als ich einmal ein Gespräch über die Modernisierung eines Hochofens dolmetschen wollte.
Schade, dass Jailbreaking nicht mehr so lebhaft ist wie früher.
Ich habe mit einem jailbroken iPad kaum etwas Praktisches gemacht, aber es hat Spaß gemacht; heute würde ich gern eine Tethering-App, UTM und eine JIT-Lösung installieren.
SideStore sah ebenfalls vielversprechend aus, aber mein Account war einmal ein kostenpflichtiger Apple-Developer-Account, deshalb habe ich noch 10 nicht ablaufende App-IDs übrig und kann daher keine Apps wie UTM installieren, ohne einen neuen Account anzulegen oder wieder zu bezahlen.
Nachdem ich das verloren hatte, bin ich zu Android zurückgekehrt; zu diesem Zeitpunkt hatte Android bei den Basisfunktionen schon ziemlich aufgeholt.
Ich habe gehört, dass Apple heutzutage 1 Million Dollar für einen Jailbreak zahlt, und das dürfte die Untergrenze des freien Marktpreises sein.
Ich weiß nicht, ob man über einen Vermittler gehen muss oder ob es eine öffentliche E-Mail-Adresse gibt, bei der man nicht im First-Level-Support versandet.
Wenn das stimmt, hat Apple eine erstaunliche Strategie verfolgt.
Wenn man alle Wege sperrt, Root auf dem Gerät zu erlangen, kann Apple die Schwachstellen patchen, die Jailbreak-Entwickler kostenlos finden.
Dem Artikel zufolge verfügen private Communities weiterhin über Exploits, und Apple patcht diese.
Nur bei der öffentlichen Community oder diesem Entwickler scheint das aus irgendeinem Grund nicht mehr der Fall zu sein.
Der beste Satz im ganzen Text war: „Ich möchte auch der Person danken, die diesen Bug in iOS 13.0 wieder unpatched gemacht hat. Das war ebenfalls eine sehr coole Aktion.“
„Ich kann mir nicht vorstellen, wo wir in fünf Jahren sein werden“ – ich schon.
iMessage wird weiterhin die Übernahme von Geräten, Accounts und Daten ermöglichen.
Im Text stand nicht, ob es tethered oder untethered ist.
Der Jailbreak unc0ver, in dem das enthalten war und der ausgeliefert wurde, war meines Wissens wohl „semi-untethered“.