 für die letzte Session am Tag 3 der Konkurrenz. Ich bin wirklich glücklich zu sehen, so viele von euch, so late, interessiert in so einem speziellen Thema. Das könnte wirklich, wirklich relevant sein. Ja, schönen guten Abend zusammen. Es wundert mich ja, dass trotzdem noch so viele gekommen sind, obwohl das ja schon ziemlich kompliziertes Thema ist, zu dieser späten Uhrzeit. Und wir werden gleich mehr zu DMA-Attacken sehen. Also Direct-Memoryxess-Attacken, Direct-Memoryxess bedeutet direkter Speicherzugriff. Wir werden in Zukunft den englischen Begriff dafür verwenden. Hallo, vielen Dank. Heute Nacht sprechen wir über öffentlich verfügbare FPGA-basierte DMA-Attacken. Mein Name ist Ulf Frisk und ich gebe euch heute ein paar Demos. Ich fange mal mit ein bisschen Hintergrundinformationen an und vorangegangen arbeite ich in dem Bereich von DMA-Attacken. Dann werde ich eine Live-Demo machen, wo wir PCI Transaction Layer-Packets übertragen werden, werden Speicherdumps machen und werden uns ein FPGA-Design anschauen. Danach schauen wir uns noch etwas fortgeschrittener Attacken basierend auf DMA-Attacken an. Wir greifen ein Unions-System an und ein UFE-System, UEFI-System an und mit einer UEFI-Attacken kann man dann auch Secure Boot angreifen und damit zum Beispiel ein Windows 10-System angreifen, das Virtualization-Based Security verwendet. Dann schauen wir uns noch zu letzter zukünftige Hardware an. Mein Name ist Ulf Frisk. Ich arbeite im Finanzsektor in Schweden. Ich habe auf der DEVCON und auf der Sekt-T-Konferenz präsentiert. Ich habe das PCI Leech-DMA-Angriff Toolkit geschrieben. Ich möchte noch einen kleinen Disclaimer machen. Ich gebe diesen Talk als Privatperson. Mein Employee hat hier mit nichts zu tun. Was ist PCI Leech-FPGA? PCI Leech-FPGA ist eine Kombination aus dem Xilings SP605, der Entwicklungsbord, und dann noch ein USB-Add an Bord, und es ist ein PCI Express, ein Lane-Karte, die man in den Zielcomputer, also den Entwicklungscomputer einfügt und dann wird sie auch noch zum Angreifer-Computer verbunden. Und so kann man dann vom Angreifer-PC aus über USB PCI Express TLP Transaction Layer Packets über USB in den FPGA laden, und vom FPGA wird das dann über PCI Express ins Zielsystem geladen. Zusammen kostet das ungefähr 495 Dollar und plus 66 Dollar, und man kann DMA bis zu 75 Megabyte pro Sekunde mit dem Gerät machen. Alles, was ich selber gemacht habe, ist komplett open source, aber ich verwende einige Blobs, die properitär von jeweiligen Wendern sind, und deswegen habe ich auch den Talk-Tier im Titel nicht open, sondern nur public genannt. Falls ich das mit dem USB 380 vergleiche, das ist dieses Frühjahr ausverkauft worden, die FPGA-Lösung ist etwas teurer, nimmt mir Platz weg, ist etwas langsamer, es ist aber viel stabiler und man kann 64-bit DMA-Adressierung machen. Das heißt, man kann also Speicher über 4 Gigabyte adressieren, nicht nur drunter, das ist also ein Riesenunterschied im Vergleich zur alten Radwehr, die nur Speicher unter 4 Gigabyte entsprechend der DMA-Attecten sind schon seit fast der ganze Zeit da. Man hat vielleicht von Inception, FireWire, DMA-Angriffe gehört, als Antwort auf DMA-Attacken und auch wegen des steigenden Bedarfs an Virtualisierung wurden die EIO-MMUs nach 2008 eingeführt, oder VTAD, wenn die EIO-MMUs richtig benutzt werden von der Firmware und dem Betriebssystem, dann können sie vollständig gegen DMA-Attacken schützen, aber das ist, wie wir heute sehen, wird nicht immer der Fall. Es gibt viele Forschung zum DMA-Angriffe, ich kann nicht alle erwähnen, aber ich erwähne Kaminoswork mit Ironhide aus dem akademischen Bereich, die er für seine Doktorarbeit benutzt hat und also Snare und RZN haben Thunderboard-Angriffe gemacht in 2014, auch mit dem gleichen Hardware, den ich benutze, den SP-605 von Sightings. Nur ein paar Monate, vor nur ein paar Monaten hat Dimitri Olesio den ersten DMA-Attacken mit seinem PCI-Toolkit mit dem PCI-Needs, das meine Arbeit unterstützt. Er hat zuerst Binarys und dann Sourcecode mit mir geteilt und er hat mich also dazu getrieben, die SP-605 zu benutzen, vom Anfang an und damit anzufangen. Vielen Dank an Dimitri, ohne dich wäre ich nicht hier. Und PCI Express ist paketbasiert, die Pakete heißen Tradition Layer Packers oder TRPs, sie sind Doppelwörter, also 32-Bit basiert, das bestehen aus einem Header, aus zwischen drei und vier D-Wörtern. Und die TRPs können verschiedene Arten haben, also Memoriespeicher lesen, Speicher schreiben und Vervollstelligungen von TRPs. Und mit des 64-Bit-LTLP-Schreiben, es ist unten links, das fängt an, was das für ein Typ ist und dann wird die Länge der Daten, die geschrieben werden sollen, in Nummer von Doppelwörtern angezeigt. Das zweite Doppelwörter enthält die Request-ID, das ist Device-Number und Bas-Number von dem TRP-Packet, das was geschickt wird. Und weil das 64-Bit-Schreibzugriffe sind, braucht man also zwei Doppelwörter in die Adresse und dann kommt die Daten, dann kommt die Daten. Wenn man für einen vor einem Schreibzugang schreibt man das einfach am PCI Express Bus und man verlässt sich darauf, dass das Verdrück geschrieben wird und da kriegt man keinen Acknowledge-Back. Bei einem Lesevorgang sieht das fast gleich aus, nur dass da ein gleicher und unterschiedlicher Typ ist. Und hier machen wir einen 32-Bit-Speicher-Auslesevorgang. Wenn man das einreicht, muss man das eine Weile warten. Dann kriegt man die Vervollständigungs-TIPs zurück mit den Daten, die gelesen wurden. Also lass uns einen Demo machen mit Transmit. Ja, das heißt, wir machen jetzt mal eine kleine Demo und übertragen ein paar PGA-Boards. Sie sehen hier das FPGA-Board und hier das Opfer-System. Das heißt, wir fügen hier unsere Express-Card in den Ziel-Computer ein und starten den FPGA. Und das ist bei USB an meinen Computerverwendeten zum Präsentieren-Verwenden. Wenn ich jetzt zurück zu meiner Präsentation wechsle, dann haben wir das jetzt von etwas anderen Winkel. Und wir werden jetzt hier ein D-Wirt lesen aus dem Fernseh-Zwirt-Adress-Raum, von der Adresse 4 GB und schauen uns an, was passiert. Hier haben wir den Read-TLP gesendet und wir haben einen kompletchen TLP zurückbekommen. Und die ersten drei D-Wirts da drinnen sind der Header. Und dann haben wir tatsächlich die Daten hier, was ich eben markiert habe. Jetzt machen wir noch einen Write. Das heißt, ein 64-Bit-Speicher-Write auf der selbe Adresse. Das heißt, ein 2-D wird langer Write an die gleiche Adresse mit diesen Daten. Und wir schauen uns an, ob wir die vorangegangenen Daten überschreiben können. Und da wir eine Schreiboperation machen, bekommen wir keine Antwort zurück. Aber wir können den Speicher nochmal lesen, um zu sehen, was denn eigentlich passiert ist. Das heißt, jetzt lesen wir mal 30 D-Wirts an der gleichen Adresse. Und hier sehen wir jetzt, dass wir zwei Verstehende-Completions zurückbekommen. Und wenn wir am Anfang gucken, dann sehen wir, dass wir die Daten tatsächlich überschrieben haben mit unseren Daten, die wir eben geschrieben haben. Und was wir nochmal können, ist den Speicher enumerieren vom CSystem. Da wir nicht wissen, wie viel Speicher in diesem Computer ist, können wir das einfach ausprobieren. Und das können wir machen, indem wir einfach einen kleinen Abschnitt jeder Seite, die wir lesen können, lesen. Und schauen, wie viel Speicher, und auf diese Art und Weise schauen, wie viel Speicher im System ist. Wir müssen wissen, dass physischer Speicher in einem modernen Computer nicht ein einziger Zusammenhängler-Raum ist, sondern es gibt dazwischen Löcher, es gibt memory-gemüllte Geräte und so weiter. Und deswegen sehen wir, dass es zum Beispiel nach acht Gigabyte aufgehört hat. Und das heißt, wir schließen daraus mal, dass das System acht Gigabyte-Raum hat. Das heißt, jetzt ist es an der Zeit, den Speicher zu dampen. Das heißt, es dauert ein bisschen, das heißt, wir machen in der Zeit mit der Präsentation weiter. Das sind alles PCI Express-Formfaktors. Wir haben die Standard PCI Express-Karte, die ja wahrscheinlich alle kennt. Wir haben die PCI Express-Karte, die auf der Rückseite von der Topes ist. Wir haben die Express-Karte, die ich in dieser Demo verwende. Thunderbolt 3 gibt es noch, das heutzutage häufig mit dem USB-3-Konnektor zusammen auftritt. Und dann gibt es noch die zwei Formfaktoren, die es auch in einer Vielzahl gibt. Hier ist das FPGA-Design, das ich erstellt habe. Es ist eigentlich relativ einfach. Es gibt einen Block, der die zu übertragenden Daten über USB erhält. Und dann gibt es den Xilinx PCI Express-Kern, der auf der anderen Seite die tatsächliche Kommunikation über PCI Express behandelt. Alles, was gelb ist, sind Xilinx IP-Kerne. Das heißt, die sind nicht Open Source, sondern proprietary. Und alles, was grün ist, ist Zeug, was ich erstellt habe und komplett Open Source und auf GitHub zu finden ist. Wir empfangen Daten über den USB-Verbindungen vom kontrollierenden Computer, vom Angreifer-Computer. Und dann haben wir noch Daten und Metadaten, denn wir müssen wissen, welche Arten von Daten wir empfangen. Wenn die Daten ein Tlp-Paket sind, dann tun wir es in die erste Queue für FIFO-Tlp. Und wenn es andere Daten sind, dann tun wir es in eine interne Loopback-FIFO. Wenn wir dann die Daten aus der Tlp-FIFO irgendwann den Xilinx-Kern übertragen, kommen wir dann noch irgendwelche zurück, auch wieder in eine FIFO. Und dann, da wir verschiedene FIFOs haben, aus denen wir lesen müssen, oder lesen möchten, brauchen wir irgendeine Form von Merch-Logik, also die verschiedenen FIFO-Inhalte in einen Stream zusammenführt. Und dann geht das dann wieder zurück. Eine ganze Formatierung von den Tlps und so weiter. Es passiert alles auf dem Controller-Computer. Es ist alles relativ einfach, aber es funktioniert. Und jetzt gehen wir in ein etwas fortgeschrittener DMR-Angriff. Wir lassen uns einen Linux-Kernel finden und dann patchen. Das ist Linux-Sider-Version 4.8. Ist der Kernel vollkommen randomisiert. Also landet mit großer Wahrscheinlichkeit jenseits das 4GB Limits. Also das kommt wirklich zum Glänzen unserer Version. Also lass uns das jetzt starten und das Filesystem mounten und den Computer entsperren. Jetzt haben wir den Linux-Computer. Der Memory-Bump war erfolgreich. Das ist etwas langsamer jetzt, weil das durch den USB-Hub geht, aber der Memory-Bump scheint funktioniert zu haben. Wir schalten um zum FPGA-Bild, zum FVR-Image. Jetzt versuchen wir da auf diesen Computer einzulocken mit einem einzelnen A als Passwort. Und das falsche Passwort kann nicht in das Linux-Computer zu sehen reinkommen. Wenn wir es zurück schalten, das ist eine Präsentation, kann man ein Kernel-Modul einfügen in den erlaufenden Linux-Kernel. Wir versuchen den Kernel zu erfinden, zu lokalisieren. Und wir können sehen, dass er jetzt diesmal unterhalb 4GB ist, weil es funktioniert. Jetzt lass uns das Live-Filesystem mounten mit dem Kernel-Adresse. Wenn das Filesystem gemountet ist, können wir einfach draufklicken. Wir haben das Live-Ram noch nicht gemacht. Im EDC-Fort gibt es das Shadow-File-Hashes mit den Hashes von den Users. In unserem Lieblings-Editor können wir das editieren. Da gibt es eine Menge User-Accounts mit den Hashes und User-Account mit einem sehr langen Passwort-Hash. Wenn man diesen Passwort-Hash kennt, kann man das cracken, aber das ist nicht so spassig. Das kann man einfach löschen und ersetzen mit etwas anderem. Und dann save drücken. Mal schauen, ob wir anlösen können, wenn wir zurückschalten aufs FPGA. Das ist einfach das Passwort von A benutzen. Und diesmal geht es. Vielen Dank. Lass uns zurück zur Präsentation gehen. Wenn wir durch den anderen Computer gehen, können wir die Kamera zum anderen Computer nehmen. Das kann auch UFI angreifen. Manche UFI kann sich DMR gegen DMR schützen, aber die meisten machen das nicht. Wenn man in UFI reinkommen kann, kann man auch das sichere Boot kompromittieren. Lassen wir heute versuchen, die Exit-Boot-Services zu ändern. Als wir versuchen, das hier System anzugreifen, brauchen wir zunächst erst mal das Memory-Mapping und dann patchen wir den Windows-Colonel, der in dieser Stage geladen wird. Und Dimitri hat hier in diesem Bereich schon viel Arbeit geleistet. Das wäre mit Sicherheit gut, wenn er euch auch seine Arbeit nach anschaut. Das heißt, hier haben wir jetzt ein anderes System. Dann müssen wir jetzt den FPGA ein bisschen umbasteln. Das ist eine ganze Kapitalage hier. So, was wir jetzt tun, ist den FPGA, wieder in den noch nicht geboteten Computer reinzustecken. Und wenn wir ihn jetzt starten, dann wechseln wir zurück zur Präsentation. So, das Programm sagt, fail to connect to the device. Versuchen wir das nochmal. Ja, das funktioniert dieses Mal besser, wahrscheinlich eine kaputte Verbindung oder sowas. Der Computer startet und der Loder hat dann tatsächlich in die Exit-Boot-Service-Funktionen aufgerufen und die haben wir mit unserem Code ja getrappt. Wir haben jetzt hier die Speichermap, die wir haben. Und in dieser Stage befindet sich der Windows Kernel tatsächlich schon im Speicher. Und auch der Secure Kernel usw. ist auch alles im Speicher. Aber das Betriebszimmer ist noch nicht gebotet. Das heißt, es kann sich noch nicht gegen DMA-Attacken schützen. Und das heißt, wir können jetzt einfach den Windows Kernel patchen. Wenn man sich Windows Virtualization Based Security anschaut, dann gibt es da etwas, das man einschalten kann, um Kernel Code Integrität sicherzustellen und vom Hypervisor. Und bezüglich bürstartigen DMA-Attacken haben dann Hypervisor und das sichere Kernel keinen Zugriff jetzt auf. Normale Speicherseiten werden als read-only markiert. Das heißt, wir können den Speicher dort nicht direkt patchen. Und nicht ausführbare Seiten sind so wie immer einfach read-read gemapped. Und wie ich gesagt habe, sind die ganzen Integritätsfeatures von Windows zu diesem Zeitpunkt noch nicht eingeschaltet. Denn der Windows Kernel ist ja noch nicht gebotet. Das heißt, wir versuchen jetzt dort Code einzufügen. Hier haben wir mit unserem UEFI-Modul kommuniziert und haben den Windows Kernel lokalisiert. Laden ein paar Code Caves da rein, um unseren Code reinzuladen. Und jetzt bootet Windows inklusive Virtualization Based Security. Das heißt, wir können den Kernel ab jetzt nicht mehr modifizieren, aber unser büsartiger Code ist ja schon drin. Und das heißt, wenn wir uns jetzt den Computer anschauen, haben wir hier den Windows-Computer, versuchen uns einzuloggen, ohne überhaupt irgendein Passwort. Und wie ihr seht, konnten wir uns nicht einloggen. Ändern wir das. Wir spawnen einfach ein System Shell in dem Windows und wir sind tatsächlich auch für uns das Shell mit System Privilegien aus. Und wenn wir System sind, wenn wir System Privilegien haben, dann können wir einfach das Passwort vom User Account löschen. Und wenn wir uns jetzt wieder in FPGA angeschauen und den Laptop anschauen und uns einloggen, dann sind wir einfach drin. Wenn wir jetzt zur Präsentation zurückgehen, können wir also den Speicher danken vom Windows-System. Dann kriegt da eine ganze Menge falsche unlesbare Seiten mit dem IO-Menü. Das schützt Windows. Das sind die Secure Kernel und Hypervisor-Seiten in Windows. Aber alles andere können wir lesen. Die PCI Leech FPGA ist Open Source, zumindest der Teil, den ich geschrieben habe. Man kann das auf GitHub finden. Und ich habe das so leicht benutzbar zu machen wie möglich. Man braucht kein vorheriges FPGA-Kentnisse. Man müsste es einfach auf die Hardware flaschen können und dann DMR-Angriffe starten können. Leider ist das Windows nur Windows, weil auf dem Angriffe PC, also mit Linux, es noch mit ein paar Treibern und Probleme gibt. Ich hoffe, dass ich das bald beenden kann. Und was noch interessanter ist, ist, dass es bald eine ganze Menge Geräte gibt, die DMR-Attacken machen können. Yeah, some devices will be really inexpensive, but still less pricey than the SP605. Manche sind... Hier ist ein Beispiel von der andere Hardware, also PCI Express-Springmann, mit bei KITU, das ist leichter zu benutzen. Es kostet weniger als die SP605. Es kann mehr, PCI Generation 2. Und ich plane da, Unterstützung dazu zu addieren früh in 2018, also hoffentlich in den nächsten Monaten. Um alles zusammenzufassen, günstige FPGA-DMA-Attacken ist heute die Realität. Also physikalischer Zugriff ist immer noch ein Problem. IOMMUs sind da, aber sie werden nicht immer benutzt. Ich hoffe, ich habe euch gezeigt, dass da noch mehr Forschung gemacht werden muss in diesem Geld. Und ich hoffe, dass meine Werkzeuge da für euch alle, die interessiert sind, nützlich sind. Vielen Dank. Thank you so much, Uf. So, everybody just saw that you should keep your devices always on the person. And we have questions. Wir haben Fragen. Mikrofon 1, also eine Frage, die ich... Eine Frage, die ich habe. Aktuell Dumpster einfach Speicher und Modifizier den Speicher und Purchase in Kernel und so weiter. Hattest du vielleicht die Idee, einen Treiber für eine Wetter-Maschine zu schreiben, die den Speicher in einer anderen Maschine in ihren eigenen Speichelbereich mapt, dass man eine andere Maschine angreifen kann. Dass man zum Beispiel einen, ja, dass man den Speicher der angegriffenen virtuellen Maschine modifizieren kann. Ich bin dann noch nicht in diese Angriffe auf virtuelle Maschinen gegangen, aber es ist eine interessante Idee. Ich habe Kernel-Zugriffen zu dieser Zeit. Es sollte also möglich sein, aber das ist ein anderes Projekt von mir. Meine Zeit ist etwas begrenzt hier. Das Material gibt es schon, also es wäre gut, wenn das so niemand machen würde. Es wäre ganz nützlich. Eine Frage vom Signal Angel. Es sind tatsächlich gar nicht so viele, sondern nur zwei. Was hatte ich davon abgehalten, dass PCI Express-Gerät davon abgehalten ist, ohne irgendwelchen properteren Codes zu implementieren ist irgendwas durch diesen Properterienkram limitiert? Ich glaube, ich habe etwas zu einem Windows, also ich glaube, das kriegt das bald in Windows, also in Linux zum Funktionieren. Ich hatte da mit den Treibern in Linux ein bisschen ein Problem. Das muss einfach die Zeit finden, um das zu machen, um die Treiberprämie zu lösen. Und das andere Frage, ich bin jetzt ziemlich neuling in FPGAs. Ich benutze einfach die Default-Werkzeuge, die Silingskultulkit zur Verfügung steht. Es sollte möglich sein, einige Elemente mit öfteren Elementen in diesem Entwurf zu ersetzen, aber ich bin noch etwas neu in FPGAs. Das ist mein erster Versuch in FPGAs. Es sollte es möglich sein, das auch zu tun. Also es sollte miteinander reden. Es sollte miteinander mehr reden. Also ich frage mich, ob du den Speicher zugreifen kannst, der von der Intel Management Engine benutzt wird. Nein, das ist der Jenseits der Zugriffen. Also das wird im Plattformkontrollerhub weggemappt. Es sollte nicht möglich sein, das System Management Mode Memory zuzugreifen oder das Management Engine Memory. Du benutzt ThinkPads, wie ich gesehen habe. Sind irgendwelche BIOS-Einstellungen von diesen ThinkPads in der Lage, deine DMA-Attacken zu blockieren? Es ist zum Beispiel möglich, den bisherigen ExpressCard-Slot zu blockieren. Also die ExpressCard-Slot zu deaktivieren hilft, weil dann kann mich da nicht rein, aber wenn du das aufschraubst, dann gibt es so etwas wie eine Wi-Fi-Karte da drin. Das ist wahrscheinlich auch PCI Express und das ist vielleicht schwieriger, das zu deaktivieren. Wenn ich vielleicht noch darf, die Frage vor dem letzten, die kann ich tatsächlich antworten. Man kann einige von den Sightings Cores nicht ersetzen. Das ist sogenanntes Hard-IP, das heißt, das ist auf den FPGAs, die man nicht ersetzen kann. Also das ist einfach Hardware. Ja, das ist Hardware. Aber die FIFO sollte man machen können, wahrscheinlich. Vielen Dank. Noch mal vielen Dank. Danke, Frisk. Noch mal Mikrofon 1. Also bezüglich der Hard-IP, was diese Hard-IPs normalerweise implementieren, ist das physische Interface zu PCI Express, das eben diese Transaction Layer Packets baut, aber das DMR ist tatsächlich meist mit einem IP-Core implementiert. Das heißt, dieser DMR IP-Core ist normalerweise proprietär und benutzt aber dann den Hard-IP für den physischen Layer vom PCI. Das heißt, man bräuchte einen offenen DMR-Core. Ja, vielen Dank. So, wir sind dann wohl fertig. Eine Frage zu Ende. Wird jetzt umgeben sein von anderen Fragestellungen. Wir wünschen euch einen schönen Abend und noch mal vielen Dank an Frisk.