 Unser nächster Sprecher bezeichnet sich selbst als Reverse-Engineering-Fetishist mit einer Vorliebe für Spielekonsolen. An dieser Vorliebe lässt er uns in seinem Talk teilhaben. Bitte begrüßt mit mir Morpheus 1987 zu seinem Talk Exploiting Peace for Video-Apps. Hallo und danke fürs Kommen. Ja, Exploiting Peace for Video-Apps. Ich denke mal, der Titel sagt mehr oder weniger schon, worum es in diesem Talk gehen wird. Ich habe immer eine kleine Agenda vorbereitet, es wird halt ein kleines Intro geben. Dann werde ich halt zeigen, wie ich ganz am Anfang halt so ein bisschen Analyse bzw. Netzwerkanalyse betrieben habe, um halt mein Ziel Code Execution auf der PS4 zu erlangen. Dazu erstmal kurz was über mich. Ich bin Morpheus 1987. Wer halt in der Szene unterwegs ist, hat den Namen vielleicht schon als ein oder andere mal gehört. Privat bin ich Software-Entwickler aus dem ERP-Bereich und habe eine kleine Vorliebe für Reverse-Engineering und vor allem, wenn es halt um Spielekonsolen geht. Anfang 15 hatte meine Frau vor mir zum Geburtstag eine PS4 zu schenken. Da ich das Ding sowieso nicht wirklich zum Spielen haben wollte und der 176er Firmwarexploit schon öffentlich war, habe ich hier dann gesagt, pass auf, lasse es sein, du brauchst mir keine kaufen, ich hole mir selber eine und habe mich dann auf der Suche nach einem Modell mit Firmware176 gemacht und habe dann bei Amazon halt ein Ambieter gefunden, der angeblich noch ein gewisses Bandel hatte, das halt mit dieser Firmwareversion kommen sollte. Ich habe das dann bestellt, habe das Amazon-Paket voller Freude aufgemacht und habe dann quasi festgestellt, ich wurde über das Ohr gezogen, habe dann halt eine einzelne Konsole mit zwei einzelnen Spielen bekommen und als ich die Konsole dann halt aufgemacht habe, hatte die halt schon Firmware 315. Jetzt hätte ich das Teil halt wieder zurückschicken können, habe mir aber gedacht, ne, dann suche ich halt selber einen Weg irgendwie da reinzukommen. Das erste, was ich dann halt gemacht habe, ich bin halt hingegangen und habe versucht so viel wie möglich halt über die Konsole rauszufinden und das erste, was ich gemacht habe, ich habe halt Netzwerkpakete analysiert. Zu Hause hatte ich halt dieses Setup, ich habe eine IP Fire als Firewall, darüber geht halt der gesamte Netzwerk-Traffic bei mir zu Hause im Netz und darauf habe ich dann einfach mal TCP dann laufen lassen und habe dann einfach mal angefangen, sämtliche Video-Apps oder Applikationen, die es halt auf der PS4 gibt zu starten, um halt ein bisschen Netzwerk-Traffic zu generieren, um das ganze dann später in WireShark zu analysieren. Und dabei ist mir dann halt direkt aufgefallen, dass gewisse Video-Apps, beispielsweise IGN, Vivo, die benutzen noch eine ziemlich alte Version von Apple WebKit und was am allerbesten war, die benutzen halt keinen SSL. Der ganze Traffic, der war für mich halt also quasi im Klartext sichtbar. Und dann habe ich mir gedacht, Moment, wenn die halt diese alte WebKit-Version benutzen, dann müsste doch theoretisch dieser öffentliche WebKit-Exploit, den es halt für 4.1.7.6 gibt, dann müsste doch halt mit diesen Video-Apps noch funktionieren. Und dann habe ich quasi Folgendes getan. Ich bin einfach hingegangen, habe zu Hause in einem Webserver aufgesetzt, habe dort den WebKit-Exploit für die 1.7.6 laufen lassen und habe dann einfach die DNS-Abfragen dieser Video-Apps auf meinen eigenen Webserver umgeleitet. Und auf dem PS4-Out, also auf meinem TV zu Hause, wenn ich dann halt diese Video-Apps gestartet habe, habe ich dann quasi folgenden Output bekommen. Und dieser Output sagt uns eigentlich, dass dieser Exploit halt in diesem Video-Apps noch funktioniert. Was hier ran natürlich sofort auffällig war für mich war, egal wie oft ich die PS4 neu gestartet habe, egal wie oft ich die Anwendung neu gestartet habe, die Adressen waren halt immer unverändert. Was für mich so viel bedeutet, dass halt kein ASLR aktiv ist. Was mir das Leben dann halt im Nachhinein halt auch noch ziemlich einfach gemacht hat. Dieser 1.7.6.Exploit, der nutzt halt ein Back-in-the-arrays-Fort-Funktion aus und ist dann halt über diesen Back-in-the-Lage den Zeiger von einem Pointer umzuschreiben. Dadurch, dass wir in der Lage sind, die Speicheradresse umzuleiten, wo dieser Pointer hinzeigt, sind wir natürlich auch in der Lage, dann beliebige Speicheradressen zu lesen und zu schreiben. Und dieser Exploit gibt halt quasi eine Set-Base-Funktion, der stellt eine Set-Base-Funktion zur Verfügung. Diese Set-Base-Funktion kann halt verwendet werden, um die Speicheradresse, wo dieses Array hinzeigt, an beliebige Stellen zu platzieren. Und wenn man den Array dann halt einmal umplatziert hat, kann man dann halt einfach den ersten Wert in dem Array auslesen und kann dann somit diese Speicherstelle auslesen. Oder man kann halt, wie in der letzten Seile zu sehen, man kann halt einfach beliebige Speicheradressen beschreiben. Nun war es für mich halt interessant, so viel wie möglich aus der Konsole rauszuholen, bzw. so viel wie möglich rauszufinden. Und dann bin ich erstmal hingegangen und hab quasi sämtlichen Speicher, der so eine Video-Applikation zur Verfügung steht, auszulesen. Und jetzt kann ich halt quasi hingehen und mir den Output halt am Fernseher angucken und dann halt in einem Hex-Editor abschreiben, was halt nicht so wirklich effektiv ist. Oder ich hab mir dann halt gedacht, ja gut, dann schreibst du dir halt eine kleine Software am PC, die macht halt ein HTTP-Server auf und entfängt dann halt quasi die Daten von der PS4 per HTTP-Get. Und die PS4 versucht halt die IGN-Seite zu erreichen, wird halt auf dem Exploit umgeleitet und der Exploit liest dann halt Speicheradressen aus und macht dann halt einen Ajax-Call an den Dampfer. Und ja, der Code dazu sieht halt quasi so aus. Der ist nicht wirklich groß, ganz am Anfang setzen wir halt die Adresse, die wir auslesen wollen und ganz unten wird dann halt, also weiter unten wird dann halt einfach ein Ajax-Befilm abgesetzt, der dann halt das ganze Zeug per HTTP an den PC sendet. Dieses Auslesen, das funktioniert natürlich nur auf Speicherbereiche, auf die die App ohnehin Zugriff hat. Also man muss halt den Hiebde-App lesen, schreiben können und man hat natürlich Zugriff auf alle Systemmodule, die geladen werden, weil die muss die App ja auch irgendwie ausführen können. Wenn ich versucht habe, eine falsche Speicheradresse auszulesen, dann endete das manchmal in einem Crash von der App, aber manchmal ist die PS4 halt auch komplett abgestürzt und die musste dann halt rebooten und das hat dann immer zwei, drei Minuten gedauert. Kleine Chancs auslesen, hat für mich quasi so das beste Ergebnis geliefert. Ja, 4KB auf einmal war halt immer super. Man konnte halt aber auch variieren. Wenn ich jetzt halt so ein 10MB-Modul auslese, ist natürlich sehr mühselig, wenn ich halt bei jedem Versuch nur zwei Kilobytes auslesen kann. Da ist man halt ewig mit beschäftigt. Ja, die Hauptanwendung selber läuft wie auf einem ganz normalen FreeBSD unter 400.000 Hexadezimals, während der Hieb irgendwo bei 200 Millionen Hexadezimals war. Bei diesem Dumpingverfahren ist mir halt relativ schnell aufgefallen, dass die Module jeweils 16 Kilobytes voneinander entfernt liegen und in späteren Forschungen habe ich dann quasi rausgefunden, dass die 16 Kilobytes genau die Page Size vom Orbis OS ist, also vom Betriebssystem der PS4. Dieses Auslesen hat halt sehr, sehr, sehr lange Zeit den Anspruch genommen, weil manchmal konnte ich halt 2 Kilobytes am Stück auslesen, manchmal konnte ich halt ein ganzes MB am Stück auslesen, manchmal konnte ich aber auch nur 20 Byte auslesen, obwohl ich halt gültige Speicherbereiche auslesen wollte. Woran das liegt, habe ich nicht rausgefunden, das war halt auch immer wieder mehr oder weniger random, aber um halt quasi alle Module auszulesen, ich war damit ungefähr zwei Monate beschäftigt, so jeden Abend, zwei, drei Stunden. Das hat nicht wirklich viel Spaß gemacht, aber wenn man lange Weile hat, nimmt man das in Kauf. Nichtsdestotrotz habe ich irgendwann dann wirklich alle Speichermodule aus, also alle Speicherbereiche ausgelesen und hatte dann halt quasi eine nette Sammlung und das Gute dieser Geschichte ist, das sind alles Kotbereiche und dadurch, dass ich halt quasi eigene Kot ausführen möchte und auf der PS4 halt DEP, DEP-Aktivist, Data Execution Prevention, hat mir das natürlich sehr geholfen, weil dann konnte ich halt für meine Rob Chain Gadgets suchen. Aber wie geht es nun weiter? Ich habe jetzt quasi die Speicher ausgelesen und wir wollen ja eigentlich Kot ausführen, aber wie kann ich denn jetzt halt mit einem Exploit, den mir eigentlich nur erlaubt, Speicherbereiche zu lesen und zu schreiben, wie kann ich denn da jetzt halt den Programmfluss übernehmen? Und da ist die Antwort ganz klar mittels V-Tables. So, was ist eine V-Table? In jeder objektorientierten Programmiersprache, in der halt quasi Objektinstanzen zur Aufzeit angelegt werden, werden halt V-Tables verwendet. Wir haben zu einem, zu einem haben wir quasi für jedes Objekt, jedes Objekt hat ja Eigenschaften um Methoden und die Instanz des Objektes, die halt irgendwo auf dem Hieb oder irgendwo im Speicher liegt. Also die Eigenschaften vom Objekt selber, die liegen halt quasi auch mit auf dem Hieb, was durchaus Sinn macht. Aber die Kot-Teile der Methoden, das wäre halt relativ schwachsinnig für jede Methode, die halt in so einem Objekt benutzt wird, wenn ich drei Instanzen von einem und denselben Objekt habe, macht das natürlich relativ wenig Sinn. Diesen Kotbereich hat auch für jede Objektinstanz wieder mit in den Speicher zu packen. Und deswegen wird der Kot der Methoden halt im ReadExecute-Speicher-Bereich abgelegt und in den Objekten selber, die auf dem Hieb legen, die wir halt lesen, schreiben können, da gibt es einfach nur eine Referenz zu dieser Tabelle, wo halt quasi die verschiedenen Methoden im Speicher liegen. Aber mit dem Wissen, dass wir halt, dass die V-Table selber, mit dem Wissen, dass die V-Table selber in einem Speicherbereich liegt, den wir nur lesen und ausführen können, der Pointer zu dieser Tabelle, aber in einem Bereich liegt, den wir lesen und beschreiben können, mit diesem Wissen können wir natürlich hingehen und diese V-Table einfach austauschen. Mit einer V-Table, die halt, die halt Sachen enthält, die uns zu nutzen sind, die wir halt ausnutzen können. Und daraufhin habe ich dann quasi folgenden Plan geschmiedet. Das erste, was wir machen müssen, ist, wir sprayen halt erstmal ganz viele Objekte auf den Hieb, suchen dann halt eins dieser Objekte, finden die V-Table von dem Objekt, tauschen die aus und versuchen dann die Rob-Execution zu triggern. Objekte auf dem Hieb sprayen, dadurch, dass wir uns ja halt im Javasgrip bewegen, ist halt relativ einfach. Ich bin dann halt einfach hingegangen und habe ganz viele Textareas gesprayed und habe in diesen Textareas, in der Eigenschaft Rose, Dead Code reingeschrieben. Dead Code ist halt ein Wert von, bei dem bin ich halt ausgegangen, der ist halt auf dem Hieb nicht ganz so oft zu finden. So, und somit haben wir schon mal erstmal ganz viele Objekte auf dem Hieb gesprayed. Als nächstes müssen wir das Objekt finden. Also eins dieser Objekte, die wir gesprayed haben, müssen wir natürlich auf dem Hieb finden. Und wenn wir halt dieses Hieb spraying betreiben, dann wird natürlich nicht, dann werden diese Objekte natürlich nicht hintereinander auf dem Speicher abgelegt, sondern die werden halt irgendwie wild verteilt und das ist halt der Grund, warum wir jetzt über den Hieb gehen müssen und eins dieser Objekte finden müssen. Das Suchen der Objekte ist halt auch nicht wirklich schwer. Ganz oben sehen wir halt, dass ich mit dieser Set Base Funktion, dieses Area, was wir zum Auslesen benutzen, und dann renne ich halt in vier Beitschritten über den Hieb rüber und versuche halt, den Wert Dead Code zu finden. Wenn ich diesen Wert gefunden habe, dann ermittel ich mir halt die Startposition von meinem Objekt, weil die brauche ich zu einem späteren Zeitpunkt und ändere diesen Wert in Dead Beef ab. Das tue ich, weil wenn ich jetzt Dead Code in Dead Beef umänder, dann muss ich natürlich, ich muss natürlich irgendwie rausfinden, ich weiß ja nicht in meinem Area, den ich gesprayed habe, ich weiß jetzt nicht, welches Objekt ich geändert habe, also die Eigenschaft von welchem Index in dem Area ich abgeändert habe. Somit gehe ich halt quasi im nächsten Schritt einfach wieder über meinen Area und guck, in welchem Objekt steht denn jetzt in der Rows Eigenschaft Dead Beef drin. Und somit kenne ich, und an der Stelle bin ich halt einfach sicher, dass ich die Speicheradresse von meinem Objekt kenne und ich kenne halt auch den Index von meinem Objekt in meinem Area, den ich gesprayed habe. Und ganz zum Schluss gehe ich halt einfach nochmal hin und ändere diesen Dead Beef Wert in Code Babe ab und in der Speicheradresse, die ich halt quasi ermittelt habe, ich lese die nochmal aus und wenn ich da dann wirklich Code Babe drinstehen habe, dann bin ich mir sicher, ich kenne jetzt den Index von meinem Objekt in Speicher und ich kenne halt auch das Offset von meinem Objekt in Speicher und ich kenne halt auch den Index in meinem Area. Nachdem wir das gemacht haben, müssen wir halt als nächstes die V-Table des Objekts finden, damit wir die dann später ersetzen können. Die V-Table zu finden, ist halt relativ einfach. Wir kennen ja, wir kennen die Adresse im Speicher von unserer Objektinstanz und da wir ja gerade gesehen haben, dass die V-Table von einem Objekt immer im Code-Bereich liegt, der halt nur gelesen und nur ausgeführt werden kann, muss sich halt an der Stelle einfach nur nach einem Pointer in so einem Code-Bereich suchen. Und das ist halt relativ einfach. Sobald ich einen Pointer gefunden habe, habe ich einfach geguckt, was steht an dieser Stelle im Speicher und wenn ich dann halt quasi so was gefunden habe, daran erkennt man halt relativ einfach, man sieht hier zwei Blöcke und in mir das ist halt nichts anderes als ein Area von Offset, die halt irgendwo in den Code-Bereich reinzeigen. Und wenn man so was sieht, dann weiß man eigentlich in der Regel, okay, das ist die V-Table. Und somit haben wir auch den Pointer zur V-Table im Objekt gefunden. Wie triggern wir denn jetzt als nächstes die Code-Execution? Diese Methode mit der V-Table die sorgt halt quasi also die Methode mit der V-Table die sorgt halt quasi dafür dass wir genau ein Gadget ausführen können. Und dieses Gadget muss da natürlich ein Gadget sein, das den Stack-Pointer unter unserer Kontrolle bringt, da wir ja Rob-Execution haben möchten. Und es gab jetzt halt quasi in all diesen Modulen, die ich ausgelesen hab, wirklich nur ein Gadget, was dafür geeignet war. Und das war Push-RX, Pop-RSP. Was nichts anderes macht als den Wert vom Register-RX ins Register, also ins Stack-Pointer-Register reinzuschreiben. Und somit wäre dann quasi bei der nächsten Instruktion unser Stack-Pointer auf unserer Rob-Chain und die Ausführung könnte weitergehen. So, jetzt stehen wir aber vor dem nächsten Problem. Wir können nur Speicher lesen und schreiben. Wir sind aber nicht in der Lage, irgendwelche CPU-Regisse auszulesen. Und das war dann wirklich so der Punkt, wo ich wirklich kurz vorm Verzweifeln war, weil ich hab da jetzt halt mehrere Monate Arbeit reingesteckt und ich wusste halt einfach nicht mehr weiter. Und dann hat mich halt ein Kollege darauf hingewiesen und sagte zu mir, ey, das ist doch ein FreeBSD, was da auf der PS4 läuft. Versuchte doch einfach diese Testumgebung in einer virtuellen Maschine nachzubilden. Und genau das hab ich dann auch getan. Und zwar hab ich mir eine PC-BSD9VM aufgesetzt, die dann zufälligerweise und zu meinem Glück mit einer alten Midori-Version kam, die halt quasi auch für denselben Backanfällig war. Und dann musste ich jetzt natürlich noch hingehen und den Explore Teil von der PS4 auf den PC portieren. Das war halt aber nicht wirklich sehr kompliziert, weil man halt am PC mit GDB und so weiter diese Offsetsunterschiede, die es da so gibt, relativ einfach auswendig machen kann. Und ja, dann hab ich mir halt ein Breakpoint an genau der richtigen Stelle gesetzt. Hab versucht, die Rob execution zu triggern am PC selber und durfte dann halt wirklich feststellen, ja, dass der rx-Register, den wir ja brauchen, genau auf die V-Table zeigt. Was natürlich eine super Sache für uns ist, weil das bedeutet, dass wir genau an diese Stelle, also genau in die V-Table bzw. die Fake-V-Table, die wir ja lesen, schreiben können, da können wir jetzt unsere Gadgets platzieren. Und dieses Set-Selection-Start ist der Eintrag 30 von dieser Fake-V-Table. Das bedeutet, dass alles, was vor 30 kommt, von uns erstmal benutzt werden kann, um eine kleine Rob-Chain auszuführen. So. Und genau das tue ich an der Stelle. Als Allererstes gehe ich hin und such mir die ja, genau, und hol mir die Speicherstelle, das ist ja der V-Table. Als nächstes lege ich halt die Fake-V-Table im Speicher an und platzier innerhalb der Fake-V-Table überall unser Stack-Pivo-Gadget, der halt den Wert von rx in den rsp-Register schiebt, einfach um sicher zu sein. Ich hätte jetzt auch einfach nur den 30. Eintrag ändern können, aber da ich halt, ja, ich glaube, ich war einfach zu faul rauszufinden, ob es wirklich Eintrag 30 ist oder nicht, dann habe ich mir gedacht, ja, viel hilft viel, dass er das Ding halt einfach komplett ab, denn wir brauchen ja nur die ersten drei V-Table-Einträge um unsere kleine Rob-Chain, dann halt nochmal zu einer etwas größeren Rob-Chain umzuschieben, umzuschubsen. Auf jeden Fall, die Fake-V-Table wird vorbereitet und ganz zum Schluss ersetzt sich dann den Wert der originalen V-Table mit dem Wert von der Fake-V-Table. Das habe ich gerade im Beispiel schon erwähnt. Kann wenn die Rob-Chain an der Stelle steht, kann die Rob-Chain wenn die quasi an der Stelle steht, wo sie steht. Die Rob-Chain die ist halt quasi die ist halt maximal so groß wie unsere V-Table groß ist. Das bedeutet, wir können halt nicht wirklich viele Gadgets dahin platzieren. Was wiederum bedeutet, wenn wir halt eine größere Rob-Chain haben wollen oder eine größere Rob-Chain ausführen möchten, müssen wir natürlich eine zweite, also unsere echte Rob-Chain halt irgendwo anders in den Speicher hinschieben und dann mit den ersten paar Gadgets die wir ausführen, den Stack-Pointer zu dieser richtigen Rob-Chain hinschieben. Und genau das tun wir quasi hier in dem Code. Ganz am Anfang sieht man halt wie, ja, ganz am Anfang sich halt zu unserer Fake-Fore-Table hin und ersetzt die ersten drei Gadgets das erste mal mit dem knob da passiert gar nichts und das zweite macht ein Pop-RSP-Rob-Chain. Und dieser zweite Gadget sorgt halt quasi dafür dass unsere diese zweite Rob-Chain dieses dritte Gadget sorgt halt quasi dafür dass die RSP-Adresse halt wieder woanders hin zeigt auf dem Heap und da auf unsere zweite Rob-Chain die wir halt unten sehen, die halt auch erstmal nichts anderes macht als halt einfach nur ein Endless Loop erstmal ein paar knobs und dann halt ein Endless Loop. Warum mache ich das auf dieser Art und Weise? Weil wenn ich halt quasi ich könnte das Endless Loop halt quasi auch direkt an der ersten Stelle in den Rob-Chain reinpacken. Aber dann haben wir natürlich das Problem jetzt weiß ich nicht, läuft meine Rob-Chain jetzt wirklich durch und dann wird halt wirklich nur das erste Gadget ausgeführt. Und genau aus diesem Grund lege ich halt erstmal so ein paar knobs an und wenn ich dann halt unten in so einem Endless Loop lande dann weiß ich, okay die Gadgets davor die wurden halt quasi auch ausgeführt. So, wie kann ich denn nachdem ich das Ganze jetzt vorbereitet habe ich habe halt quasi die, ich habe halt quasi die ganzen Schweichadressen gefunden hab die Fake-Four-Table mit einer Fake-Four-Table ausgetauscht wie kann ich dann jetzt kontrollieren dass meine Rob-Chain halt auch wirklich getriggert wird. Und die Antwort ist halt relativ einfach ich hab ganz unten zum Schluss da gibt's dieses Log-Add das macht nichts anderes als halt auf dem Display der halt an der PS4 angeschlossen ist ja, halt dieses Failed auszugeben. Und in einer idealen Welt wo halt dieses Triggern der Rob-Chain funktioniert hat darf diese Zeile natürlich nicht ausgeführt werden das bedeutet quasi ich hole mir ganz oben das Objekt also das Objekt mit dem Index den ich ermittelt hab und Trigger halt einfach dieses Set Selection Start und wenn dieses Failed nicht ausgeführt wird wenn dieses Failed nicht ausgeführt wird dann hat alles funktioniert und in meinem Fall war es Gott sei Dank so dass es halt Problems funktioniert hat wir haben in den Folien davor gesehen wie mühselig es quasi sein kann eine Rob-Chain auf diese Art und Weise auszuführen das macht natürlich wenig Spaß als recht wenn die Rob-Chain halt viel viel größer wird und aus diesem Grund bin ich halt quasi hingegangen und hab mir so ein kleines Framework hat mir so ein kleines Framework gebaut mit dem ich halt im Framework selber habe ich halt quasi die Adressen zu den verschiedenen Gadgets definiert so dass ich dann halt zu einem späteren Zeitpunkt einfach in der Lage war mit dem Framework meine Gadgets halt so ein bisschen leserlicher zu schreiben und so in der Lage war halt auch ein paar etwas komplexere Rob-Chains auszuführen in dem Fall was diese Rob-Chain hier macht die macht nichts anderes als die öffnet halt quasi ganz oben ganz oben öffnet die halt quasi den Deviceordner liest den aus macht dann Socket auf und schickt das was ausgelesen wurde halt wieder zum PC zurück das ist halt alles nicht sehr wirklich schön auch nicht leserlich aber es funktioniert halt und somit konnte man und somit war ich halt in der Lage eigene Rob-Chains über Video-Apps auszuführen ja jetzt gibt's natürlich jetzt gibt's natürlich noch einige Dinge die mit Video-Apps halt nicht ganz so schön sind Video-Apps benötigen natürlich halt immer PSN Zugriff was eine sehr unschöne Sache ist das bedeutet nämlich immer, dass man halt auf der letzten Firma-Version sein muss und man muss halt online sein und jedes mal wenn das Ding abstürzt werden halt sofort Crash-Logs an Sony rausgesendet und dementsprechend können die Dinger halt relativ schnell gefixt werden dann haben Video-Apps auch kein Zugriff auf den Just-in-Time-Compiler den man halt aus dem Browser kennt das ist aber ab Firma-Version 315 sowieso nicht mehr ganz so relevant denn ab diese, denn ich glaub irgendwann gegen Firma 2.0 hatten sowieso normale Apps kein Zugriff auf den Just-in-Time-Compiler von daher muss man halt damit leben ja, dann unterstützen Video-Apps kein Threading das ist natürlich auch sehr unschön ist weil es bedeutet natürlich dass man nicht alle Arten von Exploits wirklich ausführen kann zum Beispiel wenn man Race-Conditions hat die man irgendwie danach noch triggern möchte wo man halt verschiedene Threads braucht um halt den Colonel Exploit auszuführen das ist ja natürlich auch suboptimal aber wenn man halt den Colonel Exploit triggern möchte der halt keine Threads benötigt ist vollkommen okay ja, dann hat man natürlich ja, dann hat man natürlich noch das Problem Video-Apps haben halt quasi ja, die laufen halt in der Sandbox wie der Browser auch nicht so trotz, die sind halt trotzdem noch mal ein bisschen eingeschränkter als der Browser, das heißt man hat auch nicht auf alle Devices Zugriffen wo man halt vielleicht auch noch im Browser hat das heißt die ja, die Angriffsoberfläche die man vielleicht quasi noch die man halt vielleicht noch mit dem Browser Exploit hat die fallen mit Video-Apps natürlich auch noch direkt weg wie der Browser steht Video-Apps haben auch keinen Zugriff auf DIN-LIP DIN-LIP ist halt quasi die dynamische die dynamische Bibliotheken beziehungsweise Funktionsaufruf zur Laufzeit auf dem man halt auch im Browser Zugriff hat also wie bedeutet man kann halt quasi bei Video-Apps keine Zusatzmodule zur Laufzeit laden um dann halt irgendwelche weiteren Funktionen auszuführen die halt nicht mit in der App kompiliert sind das kann man zum Beispiel natürlich super wenn man da halt einmal Code Execution hat und man möchte halt gewisse Funktionen ausführen die halt ganz normal fürs Userland normalerweise zu haben sind dann kann man sich halt einfach das Modul beziehungsweise die Library die Funktion enthält zur Laufzeit laden und ja das geht bei Video-Apps natürlich nicht was halt natürlich auch doof ist und dann kommt natürlich halt noch dazu dadurch dass es halt eine App ist kann die halt ganz einfach per Update gefixt werden ob sie jetzt per Update gefixt werden oder nicht weiß ich nicht die Methode die ist es halt wie gesagt die ist auch aus 15 ich hab sie damals entwickelt ich weiß auch gar nicht ob das jetzt noch läuft ich wüsste nicht warum nicht man kann es ausprobieren ja das sind halt so ein bisschen die Nachteile die man hat aber nichtsdestotrotz man darf halt nicht vergessen dadurch dass man halt wirklich komplette Userland Code Execution erlangt ist das Ganze natürlich vollkommen okay um halt einen Kernel Explorer zu triggern das ist halt wirklich der Einstiegspunkt und ja hier bin ich jetzt auch glaube ich ein bisschen schneller durch als gedacht vielleicht gar nicht ob ich was vergessen hab ich hoffe nicht aber ja okay ja dann bedanke ich mich erstmal und falls auf Fragen dazu wollte ich auch gerade kommen erstmal vielen Dank an dich wenn es Fragen gibt ihr findet zwei Mikrofone dort im Publikum könnt euch dort dahinter stellen und dann die Fragen stellen wenn ich fange ich mal an du hattest geschrieben dass die PS4 von deiner Frau ein Geschenk war was hat sie denn gesagt als du angefangen hast die PS4 auseinander zu nehmen die fand also was ich jetzt halt auch in den Vortrag nicht gesagt habe ich habe die ausgepackt und ich habe die nicht sofort angemacht sondern ich habe die sofort aufgeschraubt fand sie auch nicht so lustig aber ist halt so hast du da hinten eine Frage dann das Mikrofon bitte eine Frage wie bist du auf die Idee gekommen explizit Video-Apps zu nehmen dafür gab es da Hinweise es gab da keine Hinweise drauf es war ganz einfach wie gesagt, ich habe ja ganz am Anfang einfach sämtliche Pakete, sämtliche Netzwerk-Traffic mitgeschnitten und habe dann wirklich sämtliche Apps einmal ausprobiert alle Video-Apps Spiele gestartet und so weiter und so fort und Video-Apps waren halt die einzigen wo der Traffic halt nicht SSL verschlüsselt war und da konnte man alles lesen und das hat dann halt natürlich auch verraten dass es dann eine alte Webkit-Version zum Einsatz gekommen ist sehr cool Dankeschön gibt es noch weitere Fragen wenn ich dann nochmal herzlichen Dank großen Applaus und dann geht es um 13 Uhr weiter mit Neuspricht