 möglich später beantworten können. Der nächste Vortrag ist ein tiefer Eintauch in die Mittelmanagement-Engine. Es geht um die Hardware-Ebene und es wird gehalten von Peter Boss. Bitte einen großen Applaus für ihn. Und herzlich willkommen aus der Übersetzer-Kabine. Dies ist die Übersetzung von diesem Talk. Ja, hallo. Kann jeder mich hören? Sehr schön, danke. Dann herzlich willkommen. Das bin ich. Ich bin ein Student an der Leiden-Universität und ich habe mich schon immer dafür interessiert, wie Sachen funktionieren und wenn ich mir einen Laptop gekauft habe, habe ich mich gefragt, ja, wie startet, wie bootet das Ding eigentlich wirklich? Was passiert eigentlich am Anfang? Dann habe ich mich an den Bootcoder angewagt und habe den durchgeschaut und habe festgestellt, da sind viele Sachen, die dann nicht sein sollten, was zur Verwundbarkeit in späteren Phasen des Bootprozesses geführt hat, was dann wiederum dazu führte, dass ich das herausgefunden habe und letztes Jahr habe ich hier herausgefunden, dass ich das nicht der Einzige war, der das herausgefunden hat und wir haben das dann zusammen weiter erforscht und präsentiert bei der Hack in the Box Konferenz. Und dann habe ich mich auch noch die Management-Engine angeschaut und da gibt es schon viel Nachforschung zu größtenteils, ja, größtenteils über das Datei-System und spezifische Verwundbarkeiten, was aber immer noch ziemlich schwer gemacht hat, ja, das überhaupt erst mal zu reverse-engineeren und deshalb dachte ich mir, das ist hier meine Outline, wie ich das hier vorstellen möchte, ich habe es in drei Teile aufgeteilt. Der erste Teil ist einfach nur eine kurze Einführung in das Betriebssystem der Management-Engine. Wenn man selber damit arbeiten möchte, dann sollte man wissen, was man da versucht zu reverse-engineeren. Danach möchte ich den Bootprozess ein bisschen beleuchten und die Rolle der Management-Engine darin und auch wie die Informationen verwendet werden können, um neue Firmen dafür zu programmieren oder noch tiefere Nachforschung anzustellen. Also zuerst, was ist überhaupt die Management-Engine? Da ist ziemlich viele Unklarheiten, gibt es darüber, dass es irgendwie eine Backdoor ist in allen Systemebenen. In der Realität, ob es eine Backdoor ist oder nicht, ob es eine Verwutbarkeit hat oder nicht, basiert auf der Software, die darauf läuft, weil es ist ein eigener Prozessor mit einem eigenen Arbeitsspeicher. Es ist keine CPU, es sitzt in der Southbridge, aber es hat einen eigenen Speicher und führt eigenen Code aus. Und es ist hier besprechlich über die sechste oder siebte Generationen von der Intel chips und das sind die Motherboards, die man normalerweise hat, wenn man mit einer modernen Intel CPU arbeitet. Also ein paar mehr Details darüber. Die CPU basiert auf dem 80486 Kern. Es ist ziemlich alt und wird immer noch heutzutage in fast 10 Computer benutzt, das ist ziemlich lustig. Es hat ungefähr 1,5 Megabyte RAM und auch einiges an eigenbautem Rom. Es hat auch eine hardware Beschleunigung für Kriptografie, verschiedene Fuses, was nur einmal beschreibbare Speicher, die halt dazu verwendet werden, um irgendwelche Sicherheitseinstellungen und Schlüsse zu speichern. Und die gruseligen Sachen sind eher, dass es Busse hat zu allen möglichen Sachen auf der Southbridge. Es kann den Arbeitsspeicher benutzen und es kann auch auf Netzwerk zugreifen, was es ziemlich gefährlich macht, wenn da eine Verwutbarkeit ist oder wenn es irgendwie gehackt wurde oder so was. Und die Aufgaben heutzutage sind halt, den Computer zu starten und also den Computer zu verwalten. Für Computer zum Beispiel, da kann dann die Intermanagement Engine als ein Management Controller arbeiten, um halt irgendwie zum Beispiel Fernsteuerung durch Testature und Bildschirmen zu ermöglichen und halt eben Sicherheit. Also es soll BootGuard, es soll die Firmen signieren und die Signature sicherstellen und es gibt auch ein Trusted-Plattform-Module für die Firmen und es gibt dann auch so eine Sicherheitsenglave, um halt sichere Operationen durchzuführen. Und auf der Software Seite ist es ein angepasstes Betriebssystem von Intel. Viele von denen sind aus Minix, es wurden so ein Lea-operative Betriebssystem, wurde davon abgewandelt, es ist ein Micro-Current-Obt-Betriebssystem, das ist total angepasstes Format, die Beine ist dies ausführt, also ziemlich komplizierte Systeme, wenn man sich das mal anschaut, auch wenn man sich das Betriebssystem anschaut, was darauf läuft, es ist ziemlich junixtähnlich, was es einerseits sehr gewohnt anfühlen lässt, aber auch eingeangepasste, abgewandelte Teile hat. Ja, wir reden hier über die sechste oder siebte Generationen von den Intel Chipsets, also, ja, Lewisburg ist die Server-Version und Sunrise Point ist die Customer-Version und es geht auch um die, wir werden auch, also die Laptop-Version davon heißen Intel Caller Power, das sind dieselben Chips einfach nur auf einem, auf einem anderen Platine, tatsächlich habe ich die meisten Sachen, die ich hier bespreche, auf meinem Laptop getestet, aber es macht keinen Unterschied, es ist eine Nouveau T460 und die Version, die wir uns hier anschauen, ist die Version 11.0.0.1205, ja. Ich muss das hier dazu sagen, ich bin nicht Teil von Intel, ich habe keine Verträge mit ihnen unterschrieben, ich habe das alles gefunden auf Art und Weise, die ihr auch machen könnt, ich hatte keine gelegten NDAs oder irgendwas. Es ist auch eine sehr große, großes Thema, da könntest du auch ein paar Fehler drin geben hier, aber ich habe natürlich versucht, es richtig zu machen. Wenn man damit anfangen möchte, so eine Management Engine, Firmenware, anzuschauen, anzupassen und so weiter, muss man sich mit dem Firmenware-Dateien auseinandersetzen und wie genau, wie kriegt man den Code daraus? Naja, es gibt Tools dafür, es gibt viele Dokumentationen dazu von irgendwelchen Leuten, man kann quasi einfach einen Tool runterladen und es dagegen laufen lassen. Es ist sehr hilfreich, bevor es diese Tools gab, es war noch viel, viel schwerer. Hier sind komprimierte Huffmann-Tabellen drin und so weiter. Das heißt, das hat man nur herausgefunden, weil man Code Execution bekommen hatte, aber das ist kein Problem, heutzutage mehr. Jetzt kann man einfach einen Tool dazu runterladen. Das Enteltool, womit man diese Firmenware generieren kann, die man im Internet irgendwo im Internet finden kann, hat Qt Resource XML Interface Dateien und dort sind hilfreiche Spezifikationen der Teilformate, die dort benutzt werden. Das ist ziemlich hilfreich. Wenn man sich so ein Image anschaut, dann hat es ein paar Partitionen, ein paar davon überlappen sich. Manche sind für Daten, manche sind für Code. Hier haben wir erst mal NFTP, da ist das der Code drauf, MFS, da ist Lesen und Schreibzugriff drauf für die Daten. Dann haben wir Flock für Lock, dann ein U-Talk, ein Unlock-Token, was aber von Intel generiert werden muss, von Intel signiert werden muss, sonst kann man das nicht benutzen. Das ist also nicht hilfreich für mich. Dann gibt es hier so einen ROM-Bipass, den gibt es, damit Intel neuen ROM-Code testen können. Das gibt es quasi dafür da, dass Intel darauf neuen ROM entwickeln kann, ohne es komplett neu aufzubauen. Es gibt ein paar Images, die geliegt worden sind und das wird uns später weiterhelfen. Dann haben wir hier diese Code-Partitionen, die haben einige Dateien, die sind nur Binarys, die keine Erweiterung haben. Es gibt hier Metadaten, es gibt keine Header, nichts drin. Das ist nämlich alles in den Metadata-Dateien. Man kann dieses Anmi 11-Tool benutzen, um Text-Dateien daraus zu generieren. Ja, die Metadaten, es ist ein Typ, lang, lange Wert Verzeichnis. Da gibt es verschiedene Informationen drin, wie ob etwas ein Datemodul ist, ein Code-Modul. Es gibt Prüfzum, auch um ein bisschen komplizitere Sachen, zum Beispiel Gerätetreiber, Tax oder ähnliches. Ich habe tatsächlich ein paar Sachen geschrieben, die sich mit diesen Daten schäftigen. Hier gibt es zum Beispiel eine GitHub-Datei, die die kompletten Definitionen enthält. All der Code auf der Management Engine ist signiert und verifiziert von Intel. Das heißt, man kann nicht einfach eine neue Binary nehmen und ihr sagen, hey, führ das aus. Das heißt, Sie haben dort drin diese Fuses, um den Intel-Key zu haschen. Dann gibt es auf jeder Partition so einen signierten Hash für die Metadaten. Dort ist ein Hash drin für die tatsächlichen Daten. Das ist nicht so kompliziert, das zu verifizieren. Dann schauen wir uns mal so einen Modul an. Es ist eigentlich einfach bloß eine flache Binary-Datei, eine reine Binary-Datei. Die Metadaten enthalten Informationen, um das Programm wieder zu konstruieren. Was hier interessant ist, ist, dass die Basisadresse, auf die das Programm geladen wird, ist normalerweise überall das gleiche, auch wenn es über die Software-Version hinweg verschieden ist. Na gut, also, wenn wir jetzt mal uns das anschauen, dann tut man das in irgendeinen Distance-Hemmler oder so. Dann zum Beispiel IDA, dann sehen wir das hier. Dann sehen wir hier, dass es lauter Sprecher referenziert, auf welchen wir keinen Zugiff haben. Haben wir vielleicht das falsch geladen? Nein, wir haben es tatsächlich richtig geladen, aber es gibt einfach viele Speichesegmente, die wir nicht haben. Dann schauen wir uns mal, geht es davon an. Hier wird ein bisschen gekollt, dann wird hier ein Pointer gepusht. Das sind dynamische Bibliotheken. Es liegt daran, dass man nicht überall seine C-Bibliothek rein linken möchte, weil man Brust 1,5 bis 1 Megabyte dran hat. Hier, das ist hier die Hauptsystembibliothek, das ist in der Flash-Pradition. Das heißt, man kann einfach das laden und sich anschauen. Das ist erstmal ein Jump-Table hier. Da gibt es kein dynamisches Linken, sondern es ist einfach Brust im Jump-Table. Die Shared Library wird an eine fixe Adresse geladen, wie in den Metadaten steht und ein Prozess springt einfach dorthin, wenn er irgendeine Funktion braucht. Das ist ein normales Cis-5 Calling-Convention. Das heißt, man kann das einfach mit den normalen Tools sich anschauen. Das ist kein komisches Register-Augument gedöhnt, sondern das kann man einfach tun. Es gibt zwei Shared Libraries. Es gibt die System Library. Da hat man Zugriff zu. Das kann man sich alles anschauen. Was macht diese Funktion? Was liest es hier? Aber dann gibt es hier auch noch so eine andere große Bibliothek, die im Raum drin ist. Dort sind ein paar Sachen drin, die nicht direkt mit dem Kernel interagieren und so weiter. Die leben alle im Raum und das ist ungefähr, wo ich letztes Jahr war und da konnte ich letztes Jahr nicht sagen, was ist diese Funktion, die ausgeführt wird oder was mache ich? Das ging irgendwie alles nicht. Aber es gab da so ein frues Development Build und das heißt, das war sehr praktisch, weil dort viele Dinge konstant bleiben. Das heißt, egal, ob ich jetzt Server Laptop oder so weiter, Adressen hatten, die funktionierten auch auf der anderen System. Das heißt, wir hatten hier diesen Jump Table und die Adressen bleiben ja fix. Später auf meiner Präsentation gibt es ein Slide mit den meisten Funktionen. Das heißt, ihr müsst diese Arbeit nicht wiederholen. Ja, wenn man sich jetzt so ein einzelnes Modul anschauen möchte, wir können es jetzt hier reinladen und wir haben jetzt das gemacht, was ich gerade schon gesagt habe. Wir haben immer noch nicht die Datenbereiche, die hier referenziert werden und wir wissen nicht, was diese Funktion tut, aber es ist jetzt nicht so wichtig. Es gibt einfach nur irgendeinen Wert zurück, denke ich, aber es ist auch ein Wert, der gar nicht richtig benutzt wird. Aber es sollte einen Sinn haben, weil es ist ja schließlich da. Also schaut man sich auf den Entry-Punkt, den Eintrittspunkt an und das Einzige, was hier wichtig ist, ist, dass an der rechten Seite des Bildschirms ist eine Liste von einem Minix-Repository, wo das schon mal disassembled, also reverse interniert wurde und es gibt einen wichtigen Unterschied, und zwar gibt es im ME-Modul ein bisschen Code, der schon vor den C-Library-Funktionen aufgeführt wird. Und diese Funktion macht alle Initialisierungen, die spezifisch für die ME sind. Da ist ein ziemlich viel Zeug, was damit gezwungen ist, wie diese Daten von der C-Bibliothek gespeichert werden, weil da sind nämlich auch Datensegmente für die C-Bibliothek, die jetzt hier zugewiesen werden vom Kernel. Also jeder Prozess hat da seinen eigenen Speichert-Punkt und da kann man dann globale Variablen drin speichern. Aber wenn wir uns diese Funktion jetzt anschauen, eine der wirklich wichtigsten Dinge, die aufrufen werden, ist diese Funktion, diese Subproteine. Und es ist ziemlich simpel, es kopiert einfach ein bisschen einen Rahmen. Also da sind keine Initialisierten Datensektionen, es ist einfach nur ein flaches Beinui, also das ist einfach nur das BSS-Segment, das was mit Nullen gefühlt ist am Ende, das arbeitsspeichert und da werden einfach das Daten reinkopiert. Ja, es ist Teil des Initialisierungs-Codes. Ja, und das ist ziemlich wichtig, weil man muss halt eben auch die, in dieser Datena, das muss man halt eben auch den letzten Teil des Beinuys laden andererseits, sonst würde man halt eben diese Initialisierungsfunktion überspringen und das würde zu Fehlern führen. Das ist die komplette Memory-Map, so sieht der Speicher aus. Es ist 32-Bit Adressierung und ja, man hat alles, was man versuchen würde, also es gibt auch ein Stack und alles, es gibt ein bisschen Hiebspeicher, der schon zugewiesen wurde bei der Initialisierung. Ja, so sieht es prinzipiell aus, so wenn man, wenn man das, den Adressbereich von den Metadaten ableitet. Insbesondere das Datensegment und der Stack, der an der Speicherort variiert ziemlich, weil es halt viele Feds gibt und auch natürlich die Größe der Datensegment variiert. Ja, auch für den, auch im Stack, da sind auch Metadaten drin für jeden Fett, aber ja, das sieht man, das sieht nicht der Prozess, das sieht nur der Kernel. Wenn man jetzt ein bisschen weiter geht und man schaut sich, ja, einfach einen Driver, einfach einen Treiber an, das ist jetzt hier ein Treiber, der mit der CPU spricht. Wenn ich jetzt hier CPU oder Host sage, dann meine ich die CPU, also den großen CPU Skylight, ACabulat Prozessor, der das eigentliche Betriebssystem des Computers ausführt. Also das wird dafür benutzt, um Nachrichten an die, an die Haupt-CPU zu schicken. Ja, es macht ein paar Vorbereitungen und dann ruft es eine Bibliotheksaufruf auf, dass es in der Hauptbibliothek ist und das liegt daran, dass Intel Clue gedacht hat und sie haben halt ein Framework entwickelt, um halt den Gerätetreiber einzubauen. Also Gerätetreiber sind einfach auch nur Programme, die spezifische Schnittstellen aufrufen und dann gibt es halt normale Datei, eine und Ausgabe, wie nach POSIX Standard. Also es ist zwar, ja, ganz normale Eingabe-Ausgabe-Funktionen werden implementiert. Ja, es gibt auch mehr Initialisierungen hier für die LibServer Bibliothek und so sieht so ein Treiber einfach im Wesentlichen aus. Und dann gibt es diesen Eintrag. Ja, das ist niediger Speicher, der eigentlich, wer nicht benutzt wird, die verwenden eigentlich nicht Standard IO oder Print F oder so für SD-Bugging, also es gibt halt wenig Speicher und das hat sehr primitiv. Deshalb verwenden sie einen Feature, das nennt sich Sven. Das sind die APIs, die man schon kennt. Das hat sogar POSIX Threads oder zumindest ein Teil davon. Ja, also eigentlich alle Funktionen, die man auf einer normalen Unix-Maschine erwarten würde, also da sollte man sie jetzt nicht so viel zu tun haben, aber dann gibt es halt eben diese Tracing Bibliothek. Sven so nennt Intel, die in allen Entwickler-Tools, die man von der Intel-Seite her unterladen kann, im Prinzip. Ja, sie haben keine Formel-Strings oder so, sondern einfach nur eine Message-Identifier, eine Nachricht-Identifier und danach wird dann eben die Nachricht formatiert nach einer Bibliothek, die man nicht hat, weil Intel die für sich behält. Also die normale Version von den Intel-Entwickler-Werkzeugen hat so ungefähr 50 von den verbreitetsten Statusnachrichten als die Formatanweisung für, aber ja, also wenn man sich diese Funktion anschaut und wenn man sieht, dass die einfach nur ein bisschen Debugging macht, ein bisschen Ausgabe macht, dann sollte man denken, dass die eigentlich gar keine Wichtigkeit haben, was da eigentlich genau passiert. Ja, für die Gerätedateien, die sieht man in einem Manifest, immer wenn der Körner geladen wird und steht das da drin, dass immer wenn der Was-Programm eine Schnittstelle bereitstellen möchte, dann hat die Metadatendatei so einen speziellen Eintrag und der besagt, dass man eben diese Gerätedateien hat mit einem Namen und eine Berechtigung und halt eben auch welche IDs das hat und ja und der Haus schickt es dann halt eben an die, wenn ein Virtue ist der Teilsystem und dann hat man halt eben diesen Dateizegruf über die Datei und es gibt auch eine Bibliothek, die halt eine Schnittstelle bereitstellt für die Treiber, um darauf zu zugreifen. Und die sieht so aus, es ist ziemlich simpel, wenn man jetzt ein Management Engine Entwickler wäre, würde man einfach Open und Close aufrufen und dann wie eine Nachricht kommt, dann wird man sofort benachrichtigt. Also es macht es auch ziemlich einfach, dass so wie wir was engenieren, weil man einfach sieht ja, dass der Traber der lädt ein paar Rücksprungfunktionen und dann kann man sich überlegen, was diese einzelnen Rücksprungfunktionen genau implementieren. Und dann gibt es einen der merkwürdiger oder merkwürdigeren Dinge, wie normalerweise die Programme auf ja in den Sprecher gemappte Register zugreifen. Es gibt eine Haufen Funktionen, die haben irgendwelche Argumente, die wir nicht erkennen können. Also es wird irgendwas mit einem Offset, also mit einem Abstand zu tun oder so, weil es halt mit Faktoren von zwei sich erhöht. Man denkt erst mal, es ist irgendwie ein Wert, aber das erste Bitte ist irgendwie eine Magic Number oder so. Nee, da gibt es auch nochmal einen Bereich in den Metadaten. Da steht drin, welche Bereiche für welche Dateien zur Verfügung gestellt werden können. Also sie haben eine physikalische Startadresse und eine Größe und dann halt noch ein paar Flexen. Und der Index in dieser Liste ist nicht direkt diesen magischen Wert, den wir gefunden haben, sondern da findet immer noch eine kleine Berechnung statt innerhalb der Funktion. Diese Berechnung könnte ein Bekannt vorkommen. Ja, das sind die Funktionen, die es gibt. Und ja, der Wert ist so ein Bereich, der Elektronbereich aus, weil die haben halt keine Paging-Architektur, um die Prozesse miteinander abzutrennen, sondern sie haben halt geschützte Segmenten und für jeden Speicherbereich gibt es halt so ein Segment und dann halt eben ein Selektor, der das beschreibt. Das ist halt ein bisschen komisch, weil warum sollte man auf einem modernen System, was wenigstens ähnlich ist, sowas noch benutzen. Aber ja, Intel hat es halt soweit erweitert. Normalerweise wäre der Adressbereich einfach flach. Jetzt können wir also uns memory mapped IO anschauen. Also haben wir schon gemacht. Das ist so das, das große Bild. Also es gibt Message Passing, Memory Sharing, damit das auf der langsamen CPU schnell laufen kann. Dann ja, wir können Nachrichten senden, wir können welche empfangen, wir können eine Nachricht senden und auf sie warten auf die Antwort. Das Hauptsächlich ist gleich wie in Minix. Es gibt so ein paar kleine subtile Ränderungen, die wir uns später noch anschauen werden. Dann gibt es Memory Grants, das ist etwas, was erst sehr kürzlich in Minix passiert ist. Da kann man Speicherblöcken Namen geben und das mit anderen Prozessen teilen. Da kriegt man eine ID und die kann man zusammen mit der ProzessID benutzen, um das zu adressen, weil sie prozesslokal sind. Es kann nur von einem Prozess benutzt werden. Es wird für sich selber gegeben, aber das ist nicht so besonders hilfreich. Das sind hier die Operationen, die man damit machen kann. Man kann daraus lesen, man kann rein, man kann da reinschreiben, aber halt nur über diese Funktionen. Also man kann nicht direkt aufzugreifen, das muss über den Kernel gehen. Es gibt auch noch indirekte Grants. In Minix gibt es das hier. Es ist zuerst kürzlich passiert. Das ist zum Beispiel, wenn man das High System Treiber oder Server senden möchte, dann können wir Grants weitergeben, sodass wir uns Kopien ersparen, dass dieser Grant die gleichen Rechte wie der Prozess, der es zuerst erstellt hat. Da kann man natürlich keinen Schreibgrant weitergeben, wenn man bloß einen Reed Grant hat. Dann gibt es auch ein paar sehr große Unterschiede. In Minix gibt es Dinge, wo man es zu Prozessen adressiert. Dieses IPC, aber hier gibt es auch Dateien mit Dateideskriptoren und über die kann man IPC machen. So kann man mit einem Device Treiber arbeiten, ohne zu wissen, was für eine Prozessidee er hat. Der Kernel kümmert sich da um die Magie. Dann gibt es hier einen Select, womit man den Kernel instruieren kann, dass man warten möchte, bis eine Nachricht reinkommt. Das ist eine der größten, der kompliziertesten Cyscalls, den der Minix Kernel hier bereitstellt. Das kann man größtenteils ignorieren und da kann man einfach schauen, welche Nachricht wird da empfangen und da ist es gut. Es gibt hier, man kann dem können sagen, dass es bestimmte Memory Grants nicht auswappen können, auswappen soll. Ist alles nicht so kompliziert. Ja, das ist eigentlich das Wichtigste, was das Betriebssystem der Management Engine angeht. Die Hardware ist viel komplizierter, weil, ja, den Code kann man natürlich reverse engineering und dann verstehen. Die Hardware, ja, lasst uns einfach sagen, es ist ziemlich herzhaft, sich das Reverse so wieder zurückzuentwickeln und anzuschauen, um halt irgendwie die Treiber zu verstehen. Also, wenn man den Treibercode hat, aber man versteht nicht, was es gestern tut, dann versteht man noch nicht, was ein Großteil der Programmlogik tut. Wir wollen natürlich verstehen, was die Logik dann da ist und was die eigentlichen Register eigentlich machen. Zuerst möchte man also, welche physikalischen Baicherbereiche gehen, wo gehören, wohin gehören, wozu. Die Metadaten, die Beispiele, die wir gerade schon gesehen haben, die hatten zwar einen Namen drin, aber die sind nicht in den Metadaten selber, sie sind nicht irgendwie beschrieben. Also, man sieht einfach nur die physikalischen Adressen und die Größen. Aber es gibt einen Modul und zwar das Bustribermodul und das Bustribermodul, ja, es ist ein normaler Benutzerprozess, einfach implementiert, ja, PCI, Konfigurierung und so und hat eine ziemlich nette Tabelle mit Namen für Geräte. Also, wenn man Strings darüber ausführen lässt, dann sieht man diese Sachen. Also, ja, ich war da ziemlich erleichtert, weil dann kann man sich wenigstens erklären, welchen Gerät in einem speziellen Programm gesprochen wird. Und der Treiber macht all diese Sachen, also Stromverwaltung, Konfigurationen, die verschiedene Zugriffe auf die Busse und Eingabeausgabe und sorgt dafür, dass der Treiber nie diese ganzen Details kennen muss, sondern der Treiber fragt einfach nur im Gerät an und der Bustriber sagt dann einfach nur, hey, hier ist jetzt ein physikalisches Adressbereich, den man auch beschreiben kann und so. Also, es ist halt eine Abstraktions-Ebene. Und es erteilt ziemlich viel Information, weil ein ziemlich alter Bild für die Sunrise-Party-Einsteck-Cure hatte ziemlich viele Debaktausgaben in diesen, auch wenn diese Format Strings halt fehlen, da war ziemlich viel Information in der Bühne drin und das sagt einem ziemlich viel. Und dann gab es auch diese Tabelle, die halt die tatsächlich Informationen über die Geräte und der Namen enthält. Also, da habe ich da ein paar bisschen Dokumentationen daraus erzeugt, dass ich sie selber auch benutzt habe. Das ist diese Tabelle zum Beispiel, zumindest ein Teil davon, das zeigt einem, welcher Adresse der PCI-Konfiguration speicherbereichlich, den Bust, welche Chipset sicherheitslich Linien da sind basierend auf den Flex und sagt dann auch den Namen und ja, auch die Startadresse, um zum Beispiel in die Register vom PCI-Gerät zu schreiben und so. Und der Management Engine hat ziemlich viel Zugang, ziemlich vieles, es ist zwar irgendwie ein bisschen geschützt, ziemlich, also für die ME speziell, aber es gibt auch viel Zugang auf andere Bereiche des Computers und ja, es gibt nicht viel Information darüber, dass es im Prinzip alles, was man da finden könnte. Da sind zum Beispiel auch Slides von anderen Konferenzen, wo auch schon Foto dabei gehabt würden, da ich jetzt keine Zeit den Links reinzukupieren, aber die kann man sehr schnell googeln. Ich habe einen Emulator geschrieben für die Management Engine, also zumindest ein teilweise Emulator, der halt im E-Code ausführen und analysieren kann und der muss natürlich ein bisschen Hardware-Informer-Interninformation kennen und deshalb, da gibt es ein paar Dateien im Intel, die Backer-Paket, die spezielle Version davon haben sehr detaillierte Informationen über die Hardware von den Geräten, aber natürlich auch nicht alle und ich habe ein Tool geschrieben, was ein paar von den Dateien analysiert. Ich werde es nur veröffentlichen, damit Leute sehen, was ich so getan habe, aber es funktioniert nicht einfach so, es ist ziemlich schöner Code und ja, es gibt auch ein anderes Tool von zwei anderen Typen, ich weiß nicht, ob man die Namen ausspricht, Goriatchi und Emuloff, die haben aber auch da was zu programmieren und das ist ziemlich nützlich und dann gibt es noch, es gibt noch die zweiten ME in Server-Engines, das ist quasi die zweite ME, die einfach nur dafür da ist, dass der Hersteller keinen Coach reinschreiben kann und es wird ein Innovation-Engine bezeichnet und es hat noch mehr Debugausgaben, aber auch jetzt nicht super viele, aber im Prinzip vor allen Dingen eine Tabelle, die Registernamen enthält, aber die sind auch wieder sehr stark verkürzt und so, also ja, es gibt wenig, wenig Dokumentationen, aber für das Pentium N & J Serien Datenblätter, da findet man ziemlich viel Information und sie haben ziemlich viel Daten aggert, die nicht in das Handbuch gepasst hat, die ungefähr 20 Tabellen, die eigentlich gar nicht da drin sein sollten, ja, zum Beispiel hier gibt es zum Beispiel ein Diagramm von dem Vortag, den ich gerade erwähnt habe, hier gibt es mal eine Übersicht über die ganzen Busse, das ist sehr, nicht sehr präzise, da habe ich mir die andere Dokumentation angeschaut, um es besser zu verstehen, das oben links verbindet sich zu echten CPU, da gibt es noch ein paar mehr Blöcke, die Busbrücken sind für PCI Express oder ähnliches. Hier ist eine Menge los, das hervorgehobene ist das, dem Speichermemory Space von der Management Engine, die Dinge, die in Grün hervorgehoben sind, das ist ein bisschen komisch, es sieht so aus, als es hier zwei PCI hier hin gibt. Ja, und die haben im Prinzip zwei Routen für die Konfigurationsbereiche, da ist immer eine Busnummer drin, zwei komplett verschiedene Dinge, jeder von denen hat einen eigenen Nullpunkt im Bus, also das ist auch ziemlich komisch, weil es macht einfach keinen Sinn, wenn man sich anschaut, wie die hardware entwickelt ist. Also das ist Teil der auf dem primären PCI Konfigurationsbereich ist, der wird über die Nord-Nord-Bridge von der MME-Prozesse abgerufen und ja, heutzutage wird es ja nicht mehr Nord-Bridge genannt, weil es kein eigener Chip mehr ist, aber man kann den Namen noch weiter verwenden und es ist im Prinzip einfach eine Nord-Bridge und das ist eine Einheit, die darauf liegt und es gibt Zeug, dass da die Nord-Bridge angesprochen ist, z.B. der ROM und der RAM. Der Prozesse selbst ist von 486 abgeleitet, aber es gibt noch mehr, was Sie können, das kann man auch in der CPU-ID sehen, es ist die Core, der für den es öffentliche Dokumentation gibt, was ziemlich gut ist, d.h. wir wissen, wie man damit mit JTAG rangehen kann oder so, es gibt quasi nur für die Quark CPU, die hier drin ist. Das ist sehr hilfreich. Es hat sogar einen offiziellen Port für den Open-OSCD-Debagger, das habe ich aber nicht gemacht, weil es da Probleme mit den Spannungsleveln gab. Es hat auch eine tolle Instruktionsleiterweitung, es gibt streckere Paging-Modes, es gibt Interrupts, aber die werden nicht benutzt. Es gibt da ein Logik-Analyser, mit dem man sich die Signale anschauen kann und damit kann man sich die Signale anschauen, das ist ganz hilfreich. Das Interrupt-System wird nicht benutzt, es gibt nur nachrichtmasierte Interrupts und dann gibt es die Northbridge, die ist teilweise dokumentiert in dem Data-Sheet, was ich vorhin erwähnt habe. Es funktioniert, es unterstützt den IOSpace, aber das wird nicht benutzt, es wird alles nur als Speicher verwendet, der Adressraum. Es hat eine IOMMU für Transaktionen, die vom Rest des Systems kommen und in der Firmware, die ich hier angeschaut habe, ist einfach das Umgedrehte vom Page-Table, das dann für DMA. Es hat PCI-Konfigurationsraum-Zugriff, es hat eine Firewall, die der Betriebssystem erlaubt, IP-Blocks verhindern können, dass sie ein Erfolg zurück senden können. Also hier haben sie es tatsächlich mal über Sicherheit nachgelacht, das ist ziemlich gut. Dann gibt es hier den wichtigsten Block auf der CPU, ist die Krypto-Engine, es kann so ein paar bekannte kryptografische Algorithmen machen, IS, CHAR und es hat einen sicheren Schlüssel, darüber hat Intel nämlich schon ziemlich viel darüber erzählt, auf der Black Hat in ihrem Talk, all diese Systeme haben DMA, Direct Memory Access, das wird auch benutzt, um direkt von Speicher zu Speicher zu kopieren, das wird in vielen Dingen benutzt, das ist ein Diagramm, wo ich den Vector Dateien nicht mehr habe, deswegen ist da auch der Hintergrund von LibreOffice drin, tut mir leid, das ist das, wie das aussieht, wenn man sich den Signal Baum anschaut, über den ich vorher geredet habe, die all diese Sachen in dem IS-Block können direkt auf Speicher zu greifen, das heißt, sie brauchen dafür keine Kopien, wenn man die Target Adresse auf Null setzt, dann wird es einfach kopieren, so wird dann die Krypto-Speicher zu Gürfel beschleunigt, hier haben wir, es gibt, dann gibt es noch einen zweiten PCI-Bus, das ist der PCI-Fix-Bus, so wie in manchen Sachen genannt wird, ich bin mir nicht sicher, ob es tatsächlich ein PCI-Bus ist, aber so fällt es sich, es hat privaten DMA Zeug, es hat die Implementation der sicheren Enklave, es hat das Gen-Gerät, was Bus während des Boot-N-Spin-Uns hat und eigentlich nur vom Boot-Rum benutzt, dann gibt es die Fuses, die man auslesen kann, die von Intel gesetzt worden sind, die kann man so auslesen, es gibt den IPC-Block, womit man mit den Sensoren reden kann, für Power Management und so weiter, also Inter-Processor-Kommunikation, nicht Inter-Processor-Kommunikation, dann gibt es das Controller-Interface, womit es der Host-CPU mitteilen kann, dass es kommuniziert und dann gibt es noch ein paar Statusregister, da kann die Management-Engine reinschreiben und der Host kann dann lesen, wenn sie crashed oder so, da kann man auch schauen, ob die Management-Engine, wie der Bootstatus ist davon und so weiter, da gibt es auch ein bisschen Core Boot Code, der das auslesen kann, das habe ich auch auf dem Imulator implementiert, weil es ganz interessant ist zu schauen, was diese ... Ja, dann gibt es hier diese primäre Adress-Übersetzungstabelle und das ist das, was mir ermöglicht, überhaupt erst diese BCI Express-Schnittstelle vom Computer überhaupt zu zugreifen und man möchte halt die Tabelle MIPerriffles abrufen, das sind halt Sachen, die außerhalb der Domain von der Management-Engine sind, die werden dazu verwendet, um, ja, oder diese Tabelle darauf zuzugreifen und so dort die UMA verwendet, was halt einfach ein Aria in Bereich von Hausvariablen ist, was einfach nur als Airway-Dean für die Management-Engine und da sind auch noch ein paar Fenster, die es der Management-Engine im Mutlichen, ja, einfach einen zuverlägenden oder anderen Bereich abzurufen von Haus, weil die Speicher-Bereiche im Haus, da können wir einfach irgendwo hinzeigen und dann einfach hier einen beliebigen Wert zu schließen oder zu schreiben und jeden oder jedem beliebigen Wert in so einem Linux, was da läuft, gespeichert hat, das finde ich ganz ziemlich gruselig. Und dann gibt es hier noch den Rest der Geräte, ja, das ist halt eine Menge Zeug, das ist fürs Debuggen all die normalen Peripheriegeräte, die so ein PC hat, aber halt auch Sachen wie die Strom-Fahr-Energie-Verwaltung und so, die halt zum Beispiel einzelne Teile des Computersteuers, die auch die Zeitgeber absteuert und auch im Rücksetzpunkt und so. Und es gibt ein Konzept, wo man bei Staubhaut, wenn man Intel-Betriebsanleitung liest oder generell Management-Engine zuhenden Zeug, und zwar so das Root-Spaces, also Root-Bereiche. Es gibt halt für das PC-Gerät auch noch eine Rootspace-Nummer und das ist quasi ein einziges PC-Gerät, das ist quasi zwei getrennte Adress-Bereiche. Und manchmal ist halt irgendwie auf beiden Sachen die gleichen Informationen, manche sind aber auch komplett verschieden. Also das ist eine Sache, mit der man normalerweise normalerweise nichts zu tun hat. Und dann gibt es noch dieses Side-Band-Fabric, also abgesehen davon von den ganzen Sachen, die ich bisher schon gesagt habe, diese ganzen PC-ähnlichen Dinge, dann ist da noch was komplett anderes, und zwar dieses Side-Band-Fabric, was ein paketbasiertes Netzwerk ist, wo mal nicht irgendwie Speicher-Bereiche oder sowas wurden, sondern es hat alles eine Ein-Byte-Adress für das Gerät. Und dann sieht man einfach einfach in einem Nachricht, wo steht, hey ich möchte jetzt die Konfiguration starten, da speicherlesen, und da gibt es ziemlich viel Infos drüber bei Intel, haben scheinbar die ganze, ich gebe es ja die Spezifikationen per Copy und Paste übernommen und so. Das ist wie man das jetzt adressieren kann, das sind all die Geräte, das sind ziemlich viele. Ja, wenn man ein Körner Entwickler ist, dann wünsche man mit GPIOs, also mit Eingabeausgabe Pins zu tun hatte oder mit Intel, Sockets, dann gibt es dieses USB-Gerät, was einmal möglich zu sehen, welche Daten von zugegriffen werden. Da gibt es viele, viele Dokumentations-Aber, die sind alle ziemlich schlecht und das wurde also ziemlich alle ausgestattet, über Stattungsanalyse gelöst und ja, und damit herum zu spielen mit der Mönche mit Engine und es gibt diesen Vortrag von Ermilov und Gurgirachi, der halt sagt, ja man kann im Prinzip, sie haben oder einen Exploit gefunden und die Sicherzlücke gefunden, die haben ja möglich, Code auf der Mönche auszuführen, also sogar J-Tag zu bekommen. Klingt ja erstmal schön, ist aber gar nicht so leicht, weil Code Execution also Fremdcode auszuführen ziemlich schwierig zu erlangen ist. Ja, sie haben jetzt nicht alles beschrieben, um das wirklich nachzubauen, aber wenn man das nachbauen möchte, dann wäre genau das, was man herausfinden müsste. Also man möchte herausfinden, wo das Deck liegt, man muss überlegen, wo jetzt, also man muss halt die Nachricht konfigurieren, die man bekommt, wie man das abruft und so und das halt dann irgendwie auch in den Schreibzugriff umwandelt. Man muss halt herausfinden, welchen Rückerrückspunkten man hat und welche Adressen dazu gekommen und man muss halt eben auch ROP-Einträge herausfinden, weil der Deck ja nicht ausführbar ist. Dann, wenn man das geschafft hat, dann kann man die Backzugriff aktivieren und eine beliebige Firma herunterladen. Ich hatte Probleme, das laufen zu lassen, es dauert ein bisschen, das laufen zu lassen und wenn die Management Engine da nicht funktioniert, das heißt, man kann das nicht so richtig gut entwickeln. Ein paar Leute haben es geschafft, das respektiere ich, das ist wirklich, wirklich schwer. Dann habe ich das geschrieben, M.E. Loader. Am Anfang habe ich das geschrieben, weil ich dachte, das mache ich so wie in Wine, aber weil M.E. ist ein Michael Crown, das heißt, Dinge greifen alle auf Hardware Adressen zu und das heißt, ich muss das ein bisschen anders machen. Ich habe Features ins Gefügt, mit dem es zu echter Hardware reden kann. Ich kann das als ein Debugger benutzen, ich benutze einfach GDB um das zu debaggen. Dann habe ich in April das hinbekommen, dass es bis zum Bootstrappen, dass mit dem Bootstrappen funktioniert bis zur Verwundbarkeit, dann habe ich den Exploit entwickelt, dann hatte ich ein Fehler gemacht und habe mein Home Verzeichnis gelöscht, weil ich Chainshoots aufgrammt hatte, hatte ich noch nicht auf GitHub gepusht, das heißt, es war dann plötzlich weg. Und jemand anders hat es geschafft, den Exploit zu replizieren. Die haben was Ähnliches gemacht für Apollo Chipsets, die ein bisschen anders sind als Intel Management Engine. Da war ich ein bisschen enttäuscht, ehrlich gesagt, weil ich nicht mehr der erste war, der das repliziert hatte. Dann habe ich das, mein Loader weiter wieder dorthin entwickelt, wo er das hinbekommen hat, den Bootstrapport zu dessen und dann habe ich auf den Exploit wieder hinbekommen. Dann habe ich das am Hacker Space ausprobiert und ich habe mir gedacht, das funktioniert auch niemals und dann hat es funktioniert. Das habe ich immer noch mit mir rum, da ich immer noch mit mir rum träge, weil man es braucht, um die Burger zu starten. Nur auf den Apollo Chipsets kann man das für die Management Engine benutzen. Dann braucht man dieses Ding hier. Es gibt noch einen zweiten Kanal. Es ist zwar ein USB-Stecker, aber es ist nun ein ganz anderes Protokoll dafür. Ich denke nicht, dass man das eigentlich kaufen können sollte, aber es ist auf Mauser erschienen. Glücklicherweise kannte ich ein paar Leute, die mich das benutzen lassen haben. Das ist ziemlich teuer, aber man kann es kaufen. Das ist der Link. Ich bin ein bisschen spät dran, aber ich möchte auch noch... Die Management Engine macht wichtige Dinge, um den Computer zu booten. Das heißt, wenn man das kaputt macht, braucht man es trotzdem, um den Computer zu booten. Die Management Engine hat so einen typischen Mikro-Kanal-Problem. Das ist wie der normale Boot-Prozess eines Computers aussieht und das ist, wenn man Boot-Guard verwendet, da ist ein bisschen Kotischen ausgeführt, bevor der Reset-Vector erreicht wird. Das wird von der Management Engine ausgeführt und das passiert da in Detail. Die ME lädt den neue Firma für den Strom, für die Energieverwaltung und sagt, der Energieverwaltung dann bitte auf, den CPU Reset-Pin zu verbinden und dann wird den CPU starten. Der Power-Manager-Controller ist abgeseitet von der 880-150-Architektur, führt immer noch ein Betriebssystem aus den 90ern ab und das ist der einzige Stream, den man ein Bein-Way findet, wenn man danach sucht, der da zitiert ist. Abhängig von den Chips ist es entweder mit einem Patch oder mit einem kompleten Bein-Way von der Management Engine geladen. Macht ziemlich viele Sachen, also nicht nur macht auch die PCI-Schnittstelle, die Management Engine macht genau diese Dinge, muss halt die Schlüsse lösen, laden für den BootGuard-Post, die Zeitgeiber einrichten, muss die CPU mit Strom versorgen, muss halt eben auch PCI Express Zugänge konfigurieren und muss halt dann eben dafür sorgen, dass die CPU aus dem Rohrzustand kommt. Da ist halt ziemlich viel Code, der damit zu tun hatte und ich wollte das jetzt nicht alles staatisch machen. Also habe ich Hardware zugeführt, den Emulator gemacht und dann habe ich mein Laptop tatsächlich so gestartet. Ich habe einfach ein Video davon gemacht, aber da fehlt mir jetzt die Zeit zu. Also ich habe einen Prozess von Management Engine, auf dem mein Meinungssystem läuft, der sendet alle möglichen Befehle an den Debugger und der hat einen tatsächlichen Management Engine-Chip, ja, Verwendet, der angehalten wurde, um die Registerzugrüfe zu machen und ja, es funktioniert. Und so konnte ich mein PC auch tatsächlich zuverlässig starten. Und die BootGuard-Konfiguration ist ziemlich lustig, weil sie sagen, also sie laden halt die Schlüsse rein und die Management Engine lädt sie aus den Fuses und lädt sie speichert sie dann in Register, aber wenn man dann halt eben Zugriff auf die Registerzugrüfe hat, dann kann man natürlich auch trotzdem sowas wie Coreboot ausführen, selbst auf der Maschine auf der BootGuard leuchtet. Das sind die Register, die die Sicherheitsmodule, die die CPU sicherstellt für die Firma, die das definieren. Und ich werde den Code auch veröffentlichen, nach meinem Vortrag, das ist Teil von Python Scripts, die ich verbindet habe in meinen Debuggern, um den Debugger zu starten, ohne DNE viel mitzuhaben. Und ich habe halt die Schritte zurückverfolgt und das Python Script geworden, der es ermöglicht, den PC zu starten, ohne Inter-Management-Code zu starten. Wenn man das in den ROP beinahe umwandelt, dann kann man den Computer starten, ohne die Management Engine überhaupt zu verwenden. Also, solange man das Betriebssystem davon ausführt. Ja, eine noch. Meine Ziele, ich möchte das nur kurz noch sagen, das ist mir ziemlich wichtig, weil wenn man auf Ring Zero kommt durch diese ROP-Kette, dann könnte man seinen eigenen Kernel auf der Management Engine all. Und dann könnte man einen eigenen Firmen auswählen, zumindest ab der Verwundbarkeit. Man könnte auch modifizierter Chip bauen, der das Debugger-Interface von der Firma verwendet. Und da muss noch ziemlich viel erforscht werden, aber ich werde hier beim Open-Source-Firmware-Villager umhängen, zumindest ein Teil der Woche. Ja, aber ich möchte da echt anfangen und einen Open-Sourcen-Management-Engine-Firmware programmieren. Ja, und es sind viele Menschen, die mir geholfen haben und die mir wirklich die Rolle gespielt haben, dass ich an diesen Punkt gekommen bin. Ich möchte vor allen Dingen auch den Leuten von meinem Hackerspace danken. Noobwaffel, ja, er hat mir sein Laptop ausgeliehen, um die Demo vorzubereiten, die ich jetzt gar nicht zeigen konnte, aber, ja. Ich wollte fragen, ob es Fragen gibt, aber ich befürchte, es sind gar keine Zeit mehr für Fragen da. Ja, tut mir leid, wir haben leider wirklich keine Zeit mehr für Fragen. Ja, ich werde hier rumhängen. Das war die Übersetzung von Lukaro und Eipfen. Wenn ihr Feedback habt, meldet euch unter c3t auf Twitter oder Mastedon. Your talk will inspire many people to keep looking into how the management engine works and hopefully uncover even more stuff. I think we have time for just one single question. I don't know, do we have one from the internet? Thank you so much. Okay, first off I have to tell you, your shot is nice. Chad wanted me to say this. And they asked how reliable this export is and does it work on every boot. Right, yeah, that's actually something really important that I forgot to mention. So, they patched the vulnerability, but they didn't provide downgrade protection. If you can flash a vulnerable image with an exploit in it, it'll just boot every time on these chipsets. So six, seven generation chipsets put in that image and it will reliably turn on the debugger every time you turn on the computer. Thank you so much for the question. And Peter Busch, thank you so much. Please give him a great round of applause.