 Übersetzung, eure Übersetzer sind Zebalis und Wolpertum. Memory-Speicher-Deduplizierung wird oft angewendet, um Speicherverbrauch zu reduzieren. Und wir sehen heute drei Angreifsmöglichkeiten, Techniken, die diese natürlich ausnutzen. Wir haben zwei unglaubliche Sicherheitsforscher bei uns, die uns zeigen werden, wie solche Angriffe funktionieren. Und zu meiner Linken Antonio Barresi und zu meiner Gerechtin. Antonio und Erik Bossmann, die sich selbst vorstellen werden, werden bittegibt ihnen ein herzliches Willkommen. Guten Morgen. Also, Speicher-Deduplizierung, der Fluch, der uns immer neue Geschenke gibt. Leider nur Erik und mich, weil andern beiden nicht dabei sein konnten. Sie sagen, hallo und ich will nur sagen, dass auch Sie hier den Verdienst haben für das, was wir zeigen werden. Erik, wie vorgestellt, ist ein Doktorant in Fusec, in Amsterdam, die Netzwerkssicherheitsgruppe. Und ich bin Antonio, Mitgründer von ExorLab, eine Hoch-Sicherheitsfirma in Zürich in der Schweiz. Und die Arbeit, die wir vorstellen, es gibt eben viele andere Leute, die daran auch noch gearbeitet haben. Und hier also eine Gedanken-Sagungen fangen wir an. Die Mitteilung heute ist ziemlich einfach und geradeaus. Memory-Deduplizierung, Speicher-Deduplizierung ist sehr viel gefährlicher, als ihr vielleicht anfänglich denkt. Es zeigt sich zunächst als ein schönes kleines Feature, mit dem wir Speicher einsparen könnt. Aber wir werden euch zeigen, dass es tatsächlich gefährlich ist und sehr viel schwerwiegender. Und wir werden das tun, indem wir euch zeigen, wie drei Angriffstechniken funktionieren, die alle die Speicher-Deduplizierung in der einen oder anderen Weise ausnutzen. Bevor wir das tun, zeigen wir uns zunächst einmal Speicher-Deduplizierung als solches an. Wir zeigen euch Seitenkanäle, die dadurch entstehen. Und wir zeigen dann die drei Angriffe. Zunächst haben wir Cane, ein Leak zwischen virtuellen Maschinen. Das haben wir an ASLR, also an den Speicher-Verlagerung angewendet. Dann zeigen wir DEDUP-EST-MAKINA, ein Angriff gegen einen Prozess. Und der hat tatsächlich den Pony Award bekommen für die innovativste Forschung beim Black Hat. Und der erlaubt es euch, Patch-Averscript in Edge zu lesen und zu speichern. Ohne irgendeine Verwundbarkeit der eigentlichen Software. Und dann zeigen wir Flip Feng Shui, ein Angriff über virtuelle Maschinen hinweg. Ein Bitflip-Angriff, falls ihr also ein Bit in einer anderen virtuellen Maschine flippen könntet, stelle ich das mal vor. Und dafür braucht ihr nur das Wissen über den Inhalt einer Seite. Und das kann man dann tun. Das zeigen wir euch zunächst einmal, wie man genau ein Bit präzise flippen kann und wie man das System dadurch dann verwundbar machen kann. Danach haben wir dann eine Zusammenfassung. Fangen wir also an mit Speicher-Detokizierung. Das ist eine Methode, um den Speicherverbrauch zu reduzieren und wird sehr viel in virtuellisierungsumgebungen benutzt, aber nicht nur dort. Und sie war auch, muss man sagen, war ermöglicht in, offen in Windows 8 und 10. In virtuellisierungsumgebungen will der Launcher für die virtuelle Maschine gerne Speicher einsparen. Also wir machen einen Overcommit für Ressources wie Speicher und reduzieren es dann auf kluge Weise. Oder das Ziel, um es ganz einfach auszudrücken, ist, mehrere VMs auszuführen. Also schönes Feature. Wir können jetzt noch viel mehr VMs verkaufen. Geld, Geld, Geld. Aber es hat eben Implicationen. Fangen wir uns also an, schauen wir uns an, wie das funktioniert. Dies hier sind eben Speicher-Seiten von zwei virtuellen Maschinen und die physikalische, der physikalische Speicher. Und stellen wir uns vor, wir haben ein Bild der Mona Lisa oder den selben Prozess, den selben Code-Pages oder irgendetwas in dieser Art. In einem normalen Szenario haben wir das in beiden Adress-Räumen und haben wir nun also diese Speicher-Einhalte und eine ganze Seite wird gebraucht. Und wenn die Deplizierung aktiviert ist, wird die Deplizierungsroutine versuchen, die gleichartigen Seiten zu identifizieren und sie zu vereinen. Und dann markieren wir diese Seiten mit einer Copy-on-Write-Semantik. Wenn also irgendjemand von den beiden dann einen Schreibtzug macht, dann funktioniert das nicht mehr und dann muss kopiert werden. Die Deplizierung ist Kernos-Same-Page-Merging. Viele von euch kennen das wahrscheinlich. Wenn ihr also ein Ubuntu-Server und ein Ubuntu-System habt, ist das, ich glaube, immer noch per Default aktiviert und ihr könnt das überprüfen. Es gibt also ein File. Und wenn hier eine einzelne bestimmte Stelle steht, ist das aktiviert und dann gibt es Parameter, mit dem man definieren kann, wie schnell die Speicher-Deplizierung läuft. Und es gibt andere Implementierungen auch. Also das Problem mit Speicher-Deplizierung in den meisten Implementierungen ist, dass die Sicherheitsdomains nicht respektiert werden. Also auch zwischen verschiedenen WMs oder für Prozesse, wenn es verschiedene Prozesse sind, kann man sich nicht gegenseitig vertrauen. Aber der Mechanismus arbeitet trotzdem über die Grenzen hinweg und das ist das Dilemma der Speicher-Deplizierung. Denn letztendlich, wenn man Speicher sparen, das gibt eine Menge Sinn, wenn man viele VMs haben im gleichen OS, in welchem Betriebssystem, dann ist es sinnvoll, diese Grenzen zu beschreiten. Aber das Problem ist, dass wir da durch einen Seitenkanal einführen. Schauen wir uns also diesen Seitenkanal an. Wenn wir eine Seite haben, die euch gehört, dann könnt ihr darauf schreiben und die gehört euch und das ist okay. Das Problem nun, wenn man Deplizierung hat, hat man Copy on Write. Wenn man also jetzt einen Streitvergang auf eine deplizierte Seite ausführt, muss man den Kernel kaufen. Die Seite muss wieder depliziert werden. Die Seiten-Pagetabel muss in Gespräche geschrieben werden und dann erst kann man den Streitvergang ausführen, den man eigentlich wollte. Also es gibt sehr viel mehr Schritte, die ausgeführt werden müssen und dies führt einen Ein-Bit-Seiten-Kanal an, der es euch zu sehen erlaubt, ob eine solche Seite existiert, mehr oder weniger. Es arbeitet über VM-Grenzen hinweg, wenn es für VMs implementiert ist oder wie wir sehen werden, in einem Angriff haben wir auch innerhalb eines Prozesses verschiedenes Hierheitsgrenzen. Denkt euch an JavaScript Code. Es könnte also für JavaScript ein Code im Browser interessant sein, verschiedene Dinge herauszufinden. Schauen wir uns also die Angreiferperspektive an. Was muss eine Angreifer, eine Angreiferin tun? Also wir haben hier den Speicher des Angreifers, der Angreiferin und des Opfers. Wir haben also eine geheime Seite und zu wissen, dass diese Seite existiert, kann dem Angriff schon helfen, in der einen oder anderen Weise. Was also für den Angriff getan werden muss, ist eine Seite raten, also wirklich den Inhalt der Seite erraten. Dann muss für den Angriff gewartet werden für eine Zeit. Diese Seite erzeugen und für eine Weile warten und dann schreiben auf diese Seite. Dafür braucht man keine besondere Privilegien. Dann muss man die Zeit messen und überlegen, ob die Schreibzeit über eine bestimmten Grenze ist. Und wenn ja, kann der Angreifer die Angreiferin schließen, dass in der anderen VM z.B. auch so eine Seite existiert. Und wenn man eine bestimmte Zeit nicht erreicht für die Dauer des Schreibzugriffs, dann existiert diese Seite wohl nicht. Also schauen wir uns den ersten Angriff einmal an. Kein auf Deutsch. Also Cross VM, Address Spayout, Layout, Introspection. Ein langer Name, tut mir leid, ich bedauere das bereits. Also der hängt wirklich ab von Determination und benutzt dies um ASLR, also die zufällige Zuweisung von Codeblöcken zu brechen. Man kann herausfinden, ob die Basisadresse eine bestimmte ist in einer anderen VM. Also schauen wir uns noch einmal an, was brauchen wir für eine geheime Seite, die interessante Informationen enthalten kann, z.B. die ASLR-Base-Adresse eines bestimmten Speicherbereichs. Also welche Seite wird benutzt? Und dann gibt es einige praktische Herausforderungen, wie lang soll man wirklich warten. Man hat keine Ahnung, wie schnell die Speicherdetermizierung braucht, um wirklich wirksam zu werden. Und dann muss man wirklich verlässlich herausfinden, dass die Seiten gemirkt wurden. Es gibt natürlich auch Rauschen, manchmal ist die Schreibzeit höher, nicht wegen der Speicherdetermizierung, sondern aus anderen Gründen. Wir haben uns mögliche Seiten angeschaut, die eigentlich sein könnten für einen Einbruch für einen Angriff auf ASLR. Wir müssen als Angreifer wissen, dass die eine Seite existiert in der VM. Es sollte eine Schreibgeschütze-Seite sein, idealerweise, denn wenn sie zu oft geändert wird, wird sie auch nicht dedipliziert. Und sie muss auch eben auf die Seitengrenzen ausgerichtet sein. Man muss auch den Inhalt kennen. Und wenn man das dann brechen will, brauchen wir im idealen Fall eine Seite, die eine Basisadresse enthält. Also der grüne Bereich ist also völlig vorherseitbar. Und das Einzige, was wir nicht wissen, ist die Basisadresse im gelben Bereich. Oder in anderen Situationen, an anderen möglichen Seiten könnte eine sein, die verschiedene Werte enthält, die von einer Basisadresse abgeleitet sind, also von dem Geheimnis, für das wir uns interessieren. Das andere, was wir wissen, ist, wie sind die Offsets der geheimen Abschnitte in der Seite? Wir schauten uns also, wir suchten nach bestimmten Seiten. Sicherlich gibt es viele mehr. Aber zum Glück, als wir uns danach gesucht haben, die erste Seite jedes ausführbaren P-Images im Speicher, da bekamen wir schon einen Treffer. Also wenn wir das Format anschauen, hier sehen wir, wie das aussieht. Also ein image-basiertes Feld, das aktualisiert wird mit der Runtime-Basisadresse im Speicher. Und das ist genau das, was wir brauchen. Wir können alle anderen Beids verhör sagen, bis auf die Basisadresse, die 19-Bit-Entropie einführt. Und es gibt natürlich andere Seiten, die solche Kriterien erfüllen. Aber warum sollten wir weitersuchen, wenn wir bereits einen interessanten Fall haben? Also, benutzen wir diese Seite. Das Problem ist jetzt, wir haben diese Seite im Wesentlichen jetzt die Speichertitelbeziehung und Fragen über den Seitenkanal, ob diese Seite existiert oder nicht. Aber wir müssen immer noch die Basisadresse erraten. Wir haben also 19-Bit-Entropie. 19-Bit-Entropie in ein 64-Windows-System werden für die Basisadresse benutzt. Und wir brauchen also, wenn wir also eine Seite pro Rateversuch brauchen, haben wir etwa 500.000 Versuche. Das braucht sehr viel Zeit. Oder wir können natürlich Blutforce versuchen, also sehr viel mehr Speicher nutzen, allen Speicher, den der Angreifer der Angreiferin hat. Also, wenn wir sehr viel Speicher haben, was wir in verschiedenen VMs haben, mit entsprechend viel Speicher, können wir einfach den gesamten Speicher mit den allen, allen Ratsmöglichkeiten auffüllen. Ein Fall von 19-Bit-Entropie und einer Seite pro Rateversuch sind das 2-Gigabyte, was tatsächlich noch okay ist. Was wir also tun, ist, wir haben all diese Seiten und dann weisen wir zu und versuchen dann herauszufinden, ob sie detortiziert sind, also ein einfacher Blutforce-Angriff. Die andere Herausforderung ist, wie lange sollten wir warten auf die Detortizierung? Wir könnten einfach stundenlang warten natürlich und dann irgendwann wird das funktionieren. Aber das hängt ab. Wir wollen ein bisschen besser sein. Es hängt von der Implementierung der Speicher-Detortizierung ab. Ab wie schnell die ist, es gibt verschiedene Parameter für KSM-Mechanismus. Je nachdem kann es also schneller oder langsamer gehen. Es hängt aber auch ab von Speicherverbrauch. Wenn wir viele VMs haben, die laufen, dann muss man letztendlich alle Seiten miteinander vergleichen in der Detortizierung und im schlimmsten Fall. Es ist so, dass deine Ratesseite im allerletzten Zeitpunkt vergleichen wird. Es gibt also hier eine Balance, die zu halten ist. Wenn man zu wenig, zu lange wartet, wird der Angriff nicht funktionieren. Wenn man zu lange wartet, dann erhält sich natürlich die Zeit für den Angriff, was wir nicht wollen. Wir haben dann diesen Erkennungs-Mechanismus implementiert, um die Zeit zu erkennen, die man warten muss, bis man relativ sicher sein kann, dass die Seite vergleichen wurde und man nennt das die Sleep-Time-Erkennung. Und als Angreifer kann man einfach eine Menge Seiten sich holen. Und dann jede Seite auf die Hälfte des Puffers, von einer Hälfte des Puffers auf den anderen Puffer kopieren. Wir erzeugen also die Situation hier in der Folie. Wir schaffen also eine Menge Opportunities-Möglichkeiten zum Zusammenführen von Speicherseiten. Viele Seiten erzeugen, die deduziert werden können. Und dann warten wir eine bestimmte Zeit, wie zehn Minuten versuchen herauszufinden, wie viele dieser Seiten dann zusammengeführt worden sind durch die Erkennungsmagie. Und wenn dann die Erkennungsrate über eine bestimmte Schwelle ist, dann sagen wir, okay, das ist jetzt die richtige Zeit. Diese Zeit spannen werden wir benutzen im Angriff. Und sonst erhöhen wir die Zeit und versuchen es nochmal. Also, letzte Herausforderung ist, wie können wir wirklich herausfinden, dass eine Seite zusammengeführt worden ist. Wir müssen auf sie schreiben und die Schreibzeit messen, nicht wahr? Also, was wir tun ist, jede Seite, wenn wir eine Ratesite haben, die zusammengeführt worden ist, dann haben wir Nachbarte Seiten, die auf keinen Fall zusammengeführt sind. Das können wir versicherstellen, indem wir einfach Zufallstieneinschreiben. Wir erzeugen also den Puffer in dieser Weise und dann schreiben wir einfach und messen dann die Zyklen und dann sehen wir eben das Signal im Seitenkanal. Wir haben ein paar Rauschen gegeben. Wir haben verschiedene Heuristiken entwickelt. Wir haben nicht sehr viel Zeit darauf verwendet, aber diejenigen, die ihr seht, funktionieren ziemlich gut. Das funktioniert für uns. Die letzte Frage dann ist, wie gehen wir mit Rauschen um? Wir haben einfach eine recht konservative Strategie angewendet. Es schadet nicht, wenn wir bestimmte Seiten haben, die falsche positive Ergebnisse bringen. Wir haben also ein System entwickelt, das versucht, das zu erkennen und dann nochmal versucht mit einem Raten, dass mehr oder weniger korrekt ist und das wird dann wieder und wieder wiederholt und letztendlich wird dann das Rauschen denselben Rateversuch nicht ständig auf die gleiche Weise beeinflussen, so dass das also funktioniert. Ich zeige euch einige Ergebnisse für eine Windows 64-Maschine, ein Angriff auf ASLR. Also, wir haben die Basisadresse einfach herausfinden wollen in einem 64-Bit-System. Wenn wir hier die Angriffsmöglichkeiten anschauen, gibt es sehr viele Möglichkeiten. Es funktioniert einfach, wenn man keine ... Also, es gibt viele Möglichkeiten für das Alignment. Wir haben aber 19-Bit-Entropie im Wesentlichen und wenn wir die Basisadresse in einem Fall haben, können wir das für Angriffe auch nutzen, weil es ... weil das nicht randomisiert wird. Wir haben das mit einer einfachen KWM, KSM-Konfiguration versucht und wir sehen hier, wenn wir eine Fall im Angreifen, dann brauchen wir etwas weniger als fünf Stunden, um für einen Angriff durchzuführen und dann hatten also einige Runden, die wir durchgeführt haben, um das von 19-Bits dann auf die eigentliche Basisadresse zu reduzieren. Wir haben auch gesehen, wie das mit verschiedenen VAMs funktioniert. Wir haben jetzt 20 Millisekunden für den Sleep-Wert gesetzt und je nachdem, wie man das setzt, braucht man einfach mehr Zeit, weil der Zeiterkennismächen uns euch sagt, dass ihr mal einfach länger warten muss. Letztendlich sieht das also so aus, wir haben nicht so viel Zeit, deswegen zeigen wir euch nur Screenshots. Wir haben eine Demo für einen anderen Angriff später. Hier haben wir die VAM des Angreifers und rechts haben wir die Opfer-VM und wir machen dann die Magie, holen uns Seiten, messen Schreibzeiten usw. und am Ende haben wir dann eben die Basisadresse für den Schutzmechanismus in der anderen VAM. Das ist es dann. Der Angriff ist tatsächlich ziemlich langsam, aber es gibt viele Geschwindigkeitsverbesserungen, die wir uns nicht mehr genau angeschaut haben. Eine Möglichkeit wäre, zufallsseiten im Zwischenraum zu haben, sodass das Rauschen nicht so stark ansetzt und ein anderes Ding ist, wir können mehr als eine Rate Seite verwenden, also mehr Redundanz einführen. Wenn wir zum Beispiel einen Code haben, der verschoben sein könnte, jeweils das gleiche Geheimnis enthält. Wir können aber nicht die selbe Seite mehrmals verwenden, weil wir dann falsche Positive bekommen können. Wir haben also Seiten mit derselben Unsicherheit mit dem gleichen Geheimnis. Cain ist, würde ich sagen, ein cooler Angriff, aber er ist immer noch sehr begrenzt. Ein Problem ist, wir haben keine Kontrolle über den Speicher des Opfers, nicht wahr? Wir müssen uns wirklich darauf verlassen, wie diese Seiten ausgerichtet sind, wie das Layout ist und was das Geheimnis tatsächlich ist. Wir haben keine Kontrolle, aber ein bisschen Kontrolle würde tatsächlich sehr viel helfen. Und wir haben, wie wir das wirklich über VM ganz nicht wegmachen können. Dann ist es natürlich ein Speicherleak, wir brauchen immer noch eine Verwundbarkeit, die wir ausnutzen, um die Basisadresse ausnutzen zu können. Das ist natürlich nicht genug, aber letztes Jahr gab es sehr viele Talks und Veröffentlichungen über Rohaner. Ich habe es selbst hier auf dem Rohanmer.js gezählt. Sie haben gesagt, dass es in JavaScript möglich ist und sagen, wir waren sehr optimistisch, dass wir mehr machen konnten. Und dann hat Microsoft Memory Deplizierung gemacht für Windows 8.1, für Zwischenprozessen, aber ist mittlerweile wieder abgescheidet. Aber sagen wir, das wäre cool, aber es hat nicht so gut funktioniert. Für den nächsten Angriff haben wir DDoB S Machina genannt. Wir gehen einen Schritt weiter. In diesem Angriff kombinieren wir Deplizierung als Site-Scanal-Angriff mit Rohanmer einem Hardware-Fehler, um Microsoft Edge anzugreifen. Das ist eine neue Browser aus JavaScript. Und wir wollen kein Software-Fehler verwenden. Wenn wir als Deplizierung nicht als Software-Angriff betrachten. Wir ziehen zwei Secrets aus. Wir benutzen Deplizierung, was zu machen. Das erste Secret ist ein Heap-Pointer, ein Ort, um Daten zu steuern. Und der zweite Secret ist ein Code-Pointer. Das wird gebraucht und zusammen um ein falsches Objekt zu erzeugen in unserem Speicher. Und dann haben wir ein Problem. Dieses falsche Objekt erlaubt uns beliebige Schreib- und Lese-Operationen auszuführen. Und JavaScript erlaubt normalerweise nicht Referenzen auf dieses falsche Objekt zu machen. Also benutzen wir Rohanmer um ein Bit zu flippen und einen Pointer zu verändern auf das falsche Objekt. Und dann können wir den Prozess übernehmen. Im Gegensatz zu Cain benutzen wir nicht nur um nach existierenden Seiten zu suchen. Wir gehen davon aus, dass wir die Daten des Opferschweichers manipulieren können auf eine bestimmte Art. Das ist nicht sehr unwahrscheinlich immer wenn ihr I.O. macht zu etwas was ihr angreifen wollt dann manipuliert ihr im Speicher in diesem Prozess und in dem Fall ist es einfach JavaScript. Es ist eigentlich einfacher. Das erlaubt uns nicht nur Secret zu suchen dies in welchen Seiten gibt die wir ausziehen können sondern auch wir können auch Seiten erzeugen die wir dann haben wollen. Das ist also sehr mächtig. Es gibt natürlich ein paar Probleme das Secret das wir liegen wollen ist ist nicht irgendwo es ist vielleicht in einer Seite die andere Informationen enthalten die wir nicht kennen sondern können wir dann keine Seite erzeugen um an dieses Secret zu kommen wir müssen also eine Methode finden um das Secret kodieren in einer Speicherseite damit wir das Secret herausziehen können diese Speicherseite die wir liegen wollen die sollte nur das Secret haben und Daten die wir kennen das könnte sein weil diese Daten weil wir die Daten geschrieben haben an diesen Ort geschrieben haben das ist aber Daten die wir einfach kennen Daten deren Inhalt wir aus irgendeinem Grund kennen es gibt ein weiteres Problem wir möchten ein Secret rausziehen das so viel Entropie hat so viel Entropie dass wir es einfach nicht mehr bootforcen können dass wir nicht all die wirklichen Secrets bootforcen können und deswegen haben wir ein paar Methoden gefunden wir machen das iterativ die erste Methode die wir versucht haben nennen wir Alignment probing Ausrichtungsversuche in diesem Fall manipulieren wir den Speicher eine Seite zu erzeugen damit wir legen das Secret über die Grenzen der einzelnen Manual pages hinweg der einzelnen Speicherseite hinweg und damit können wir dann zum Teil das Secret in einer Runde und wenn wir und dann müssen wir den Spray den Offer dazu bringen eine weitere Speicherseite zu erzeugen mit mehr von dem Secret in einer Seite und so weiter und bis dann das gesamte Secret herauskommt das zweite Primitivum was wir versucht haben wir nennen das Partial Reuse teilweise weiterverwendet der Victim hat ein Secret irgendwo wir schreiben Daten in einen Buffer der schon vorher verwendet wurde um das Secret zu verwenden wir schreiben Daten in diesen Buffer hinein und überschreiben nur einen Teil dieses Secrets damit sich die Entropy so weit niedrig so niedriger wird damit wir es wieder hinausziehen können der erste das Alignment Probing das werden wir verwenden um die Codeadresse hinauszuziehen in diesem Fall und wir benutzen Microsoft Edge den Jet Compiler jeder moderne Browser der Javascript in nativen Code umsetzt und für jeden Chunk den er umsetzt in Microsoft Edge wird der Function Epilogue der Function Register sieht immer gleich aus mit einer Ausnahme eine Codeadresse und was wir gemacht haben ist wir haben ganz viele Javascripts die man erzeugt die einfach nur die viel zu groß sind um in einem Memory Page zu passen eine andere Seite rein zu schreiben und dann ist der Code über mehrere Seiten steckt er sich normalerweise ist der Code nur 19 Bit in diesem Fall brauchen wir nur etwa 16 Bit glaube ich also in einem einzigen Durchlauf können wir einen Teil der Adresse hinausziehen und wenn wir es durchziehen dann komplett also jetzt haben wir einen Code Pointer ein Code Zeiger aber wir brauchen einen Code Pointer ebenfalls da gibt es ein weiteres Problem wir haben leider keine Situationen gefunden wo wir den Code Pointer hinausziehen können und die zwei Methoden verwenden weil der Hi Pointer sehr viel Entropy hat das ist ein Beispiel auch von einem Hi Pointer in Edge es gibt da eine gewisse Zunfälligkeit in Windows 10 64 Bit Zunfälligkeit 24 Bit und wir bräuchten 64 Gigabyte Speicher nur um jede diesen Wert auszuprobieren damit wir das noch multiplizieren damit wir redundant arbeiten können weil es Rauschen gibt wenn wir uns das mal anschauen wie so ein Pointer tatsächlich aussieht da gibt es Sachen die nicht der theministisch sind und das erhöht wieder die Entropy weiter und zwar erheblich und wir haben nicht mehrere 100 Terabyte von Speicher wir mussten also etwas anderes finden eine andere Methode wir könnten das verbessern wir haben einen weiteren Seitenkanal gefunden wenn wir viele Errays hinzufügen jedes einzelne Megabyte fragt der Browser das Betriebssystem nach einem weiteren Speicher und das erste Objekt was da hineinpasst in diesen neu alluzierten Bereich dieses 1 Megabyte großen Bereich das braucht dann länger um alluziert zu werden und das können wir erkennen dann können wir eine Art Timing Side Channel durchführen dann reduzieren wir die Entropy auf 20 Bit aber wir brauchen immer noch mindestens 4 GB Hauptspeicher also das ist immer noch nicht gut genug wir mussten also etwas anderes finden wir haben etwas anderes gefunden etwas sehr das ist stark das ähnelt sehr den Birthday Problem den Geburtstagsproblem in dem du man hat nur eine sehr kleine Gruppe von Leuten dass diese Leute haben den gleichen Geburtstag die wird immer höher für die Gruppe sehr klein normalerweise mehr als wir normalerweise denken würden und die Überlegung dahinter ist wir vergleichen nicht einen Geburtstag mit dem von mehreren anderen sondern wir vergleichen alle Geburtstage mit einem Geburtstag das ist genau das was Memory Deplizierung tut es vergleicht jede Seite mit jeder anderen Seite also wie können wir das ausnutzen um einem Export zu bauen wir glauben nicht, dass es nur einen Secret gibt dass wir ihn ausziehen müssen aber es gibt viele Secrets also haben wir viele Versuche viele Rateversuche wir versuchen jeden Rateversuch mit jedem Secret zu vergleichen und dann brauchen wir vielleicht weniger Speicher also in Praktis ist Victim Secrets tatsächlich haben wir diese Victim Secrets wir brauchen nicht so viele Versuche um die Übereinstimmung zu finden wie nutzen wir das in der Realität aus wir alluzieren sehr viele Objekte wegen des anderen Seitkanals bekommen wir eine Liste von Objekten die wahrscheinlich an der Megabyte Grenze liegen wir alluzieren ein größeres Array das sind in der Realität nur Speicherseiten wir legen eine Referenz doch rein zu unserem Pointer zu jedem einzelnen Objekt in diesem Array dann gibt es einen Pointer für jede Speicherseite diese Speicherseiten kodieren die Adressen der Objekte und diese Seiten wiederum nach den suchen wir dann auf der anderen Seite haben wir ein Typed Array das erlaubt uns die Binärinhalte des Speichers 1 zu 1 zu kontrollieren und wir werden Referenzen erzeugen zu den Objekten die 128 Megabyte auseinander liegen und wir erzeugen wir prüfen den Inhalt der Seiten wie diese Seiten aussehen würden wenn sie in dem Array wären also wir können die Secretseiten sehr eng zusammen sie sind ein Megabyte auseinander und die Probeseiten die sind im ganzen Adressraum die Edge eventuell verwenden könnte und in der Mitte gibt es einen Treffer und dann haben wir unsere Adressen und die kürze ein Objekt in dem wir die Daten kontrollieren jetzt haben wir all die Informationen die wir brauchen jetzt können wir Rohammer benutzen eine Referenz auf dieses Objekt zu verzeugen damit wir es auch benutzen können das Objekt ist ein Type Array das künstliche Objekt das Fake Objekt, das wir erzeugen dann können wir kontrollieren wir erzeugen dann können den ganzen Speicherbereich lesen und schreiben dieses Type Array dieses falsche Objekt erzeugen wir in einem JavaScript Array und wir kennen dessen Adressen und dann das nächste JavaScript Array mit einem Pointer dorthin und wir erzeugen es in einer Art dass wenn wir ein Bit flippen dann wird der Pointer zeigt der Pointer dorthin nicht mehr auf das Array und dafür brauchen wir den Rohammer Angriff wie Antonio schon gesagt hat letztes Jahr ihr habt wahrscheinlich den Rohammer erstell gesehen, manche von euch wir konnten das nachvollziehen die Funde die dieses Team gemacht hat auf Windows 10 und konnten das dann benutzen für unseren Angriff im Rohammer Angriff das Problem ist dass in DDR Speicher hat eine Kondensatoren um Daten zu speichern und wenn du das lest dann geht dieser Kondensator leer diese Kondensatoren sind den rein und da sie leer werden dann braucht es einen Cash der diese Werte nicht verliert das ist ein statisches Roham ein statischer Rohmbuffer aber das ist nur Begrenzspeicher wenn der Memory Controller eine andere Reihe lesen muss dann muss der wieder zurück in diese Kondensatoren geschrieben werden und eine andere Reihe wird gelesen um den Backverkehrsch zu erhalten das Problem ist das gibt ein bisschen Interferenzen und wenn man das sehr schnell hintereinander macht an ganz bestimmten Orten nach einer Weile dann flippen ein paar Bits nach Baden rein und das benutzen wir um das Bits zu flippen in dem Pointer wo wir es brauchen damit wir eine Referenz auf das Objekt kriegen und dann können wir den Prozess kontrollieren das ist der zweite Angriff der dritte Angriff nennen wir Flipfeng Shui da benutzen wir auch Roham zusammen mit der De-Duplikation aber in einer anderen Art wir benutzen es nicht mehr als Software-Seit-Kanal aber wir benutzen es um Roham noch nutzbarer zu machen als Angriffstechnik und unser Ziel ist es ein Angreifer sitzt in einer virtuellen Maschine und möchte eine andere virtuelle Maschine auf dem selben System übernehmen wie ich gesagt habe Rohamer ist eine sehr mächtige ein sehr mächtiger Angriff aber es ist wirklich sehr schwierig auszunutzen weil man zwar Bits korumpieren kann aber ihr kontrolliert nicht welches exakt der physikalische Bits verwundbar ist wenn ihr Bits flippen könnt dann muss man die Daten die korumpiert wird muss sehr nutzbar für euch sein es ist so schwierig die richtigen Daten an den richtigen Punkt zu kriegen es ist sehr schwer vorhersehbar in welcher physischen Seite der flipp passiert und es ist nicht vorhersehbar an welchem Ort es in dieser Seite passieren könnte eine Flippfunktion kann das für euch lösen vorausgesetzt in einer bestimmten Seite flippen könnt das gibt euch die Möglichkeit eine Seite die ihr das Ziel habt und die könnt ihr in den Ort bringen das Bits flippen könnt mit Rohamer wenn ihr zeigt ihr könnt irgendwo ein Bittung flippen dann könnt ihr das immer wieder tun also werden wir wir suchen wir nach Seiten die wir flippen wollen im Speicher des Opfers wir müssen sicherstellen dass diese Seiten an einen Ort gebracht werden wo wir sie tatsächlich auch flippen können Memorie, Detuplizierung, Speicherdetuplizieren ist sehr attraktiv um das zu machen dachten wir zumindest wir arbeiten hier auf der Plattform Windows 10 und wir dachten wenn wir mit Rohamer den Bitt flippen was wäre wenn wir eine Page finden die wir flippen wollen wenn wir sie einfach den Inhalt dieser Seite duplicieren und dann benutzen wir Warten wir darauf Windows unsere Seite wäre der Ort mit der Zusammenführung kommt aber Windows adoptiert eine neue Seite und die alten Orten werden zu den neuen Orten zusammengeführt aber wir haben gesehen, dass auf Linux wenn dort der Kerner Pages zusammenführt da passiert das nicht da sind aber andere Sachen die für uns nützlich sind dass diese nacheinander physischer Speicher aus Effizienzgründen an virtuelle Maschinen weiter das macht es leichter für uns Rohamers auszuführen und Bittflips zu finden und das macht es uns auch erheblich leichter dass diese Bittflips in unserem Speicher passieren in einem anderen Prozess wir möchten ja nicht nur Speicher korrekt bevor wir es angreifen dann kräscht das eventuell sobald wir wissen dass wir ein für uns das Bittflip dann replizieren wir den Inhalt dann warten wir dass der Memory zusammen gespielt wird und dann wissen wir Deterministisch wo es hin zusammengeführt wird auf unserer Seite dann machen wir Rohammer und dann können wir das Ziel angreifen und ein Ziel das wir verwendet haben ist das Authorize Keys von SSH in dem öffentliche Schlüssel enthalten sind die müssen eigentlich nicht geheim gehalten werden viele von euch haben sicherlich ihre öffentlichen Schlüssel bei Github hochgeladen zum Beispiel in der Öffentlichkeit und was wir hier sehen ist dass wir in gelb sehen ist ein RSA öffentlicher RSA Schlüssel also wir sehen hier den Basis 64 Modulus in inkudierter Form die Idee ist dass wir dass wir es nicht schaffen den zu fakturisieren aber wir haben hier einige Zeichen die zumindest ein Bit enthalten die auch nach einem Flip immer noch Basis 64 inkudiert sind und dann bekommen wir Zahlen von denen wir innerhalb einer Minute was wir hier sehen können und das haben wir getan wir flippen also ein Bit immer Modulus fakturisieren den veränderten Modulus können uns dann den privaten Schlüssel rekonstruieren und uns einloggen zweite Beispiel in dem wir GPG angreifen um Update Mechanismus in Debian oder Ubuntu auszunutzen es ist ein zweischrittiger Angriff zunächst mal verändern wir das Sources.list-File um das Repository für Updates von den anderen Domainnahmen umzuleiten einen den wir kontrollieren wir korrompieren auch zudem ein Bit im GPG Keyring für ein Signing, ein Unterschreibschlüssel ein Signaturschlüssel und dann können wir eine Hintertür bekommen um Pakete in die Installation von neuen Paketen also dieser Angriff zeigen wir jetzt was ihr hier seht ist eine Maschine in der zwei virtuelle Maschine laufen eine für den Angriff und eine für das Opfer und in der Ecke rechts oben habt ihr also die Opfer WM oben links haben wir etwas Debuginformation der untere Teil ist ein Access Log des Repository Servers den wir kontrollieren in der Mitte und den Mittelfall benutzen wir um das gefälschte Paket zu erzeugen bisher ist nichts passiert Updates wird ein Update aus das ist also alles in Ordnung jetzt flippen wir ein Bit im sources.list-File und wenn wir dann Updates wieder ausführen wird es ein Fehler gehen denn jetzt verbindet sich die Maschine mit unserem Repository und natürlich dieser Schritt muss natürlich nicht ausgeführt werden aber wir zeigen einfach nur dass nun eine Verbindung zu unserem Repository aufgenommen wird wir müssen dann eine Weile warten bis wir einen Bit finden können dass wir ausnutzen können um den GPG Signatureschlüssel zu korrumpieren und wenn wir das durchgeführt haben können wir den privaten Schlüssel rekonstruieren ein neues Paket mit dem 90 Naturschlüssel erzeugen ein neues Update Paket mit dem neuen Signatureschlüssel erzeugen wir arbeiten hier so in einem neuen Package Paket und wenn wir dann Updates Updates ausführen es sieht immer noch okay aus links aber nach dem Update läuft unser Code um zusammenzufassen ich denke ich hoffe wir konnten euch überzeugen dass Speicher die Duplicierung gefährlich sein kann und wenn ihr darüber nachdenkt diese Angriffe einzusetzen bitte denkt noch mal und noch mal und noch einmal und dann die Speicher die Duplicierung vielen Dank okay wir haben Zeit für Fragen wenn ihr Fragen habt kommt bitte zu einem der Mikrofone hat das Internet eine Frage? Keine eine Frage am Mikrofon an meiner linken Seite vorne ich würde gerne fragen wie ist das anwendbar auf große Seiten euren Beispielen hattet ihr kleine Seiten 4 oder 8 KB wie ist es mit Megabyte-Zeiten? also Kernel-Tage-Zusammenführung braucht groß KSM aber das war gut für uns aber das Kernel-Tage-Merging der kümmert sich schwerpunktmäßig um sehr große Seiten so wir erzeugen sehr große Seiten um Rohhammer zu machen damit sozusagen dieser Speichevergleich läuft aber wenn Kernel-Tage-Merging findet eine Seite die identisch ist in dieser sehr großen Seite die große Seite aufgebraucht und trotzdem zusammengeführt das ist also das WS-Gestinal für uns okay, danke nächste Frage direkt hinter dir über den Detopizierungsprozess selbst wenn der Hashes verwendet oder wie wird hier ein Cash verwendet was ist die zeitliche Folge wir haben das keine Research gemacht keine Untersuchung auf Latents gemacht aber wir glauben er benutzt eine bestimmte Form von Hashing auf Windows und Linux und die nächste Frage und bevor du fragst bitte bleibt ruhig während die Fragen gestellt werden, danke ja, also diese Angriffe benötigen dass ich als Angreifer einen Zugriff habe oder Besitz habe von diesen virtuellen Maschinen die auf den Maschinen ausgeführt werden nicht wahr was sind nun die Folgen für eine WM-Umgebung oder was auch immer bin ich jetzt also in einer Maschine wenn Gäste für interaktiven Zugriff jede Woche gehen Firmen auf uns zu und wollen uns Destropvirtualisierung verkaufen also wenn die Idee jetzt in diese Angriffe ist eine neue offene Tür für Malware-Verbreitung über virtuelle Kleincomputers gibt Gäste-Virtualisierung unser zweiter Angriff der ist nicht Makina war auf Windows 10 gemacht dort konnten wir Informationen auslesen weil Windows 10 diese Debation macht nicht nur für virtuelle Maschinen sondern auch für seine eigenen Prozesse aber Windows hat es gerade abgeschaltet aber wenn du Windows auf eine Hypervisor laufen lässt wo die Debation aktiv ist dann hast du tatsächlich dieses dasselbe Problem ok, eine Frage auf der anderen Seite habt ihr auch das Problem wenn seid ihr verwundbar wenn man sowohl ECC ECC-Speicher hat und irgendwelche kryptografischen Geheimnisse von der Detublizierung ausschließt ich habe mir noch keinen praktischen Angriff mit ECC und Rohhämmer gesehen glaube ich zumindest ich glaube, dass wenn du kryptografische Secrets hast und sie nicht dedubizierst und du hast da eine gewisse Zufälligkeit drin dann ist es nicht möglich sie zu erraten dann gibt es nicht viel was man dorthin aussehen kann von dem Konter das aber du solltest nicht das nicht an Applikation aufbühren ohne zu wissen dass die Speicherseite wie das Content Layout aussieht wie das Layout aussieht, wo die Daten sind in den meisten Fällen ist das sehr low level normalerweise sollten Applikation darüber nicht nachdenken müssen das ist die Aufgabe im Betriebssystem nicht das anwendet sich der Anwendung danke und hinten bitte wenn ihr wenn man Seiten zusammenführt kann man, wir haben hier 2 wir können noch mehr haben woher wissen wir, welche Seite diejenige ist die zuletzt übrig bleibt das könnte gut sein das ist die Seite die man kontrolliert nicht war wenn man wie 5 VMs hat und jede dieselbe Seite hat das ist das ist kompliziert nehmen wir an, das ist die komplette listen in KSM ist die älteste aber es gibt eine Ausnahme wenn du zuerst 2 Seiten zusammenfühlst und die kümmern sich zuerst um die zusammengeführten Seite und dann um die ältesten also so wird der Angriff natürlich schwieriger wenn du auf die zweite VM gehst also man soll also die erste sein dann wird in den Eingriff zusammengeführt und dann wird es schwerer aber was du versuchen könntest die Zusammenführung passiert weil Dateien im Seitencash sind also wenn du wenn die Dateien noch nicht im Seitencash sind bei dem Opfer weil sie beispielsweise weil sie in die lange niemand eingeloggt hat auf diesem System dann könntest du vielleicht 2 eigene Seiten im eigenen Raum erzeugen warten bis die deduziert werden dann lockst du mit ssa1 und dann wird SSH in den Pitch geschlagen und dann wird die Zusammenführung stattfinden Danke und hier vorne eine Frage ja, wenn ich das richtig verstehe dann funktioniert dieser Angriff nur wenn man den Zeitunterschied erkennt zwischen den verschiedenen Schreiboperationen mit oder ohne Copy on write könnte es sein eine Implementierung der Deduzierung haben in der zufällig willkürlich Zeiten hinzugeführt werden um keinen Unterschied mehr zu haben dieses Copy on write braucht Zeit es gibt wahrscheinlich nicht es gibt immer einen Zeitunterschied weil du willst nicht zufällig aber dann hast du all diese Schreiboperation du musst sie trotzdem alle Schreiboperationen verlangsamen das ist wahrscheinlich nicht machbar Danke eine Frage aus dem Internet ja die Frage ist kann dies für lange pgp Schlüssel angewendet werden also den kompletten Inhalt zu liken oder ihn zu kaputt zu machen das fühlt die Frage nicht genau aus es geht darum die Leaks zu liken auszuspeichern wenn du eine Möglichkeit sie zu laden es senkt mich wirklich davon ab es würde wäre eine Sondersituation die man erst finden muss es gibt sehr viele Möglichkeiten solche Situationen zu finden wo du Daten auslesen kannst aber es ist sehr schwierig es braucht einfach nur Zeit um die richtigen Umstände zu finden weil es gibt so viel was man dort auslesen kann wir haben noch ein Video es gibt ein Video wir haben noch nicht für dich danach gesucht in einer Situation wo wir komplette GPG Keys auslesen konnten ich würde nicht sagen dass es unmöglich ist aber ich glaube aber dass manche Krypto Anwendungen versuchen dass die privaten Schlüssel nicht lange im Hauptschweicher bleiben ich weiß nicht vielleicht willst du es ausversuchen und es herausfinden okay, danke und eine letzte Frage vielleicht irgendwelche Ratschläge für Linux Karne programmerer ich denke das zweite Beispiel enthielt die Aussage dass die Seitendotifizierung in Windows 10 besser ist als die zunächst eine Kopie und dann die Seite Angleichung in der freien Seite und dann werden die zu den uplizierenden Seiten dorthin verwiesen und sonst vorher wird es eine Seite auf die andere verwiesen und dann fallen gelassen also ist der Windows-Zugang hier sicherer ich weiß nicht ob die Linux-Programmener das wussten aber in diesem Fall vielleicht waren sie es in diesem Fall es gibt sicher Ansätze um es schwieriger zu machen und manche machen es leichter das heißt der Ort der Daten hilft nicht dagegen dass wir sie rausziehen und das würde man könnte Rohamer zumindest schwieriger machen wir haben auch einen Paper erzeugt das Rohamer beschreibt auf Android wo wir die Multiplizierung gar nicht verwenden da benutzen wir eine andere eine andere Technik um zu steuern wo Speicherseiten Speicherseiten verschwoben werden mit Rohamer kann man gar nichts zu tun denn müsste man die Speicheratektur einfach verändern völlig und vielleicht können sie aber irgendwelche Verschläge veröffentlichen was man besser tun könnte mit Speicherdeplizierung mit den Ergebnissen aus ihrer Forschung nur seine Idee es gibt ein paar Mitigationen ein paar Möglichkeiten das abzuschwächen wir wissen nicht aber sie haben immer eine Strafe auf die Performance noch das immer langsamer im Nachteil wir wissen also nicht ob sie implementiert werden können oder ob sie Standard-Einstellung werden sollten thank you wir haben keine Zeit mehr vielen Dank für einen wundervollen Vortrag danke fürs Zuhören bei der Übersetzung