 Okay, also ich erzähle euch was zu Seitenkanal-Angriffen innerhalb FPGA-Chips. Das heißt, um was geht es? Um Field Programmable Gate Arrays, FPGAs, das ist programmierbare Hardware, die ist immer häufiger anzutreffen in verschiedenen Systemen, was sich dann noch darauf eingehen wird. Und Seitenkanal-Angriffe, das sind Angriffe, die durch Nebeneffekte einer Implementierung funktionieren. Also zum Beispiel auch Stromverbrauch oder manche haben in letzter Zeit vielleicht von Spectre und Meltdown gehört. Da geht es um Zeit, Timing, Zeit-Channel-Angriffe, um was geht es aber nicht, es geht nicht um traditionelle Messungen an der Platine, das gibt es schon, sondern ich präsentiere hier neuere Forschungsergebnisse. Die Statistik, die wir verwenden, ist aber eigentlich ein Sicht dieselbe. Und was es hier geht, sind Software-basierte Messungen, die man innerhalb vom Chip machen kann. Und wir messen dann trotzdem Strom und Spannung, aber eben indirekt. Also Angriffe, die vergleichbar sind vielleicht mit Rohammer, Clockscrew, wenn das jemand kennt, Meltdown und Spectre, will jetzt aber hier auch nicht sagen, dass es so kritisch ist, wie diese Angriffe, weil mir bekannt sind jetzt keine kommerziellen Systeme, die jetzt großflächig damit exploitable werden oder sowas. Wer bin ich? Also ich bin Doktorand am KIT in der technischen Informatik, am besten, wenn er mich erreichen wollte, schreibt er mir eine KIT-E-Mail. Meine Themen sind so Zuverlässigkeiten, Sicherheit von FPGAs, bezüglich Laufzeitschwankungen, also eigentlich komme ich auch eher von der Hardware-Seite und bin kein Krypto-Experte und es ist aber aufgefallen, dass man das möglicherweise halt auch für Security-Anwendung verwenden kann. Okay. Die Agenda von dem Vortrag ist jetzt nochmal eine ein bisschen genauere Einleitung, um was es eigentlich genau geht. Danach erkläre ich dann was zu FPGAs und Side-Channel-Angriffen in bisschen mehr Details. Dann bastel ich das mehr oder weniger zusammen und zeige, wie man das innerhalb vom FPGA machen kann und ein kurzes Fazit mit Fragen. Zwischenfragen sage ich dann, wann die angebracht sind. Okay. Also erstmal zur FPGA-Chips und deren Anwendung und den Power-basierten Side-Channel. Verschiedenes auch nochmal, eventuell komme ich dazu über, dass ich manches irgendwie so halb Englisch sage, weil seit dem Kanal-Angriff ist jetzt auch nicht ganz so häufig, man nennt es halt eher Side-Channel oder sowas, sorry dafür. Zeit für Fragen zum Schluss und zwischendrin für das Grundverständnis würde ich sagen auch noch Teil 2, dann können wir so gucken, dass jeder ungefähr auf dem selben Level ist, dass er auch den Rest besser verstehen kann. So. Wo werden FPGAs eingesetzt? FPGAs sind programmierbare Hardware und wurden eher so für Prototyping oder Kleinserien eingesetzt. Sie sind halt ineffizienter gegenüber ASICs, die speziell für eine bestimmte Anwendung gefertigt werden. Könne aber zum Beispiel auch als Glue-Logic verwendet werden, das heißt, wir haben jetzt Chip A und Chip B auf dem Board und die reden nicht so ganz miteinander, dann macht man FPGA dazwischen. In der Vergangenheit oder auch heute noch sind FPGA aus viel Netzwerkanwendung im Einsatz und der Trend geht jetzt halt auch dazu, die als Rechenbeschleuniger zu verwenden. Zum Beispiel bietet jetzt Amazon schon in ihrer Cloud irgendwelche mietbaren FPGAs an, die man verwenden kann, genauso wie GPUs, Microsoft verwendet sie selbst wohl, sagen sie, im Hintergrund eben und in der Alibaba Cloud kann man auch FPGAs mieten. Die sind integriert, zum Teil gibt es auch integrierte FPGAs, zusammen im selben Chip mit CPU-Kern und in Smartphones gibt es auch schon FPGAs, also das iPhone soll wohl ein haben als Beschleuniger für Machine Learning oder sowas und oft ist es eben auch wiederum nur Glue-Logic. Jedenfalls werden FPGAs immer mehr Mainstream, das heißt, es wird auch interessanter, die zu betrachten, was irgendwelche möglichen Probleme damit sind, sein könnten. Also Software-Sichtweise, weil ich denke mal, das ist die Sichtweise der meisten Leute hier, vermute ich einfach mal und für das Rechnen ist es auch die richtige Sichtweise, die man auf FPGAs haben sollte als Rechenbeschleuniger, dann sind die eben extrem parallel. Also wir können ganz viele feinkranular Instruktion oder Logik im FPGA implementieren, um verschiedene Dinge parallel zu lösen, anstatt jetzt vielleicht auf Instruktions-Ebene oder mehrere parallele Threads haben wir tatsächlich eher auf Bit-Logikebene die Parallelität. Sind daher auch komplexer zu programmieren. Wenn man es jetzt einordnen würde, dann könnte man es hier sagen, auf der linken Seite ist ein Standardprozessor oder CPU, der ist relativ universal und einfach zu nutzen und auf der rechten Seite wäre ein ASIC, also ein Prozessor oder ein Chip, der extra für einen bestimmten, sagen wir, Algorithmus oder bestimmte Funktionen eben gefertigt wurde, der ist komplex, teuer, aber eben sehr effizient. Es könnte man inzwischen GPUs oder Grafikkarten und FPGAs ansiedeln. Die haben dann auch eine gewisse Überlappung. Also wenn man jetzt extrem speziell oder wenn man extrem Matrix-Berechnungen macht, sowas in der Richtung, dann sind GPUs oft trotzdem noch effizienter wie FPGAs. Und sonst kann man in vielen Anwendungen mittlerweile sagen, dass FPGAs wohl effizienter sind, wenn man denn die Effizienz auch wirklich rausholen kann durch die jeweilige Programmierung. So, jetzt wollte ich natürlich auch wissen, wie ein FPGA aufgebaut ist. Da sieht es im meisten Fällen so in etwa aus, als wenn das jetzt der Chip ist, dann haben wir eben verschiedene Programmierbare-Verbindungen und zwischen den Programmierbaren-Verbindungen die Logikblöcke bestehen aus, im simplsten Fall, aus Look-Up-Tables. In den Look-Up-Tables haben wir ein Teile von VOR definiert, also wir haben schon fertig da ein bestimmtes Element in Hardware sitzen, also sitzen, das ist in Silicon praktisch implementiert. Was wir aber definieren können, sind dann die Ausgänge dieser Look-Up-Table. Also wir haben definiert schon bestimmte Eingänge und wir können für die Eingangskombinationen entscheiden, was der Ausgang sein soll. Damit kann man dann verschiedene Logikfunktion beliebig implementieren. Im Detail müsst ihr das jetzt nicht anschauen hier rechts. Was dann auch noch drin ist, sind eben bestimmte Speicher-Elemente, das sind normalere Gister und die können dann eben den Wert übernehmen. Natürlich kann man jetzt aber mit so einem einzelnen Block noch nicht viel Logik implementieren, wir brauchen jetzt dann auch mehrere und die kann man dann globaler eben vernetzen mit Switch-Matrixen, das heißt, wir haben prinzipiell Gitter und jeder von den Gitterpunkten kann eben entweder verbunden werden oder nicht verbunden werden und dadurch kann man dann sein komplettes System zusammenbauen. Das sind jetzt Details vielleicht zu viel erst mal und verstandert Entwickler ist es auch unnötig, ich komme später zu mehr hier dazu. Jedenfalls man hat sehr viel Freiheiten, deswegen ist es eben auch so schwierig jetzt einfach mal kurz ein Programm oder so für ein FPGA zu kompilieren und dass es dann auch effizient gehen würde. Jetzt eine kürze, was sind passive Side-Channel-Angriffe? Also wir messen etwas in einem System und versuchen durch das Messen Geheimnisse zu extrahieren und dieses, was wir da messen sind, normalerweise irgendwelche Nebeneffekte, die nebenher passieren, also versehentlich oder kaum vermeidbare Laufzeiteffekte. Ich würde es jetzt ein bisschen sogar unterscheiden zwischen versehentlich und kaum vermeidbar, das werden wir jetzt drüber diskutieren. Und es geht halt damit komplett algorithmisch in logisches Sicherheit. Da kann man, kann zwar auch gegen Side-Channel-Counter-Messers machen durch bestimmte algorithmische Verfahren, aber letztendlich umgehen, die Side-Channel ist halt, was in Algorithmen so implementiert ist und es können jetzt halt Schwankungen im Stromverbrauch sein oder es könnte auch so was sein, das ist so klassische elektromagnetische Abstrahlung, das Fun-Act-Freaking, was man so aus den 80er Jahren oder so schon kennt, mit, wenn man jetzt irgendein CRT-Monitor hat und seine Antenne drauf ausrichtet, dann kann man vielleicht das Bild von dem Monitor sehen oder sowas, so diese Geheimdienstmethoden da. Also es gibt es schon eigentlich viel länger. Zeitbasierte Side-Channels gibt es eben auch, genutzt Inspektor und Meltdown. Und man kann auch sehr kreativ hier sein, sogar durch Spulen, Fiepen, also durch akustische Abstrahlung, kann man eventuell sehen, was so ein Prozessor berechnet. Das muss jetzt nicht im Hörbahndereich sein, kann auch im Ultraschallbereich sein oder so, durchaus möglich gibt es zumindest Veröffentlichungen dazu. Wie praktikabel die sind, weiß ich jetzt nicht. Einzelne Messungen kann man jetzt für so Side-Channels machen. Wir messen einen Spannungs-Trace, ob man da jetzt wirklich was sehen kann, nicht immer, also in vielen Sachen nicht. Deswegen gibt es halt diese Differential-Power-Analysis, wo man jetzt statistisch versucht, die Daten rauszukorrelieren oder rauszufinden, was denn jetzt wohl die CPU berechnet. Da erzähle ich dann später ein paar Mehrdetails dazu. Jetzt komme ich noch zu aktiven Side-Channel-Angriffen. Das ist nicht ganz so das Thema in einem Vortrag. Aktiv sind eigentlich dann Fault-Attacks, das heißt, wir versuchen Fehler in ein System einzubringen. Das wäre zum Beispiel Rohammer, ist ja eine Datenmanipulation letztendlich durch irgendwelche Faults, die man in das System einbringt. Es gibt auch Differential-Fault-Analysis, da versucht man jetzt in einzelnen Berechnungsschritten von einem Algorithmus Fehler zu erzeugen. Und dann zum Beispiel über ein Cypher-Text-Pair, wo der eine Cypher-Text korrekt ist und der andere Fehler hat, kann man dann letztendlich auch über bestimmte Verfahren den geheimen Schlüssel extrahieren, wenn man ein paar solche Paare sammelt. Das wurde auch schon Software-basiert gezeigt durch Power-Management-Funktionen in irgendwelchen SOCs, also System- und Chipsysteme, wo jetzt auch irgendein Armsysteme, wo eine CPU drin war und noch andere Module, aber die CPU eigentlich keinen Zugriff auf die anderen hatte. Und dementsprechend wurde über Power-Management aber ein AES-Modul angegriffen. Das nennt sich dann Clockscrew, das wurde in Newsnicks vorgestellt letztes Jahr, ist auch öffentlich zugänglich. Das ist jetzt aber auch fast alles, was ich zu dem Teil sage. Der zweite Teil werden erzeugen von massiven Fehlern durch Faults, also von Crashing oder Blockieren von Diensten. Eventuell könnte man das sowas wie Stuxnet nennen. Und das kann man halt auch zu Denial of Service führen oder sogar permanent Denial of Service. Was wir jetzt hier gelernt haben, in dem kurzen Was-Ausblick, also was sind FPGA-Chips und die Einsatzzweck und was sind Side-Channel und Fault-Angriffe, dann komme ich jetzt als Nächstes zu ein paar Mehrdetails, wie man jetzt tatsächlich die FPGA benutzen kann und wie Power-basierte Side-Channel-Angriffe funktionieren. Und auch noch mal ganz kurz ein bisschen mehr zu Fault-Angriffen. Also das ist jetzt Teil zwei. Nach dem Teil zwei würde ich dann ein paar Fragen entgegennehmen, aber jetzt erst einmal ein paar Mehrdetails noch. Erst einmal zu FPGAs und allgemein digitaler Logik, für jemand, der jetzt noch nichts von digitaler Logik gehört hat bisher, dann noch zur Stromversorgung in integrierten Schaltkreisen, was eine wichtige Grundlage für das Ganze ist, und dann Power-Side-Channel und Fault-Angriffe. Also noch mal ein bisschen detaillierter zu den FPGAs. Wir haben jetzt irgendwelche Look-Up-Tables, die wir in den FPGA mapen, und wir können flexible beliebige Logikfunktionen schalten. Also versucht es keinen Sinn, in dem Folgen zu finden, wir haben jetzt irgendwelche Logikverknüpfungen, die könnte man jetzt eben auf die Look-Up-Tabelle mapen und alles wird hier gleichzeitig in einem Zeitschritt ausgeführt, wenn man jetzt in so Zeitschritten denken würde. Und alles aber parallel. Also wie gesagt, so Art-Bit parallel könnte man das jetzt nennen. Nicht einzelne End-Instruktion, Or-Instruktion, Xor-Instruktion, sondern in einem Zeitschritt. Das kann man jetzt ein bisschen weiterspinnen und kommt dann zur digitalen Logik, zur Register-Transfer-Ebene. Das heißt, wir haben in einem Zeitschritt hier die kombinatorische Logik stehen. Also kombinatorisch ist, man legt am Anfang praktisch seine Daten hier an und dann wartet man irgendwie ein bisschen und dann hat man am Schluss das Ergebnis. Und das ist halt physikalisch auch ein bisschen limitiert. Aber in der digitalen Logik macht man eben deswegen Register hin und hat es am Anfang Register und am Ende Register. Und wenn man jetzt sagen würde, die laufen zum Beispiel bei 100 MHz, dann dauert es eben, hat man so viel Zeit dazwischen, wie eben 100 MHz dauert, also 10 Nanosekunden von einem bis zum anderen Register, ansonsten funktioniert es nicht richtig. Also wir können die Logik jetzt in einem FPGA sogar komplett frei wählen. Also wir können hier beliebig sagen, beliebig viele Elemente hintereinander schalten. Aber wenn wir dann noch 100 MHz verwenden, aber die Logik würde viel länger dauern, dann gäbe es natürlich Berechnungsfehler. Also wie je mehr Logik pro Zeitschritt, desto langsamer wird das Ganze auch. Und zusätzlich sollte man hier sagen, das verwenden wir später, die Geschwindigkeit ist eben auch abhängig von Temperatur und Spannung. Das heißt, es sind Sicherheitsmarschen notwendig, dass es keine Rechenfehler gibt, falls wir das denn wollen. Das zeige ich auch noch später. Jetzt kommen noch mal ein paar Mehrdetails, wie man jetzt eben diese Logik in FPGA bringt. Also wie machen wir das überhaupt? Wir müssen jetzt nicht tatsächlich jedes einzelne Bit hinsetzen oder so, sondern das geht ein bisschen abstrahierter. Deswegen gibt es Hardware Description Language, die werden in der Industrie als Standard, Verilog und VHDL verwendet und werden Chips damit entwickelt. Das ist effizient und präzise, aber man sollte es auch nicht wie eine Programmiersprache verstehen. Ansonsten kommt wahrscheinlich nichts Sinnvolles dabei raus, weil man eben auf dieser Clock-Ebene denken muss, dass es auch wirklich funktioniert. Dazu gibt es aber eigentlich auch High-Level-Sprachen, die sind dann für eher algorithmische Beschreibungen geeignet wie OpenCL oder C++, was vom Hersteller dann abhängt, was da dir denn für ein Tool gibt. Also überhaupt diese FPGA-Tools sind sehr propriätär. Es gibt leider sehr wenig sinnvoll benutzbare OpenSource-Tools. Wie auch immer, die High-Level-Sprachen sind immer noch relativ ineffizient und in dem Vortrag jetzt hier auch gar kein Thema. Also kommen wir zu VHDL. Grundlegend machen wir ein taktgesteuertes Zuweisen von Werten. Also wie gesagt, wir haben ja immer kombinatorik und sekventielle Logik und wir müssen dann in takten Denken, wie das zugewiesen wird, dass unsere Schaltung auch funktioniert. Also zum Beispiel hier habe ich ein kleines Beispiel in VHDL. Wir sehen hier ein Counter, der ist als Prozess deklariert. Der Prozess ist jetzt sensitiv, nennt man das, auf den Clock. Und in dem Prozess machen wir eine Bedingung, die schaut, ob jetzt der Clock eben eine Rising Clock Edge hat. Das heißt, wir haben eine ansteigende Taktflanke. Das heißt, in jedem Takt Schritt gilt diese Rising Edge Bedingung. Das heißt, wir haben ein Event, der praktisch einmal pro takt passiert. Und dadurch tun wir einmal pro takt, machen wir diese Pluszuweisung hier. Also wir sehen hier A ist A plus 1. Und der VHDL-Compiler weist dann automatisch das, was da links steht. Also wir haben ein Plus und dann ein Register und das ist jetzt so ein Loop. Und mit 100 Megahertz zählt da jetzt immer Plus 1 auf eben dieses A, was in diesem Register gespeichert ist. Wenn man jetzt noch einen zweiten Counter will, geht es in VHDL relativ einfach. Man kann jetzt ganz viel parallel arbeitende Blöcke machen. Ich kann jetzt einfach sagen, Counter 2, auch Clock sensitiv. Und hier mache ich jetzt anstatt dem A verwendig B, wenn man das halt oben drüber irgendwo deklarieren muss. Da habe ich zwei Counter, die parallel die ganze Zeit hochzählen. Das könnte natürlich unterschiedliche Schaltung machen. Genau das Identische macht wohl wenig Sinn und kann so meine Logik aufbauen. Wenn ich jetzt allerdings, was sequenziell machen will, muss ich selber mich darum kümmern, dass nacheinander verschiedene Schritte auch passieren, wo zum Beispiel State-Maschinen ganz gut geeignet sind. Dann könnte ich in die If-Bedingung zusätzlich schreiben, wenn mal in State 1 ist, 2, 3. Und dann kann ich die States durchgehen und dadurch irgendwelche sequenziellen Dinge abhandeln. So, eigentlich schreibt man das Ganze auch so. Wenn ihr gerade gesehen habt, was sich verändert hat. Also, wir haben jetzt so ein kleines Dreieck dahin gemacht. Das bedeutet so viel, dass das der ganze Block Takt sensitiv ist. Das heißt, pro Takt schaltet er einmal einfach zur Vereinfachung. Normalerweise versteht der Digital-Designer dann, wenn er ein Dreieck sieht, auch ohne dass ein Clock verbunden ist, dass wir vermutlich hier ein Clock haben, um das ganze Takt gesteuert zu haben. Okay, jetzt fragen wir uns vielleicht zu dem, weil das, was ich vorher gesagt hatte, war ja okay, das ist temperaturabhängig und so weiter. Wie lange braucht es Plus? Das ist halt abhängig vom Mapping auf die FPGA-Architektur. Und wir sagen normalerweise, unserem Compiler- bzw. Synthese-Tool heißt es eigentlich richtig. Nicht Synthese, also nicht Compiler, sondern Synthese. Welche Frequenz wir uns denn so wünschen. Und dann versucht das Tool, diesen Wunsch zu erfüllen. Also, der Compiler-Mapper versucht diese Frequenz zu erreichen mit immer mehr iterativen Optimierungsschritten und verwendet auch im Hintergrund physikalische Modelle dafür. Und wie gesagt, ist es abhängig von Temperatur und Spannung. Deswegen sind die Modelle meistens halt Worst-Case-Modelle. So, wenn man jetzt in digitaler Logik oder in VHDL eben was schreibt, dann will man natürlich nicht eine riesige Datei machen, sondern das auch strukturell machen. Man verwendet auch Libraries, wie in Programmiersprachen oder so. Das nennt man dann eher strukturelle Modellierung. Also, wir verwenden Komponenten wieder. Und man kann jetzt auch, das ist nämlich jetzt schon mal vorweg, man kann jetzt hier auch hersteller-spezifische Architektur nutzen. Das heißt, anstatt jetzt andere hierarchische Komponenten zu verwenden, kann ich jetzt ganz exakt sagen, ich will jetzt dieses Loot5-Element, also Look-Up-Table mit fünf Inputs, heißt es jetzt bei Xilinx, dem einen Hersteller, verwenden und kann das dann in VHDL auf diese Art hier verwenden. Hier sieht man das Ring-Ostylator. This enable bedeutet, also ist der Name von unserer Komponente. Loot5 ist praktisch, kann man mal sagen, die Klasse, die wir instanzieren. Und da ist noch eine Generic-Map. Diese Generic-Map bedeutet Parameter, die man ja im Ganzen zur Compile-Zeit übergibt. Und eine Port-Map. In der Port-Map machen wir jetzt halt die ganzen Verbindungen. Das sind es aber halt elektrisch sozusagen Verbindungen. Das sind jetzt nicht irgendwie Parameter, die man dem Ganzen übergibt, sondern Verbindungen, die man sich eher so strukturell vorstellen muss. Also wir haben ein Output-Wert, das O ist der Output, die ist der Look-Up-Table. Und da haben wir ein Signal, das heißt Self-S. Als einer der Inputs haben wir auch ein Signal Self-S. Als ein anderen Input haben wir Enable und alle anderen Inputs sind jetzt auf Null. Also ich hätte hier auch eine Loot2 verwenden können. Ich brauche eigentlich nur zwei Inputs. Was es in dem Fall realisiert, zeige ich dann auch nochmal später. Jedenfalls kann man halt so jetzt strukturell modellieren. Man kann das Ganze dann auch mehr reproduzieren, also mit einem Generate mehrfach generieren. Das ist dann aber auch stativ zur Compile-Zeit. Hier zum Beispiel ist es jetzt ein Generate von I, Null bis R, O, Max. Also wir erstellen ganz viele von diesen Ring-Oscillatoren. Haben aber das gleiche Enable-Signal und nur ein anderes Self-Signal. Das wird auf sich selbst verweist. Also es ist einfach ein Array sozusagen als Self-Signal. Was das tut, komme ich auch später noch dazu. Jetzt noch einen Blick auf so einen kompletten FPGA. Das hier, was ich gerade zeige, ist ein Floorplan, nennt man das. Also komplett, wenn man ein Chip jetzt von oben anschauen würde, hier aber auf eher schematische Weise dargestellt, dann kann man verschiedene Sachen, wenn man reinzoomt, sehen, die eben in dem FPGA in welcher Stelle die exakt platziert sind. In dem Fall sieht man jetzt das ganze Blaue hier in der Mitte. Das sind eben schon fertig platzierte Elemente. Und wenn man sich das genauer anschaut, kann man sich jetzt eben diese Logikfunktion anschauen. Also hier ist jetzt ein Schaubild, wo man sieht, dass hier programmierbare Verbindung, diese Switchmatrix ist, auf die gehe ich jetzt nicht näher ein und sogenannte Slices. Und eins und Slices wiederum ist dann aufgebaut, auch in diese Look-Up-Table-Elemente, wie vorher erwähnt. In dem Fall ein spezielles Carry-4-Element, da gehe ich später auch drauf ein. Und Slices und Register, es gibt auch noch mehr, also es gibt speziellere Elemente, DSP-Blöcke, die jetzt dann Floating Point können, eventuell oder zumindest Multiplikation beschleunigt oder Division, solche Sachen. Blog-Speicher, dass man ein paar mehr SRAM-Zellen hat in dem Ganzen und nicht nur die Register benutzen muss. Und dieses Carry-4 in dem Beispiel, kann man jetzt auch wieder instanzieren, ist auch so ähnlich wie vorher, Inputs- und Outputsignale. Und nochmal zu einer anderen Darstellung, weil ich die später benutzen werde. Hier zeige ich jetzt auf der linken Seite zwei Slices übereinander in der Darstellung mit ausgeblendeten Verbindungen. Das ist etwas leichter zu sehen, finde ich zumindest. Oder auf der rechten Seite sieht man es nur schematisch. Das sind dann die Verbindungen einfach aus durchgezogenen Linien, anstatt dass man tatsächlich dieses exakte Interconnect-Netzwerk sehen muss, was nicht unbedingt immer relevant ist. So, wenn man das jetzt in Code machen will, das ist vielleicht ganz interessant. Sylings sieht eher vor, dass man das in separate Dateien schreibt, in irgendwie Constraints Dateien, dann ist es auch alles relativ statisch. Also hier unten zeige ich jetzt eine Constraints Datei, wo man jetzt ein bestimmtes Slice irgendwie platziert. Ich weiß nicht, ob ihr das alle lesen könnt. Ist auch nicht so wichtig, ich sage eigentlich alles dazu. Das geht teilweise auch eben als VHDL-Attribute, also hier rechts seht ihr jetzt, wie ich verschiedene, man sieht oben Library, das ist die Library die man verwendet, dann der Sensor wie genannt wird, dann kommt Architecture und da ist der interessantere Teil, das sind das Attribute, die man in VHDL schreiben kann. Zum Beispiel ist hier sowas wie Keep und S, die braucht man, um dem Compiler beizubringen, nicht irgendwas wegzuoptimieren, was man eigentlich behalten will, zum Beispiel mit Absicht, irgendein Delay oder sowas. Dann gibt es aber dieses A-Lock-Constraint, das hier schon angewandt wurde, da sieht man A-Lock of CI4, also hier. Das hat ein bestimmtes Label und das heißt, das Label ist die Position an der man das jetzt platzieren will, aber weil es ein A-Lock ist, ist es eine relative Platzierung. Wenn man dann wieder links auf diese Constraints Datei geht, sieht man, der Constraints Datei geben mir an ein Lock, das heißt, wir sagen, wo wir jetzt dieses eine Element platzieren wollen. Wenn man jetzt aber in derselben Hierarchie mehrere A-Lock, also relativ Location-Constraints macht, kann man so ein ganzes Modul aufbauen und die ganzen relativen Locations zueinander und dann dieses Modul mehrfach an verschiedenen Stellen eben im FPGA platzieren. Da gibt es dann noch mehr Constraints, um das dem Tool auch beizubringen, dass es auch wirklich tut, weil sehr oft wird irgendwas verändert und unoptimiert, leider. Meistens funktioniert es dann aber doch ganz gut, wenn man mal ein bisschen mit rumgespielt hat. Das war es, glaube ich, zu der Slide schon. Da komme ich noch mehr dazu später. Okay, also, jetzt komme ich zum Spannungseinfluss auf Transistorien. Also, wenn man diese Grafik anschaut, sieht man, dass es in dem Fall, wo man jetzt vier verschiedene Variations untersucht, also wir haben einmal Process Variation, das sind Fertigungsschwankungen, die sind auch relativ hoch, verändern sich, aber halt nicht mehr nach der Fertigung. Das heißt, an einem Ende vom FPGA sind eventuell die Delays viel höher wie am anderen Ende, das heißt, theoretisch könnte ein Teil vom FPGA schneller laufen wie der andere Teil. Praktisch ist es aber so, dass der Hersteller die eben sehr konservative Sachen gibt. Der Hersteller sagt dir, das Ding läuft mit 200 MHz, in echt läuft es an manchen Stellen mit 300 MHz, an anderen mit 250 MHz, je nachdem, was so Temperatur und Spannung sagt. Ja, die anderen Effekte, wie gesagt, sind auch Temperatur. Die Temperatur verändert sich aber eher nur im Millisekundenbereich. Und ich zeige jetzt auch hier gerade, ja, übrigens, wenn das nicht ganz klar war, auf der Y-Achse die Veränderung in der, in dem Pass-Delay, also die Veränderung im Delay, im, Entschuldigung, Delay, Zeit, die eben Transistor braucht oder die eben verschiedene Teile von einem Pfad brauchen, um zu schalten. Und das verändert sich eben hier. In dem Fall ist es maximale, wenn man auf der rechten Seite der Y-Achse anschaut, sind hier 4% drin. Und im Vergleich dazu von den fast 4%, die diese Transient Voltage Stop, das die Rechte, der rechte Balken anzeigt, ist die Thermal Variation im Bereich von 30° zum Beispiel, also die zweite Balken ist ja relativ wenig. Und zudem, dass es relativ wenig ist, verändert sich es auch nur im Millisekundenbereich, sagen wir mal. Danach kommt ein Steady-State Voltage Drop, das nennt man so, das ist ein statischer Spannungsabfall, der anzeigt, was passiert, wenn man durchschnittlich, 8% der Flip Flops im System hat und die tockeln die ganze Zeit. Aber jetzt nicht, was passiert, wenn sie zum Beispiel anfangen zu tockeln, nachdem sie davor nicht getockelt haben. Der Begriff Tockeling heißt hier jetzt auch, dass die Transistoren eben anfangen, die Flip Flops eben anfangen sich die ganze Zeit von 0 auf 1 ihren Wert zu ändern. Das meine ich jetzt hier mit Tockeling. Also die wechseln die ganze Zeit ihren Wert und schalten hin und her. Und das kann eben Spannungsabfall verursachen, weil das Strom braucht. Und das ist eben im statischen Fall nicht zu kritisch, aber wenn man spontan anfängt, alle Transistoren, die man so hat, alle Flip Flops, die man so hat, von 0 auf 1 zu wechseln, dann führt das eben zum hohen Spannungsabfall. Und das ist jetzt dieser Transient Voltage Drop. Das ist das schlimme dazu, oder wenn man es schlimmen nennen will, ist sogar, dass es eben im Mikro- oder Nanosekundenbereich passieren kann. Und abhängig von der jeweiligen Belastung, man kann jetzt theoretisch auch auf Resonanzen kommen oder sowas, vom Spannungsversorgungsnetz, dann kann es auch negative Effekte haben. Hier zum Beispiel, die Details muss man jetzt nicht angucken, aber was einem Deschaubild zumindest sagen soll, ist, dass es abhängig davon ist, wie man tockelt, was für ein Voltage Drop mir damit erreichen können. Also hier sind in allen Bereichen von dem rechten Schaubild wurden immer nur 8% verwendet, aber wurden in verschiedenen Mustern eben an und abgeschaltet. Deswegen konnten wir halt dadurch die Verzögerungszeit erhöhen fast 4% oder in manchen Fällen, was trotzdem nur über 1%. So, vielleicht um das besser zu verstehen, zur Stromversorgung von Elektronik im Allgemeinen, also für die E-Techniker eher bekannt, wir haben halt in unserem System irgendwann mal, wir haben viele teils unerwünschte oder nicht ideale Komponenten, das sind aktive Spannungsregler und Widerstände und Spulen und Kapazitäten in unserem System und das ist auf dem Board irgendwo der Spannungsregler, der das Board verteilt, alle verschiedenen Komponenten, die mir, wie gesagt, teilweise sind die tatsächlich extra platziert als Bauteil, aber teilweise wollen mir die Komponenten eigentlich gar nicht haben, aber sie sind parasitär eben da und letztendlich führt es halt dazu, dass wir eine Spannungsstabilität haben von einer zeitlichen Belastung und das ist auch innerhalb des Chips, also von einem Bereich vom Chip zum anderen Bereich kann es Unterschiede geben. Also so ein Spannungsabfall, wenn man das rundlegend anschauen will, könnte man sagen, das Spannungsabfall ist davon abhängig von einer Stromdifferenz pro Zeit. Also wir haben hier Voltage Drop und das nennt man jetzt LDIDT, das ist abhängig von den Induktivitäten im System an irgendeiner Stelle, weil Induktivitäten verzögern praktisch Strom, kann man so, könnte man so sagen und dann kommt es darauf an, wie stark verändert sich der Strom, den wir denn von dem System sehen, über die Zeit und wenn das hoch ist, gibt es einen höheren Spannungsabfall. Und der zweite Teil, den gehe ich jetzt nicht darauf ein, das ist eher der resistive Spannungsabfall, der ist meistens geringer. Wenn wir es eben schaffen können, die Stromdifferenz sehr zu erhöhen ist vor allem dieser LDIDT Spannungsabfall ein großes Problem in aktuellen Chips, also in, weiß ich, weniger wie 45 Nanometer System, so was. Weil das eben auch auf dieser Package-Ebene, in dem diese da ist verpackt werden, nicht unbedingt vermeidbar ist. So, jetzt können wir diesen Spannungsabfall nutzen, also es ist ja jetzt nicht nur so, dass wir jetzt bei diesen Power Side-Channels Strom messen müssen, sondern durch das, dass der Strom sich verändert, kriegen wir eben den Spannungsabfall und können auch darüber Power Side-Channels machen. Falls sich jemand jetzt gerade fragt, der schon mal was zu Side-Channels gehört hatte, an sich zur Einführung, für die, die noch nichts darüber gehört haben. Power Side-Channels nutzen die Schwankungen in Spannungen oder eben Strom vom System und da mit eben die Secret Keys zu extrahieren, das hatte ich vorher schon mal gesagt, in dem Fall kann man jetzt zum Beispiel, oder für die Simple Power Analysis, kann man einzelne Verschlüsselungen messen. Eventuell messen wir die selbe Verschlüsselung hundertmal und neben den Mittelwert, um dann besser was zu sehen, dass dieses wird halt weit neues oder das Standard rauschen, dass man irgendwie hart rausgemittelt wird. Und in dem Fall sieht man hier jetzt auch, dass man RSA, in einer naiven Implementierung zumindest, relativ leicht angreifen kann. Wenn man jetzt hier von links nach rechts geht, sieht man, an irgendeiner Stelle haben wir eine 1, da gibt es ein Spannungseinbruch, weil jetzt eben irgendwelche Multiplicierer in dem System aktiv werden und wenn dann die 1 bestehen bleibt, verändert sich nichts, aber wenn die 0 kommt, würde eventuell weniger Funktionsanheiten im System aktiv sein und dann gibt es wieder ein Overshoot, weil die Spannungsversorgung eben nicht komplett stabil ist und wenn man jetzt die Spannungsversorgung anfängt zu belasten, dann sinkt erstmal die Spannung ein und wenn man sie entlastet, dann steigt sie halt erstmal kurz an und das kann man hier ausnutzen, um dann den geheimen Schlüssel sehen zu können. Lustigerweise, als Fun Fact, RSA kann man tatsächlich mit mehr Bits eher leichter angreifen, weil dann diese ganzen Operationen länger brauchen. Okay, aber nicht genug. Natürlich kann man das auch verstecken und auch Standard Open SSL und so weiter, kriegt immer wieder Patches, die tatsächlich gegen solche Power Side Channels gedacht sind und deswegen sehen wir vielleicht oft eher an den Secret Key nicht, auch wenn man über viele Traces mittelt, dann sieht man eher sowas wie rechts, wie flache Linie. Deswegen gibt es Differential Power Analysis, was wir da machen, ist statistisch eben das, was wir vermuten, was unsere Verschlüsselung im Power Trace sichtbar macht, rauszukorrelieren. Also unsere Verschlüsselung basiert auf einem bestimmten Algorithmus und der Algorithmus führt jetzt eben dazu, je nach Berechnungen einen Spannungsabfall zu provozieren und das, was wir denken, was es ist, korrelieren wir dann mit den Traces, die wir vom System bekommen. Ich erkläre das gleich mehr im Detail. Also dazu brauchen wir ein sogenanntes Leakage Modell, das ist das Modell, das uns sagt, wiefern der geheime Schlüssel sich auf den Voltage Trace auswirkt und wir brauchen auch viele, viele Traces dazu. Das heißt, wir haben Trace und der Trace wird mit diesem Modell korreliert, was Korrelation ist, sage ich dann auch nochmal gleich, bei einer Korrelation vergleichen wir praktisch zwei Mengen miteinander, ob sie Ähnlichkeit haben oder nicht. Das Diagramm erkläre ich jetzt auch mal kurz, was wir hier links unten haben. Das ist jetzt auf der x-Achse über den seitlichen Verlauf und auf der y-Achse die Korrelation. Was wir hier grau im Hintergrund sehen, ist eine Menge an verschiedenen nicht Traces, sondern eine Menge an verschiedenen Hypothesen über einen geheimen Schlüssel. Das heißt, Hypothese, ob jetzt irgendwas 0 oder 1 ist. Und wir machen das jetzt für jeden Schlüssel, wo wir denken, dass er vorkommt im System und sehen dann, dass einer davon sich aus allen anderen hervorhebt. Das ist das, was wir dann in dem Diagramm dafür extra haben. Also nachträglich, nachdem man sieht, dass er besser ist wie die anderen, sieht man diesen schwarzen Trace. Der hat einen größeren Ausschlag als die anderen Traces. Das ist jetzt das Eltergebnis. Man kann das Ganze auch über die Zeit anschauen, wenn man das hier rechts anschaut. Da gucken wir jetzt immer zu jedem Zeitpunkt, das heißt, wir haben am Anfang ein paar wenige Traces, gerade die beste Korrelation und markieren die schwarz und alle anderen lassen wir grau und gehen so weiter und sammeln immer mehr Traces mit Einberechnen. Und nach rechts hin in diesem Diagramm sehen wir dann, dass sich das Graue immer weiter zum Null hin bewegt und das schwarze immer noch zum Glück von der Null sich unterscheidet und dadurch der geheimen Schlüssel ist. Wie es jetzt genau funktioniert, das zeige ich jetzt. Jetzt, sorry, komme ich erst zu AES um das Leakage Modell zu erklären. AES ist bekannt als Rheindahl-Algorithmus. Also daher kommt AES. Rheindahl hat den Contest gewonnen der Advanced Encryption Standard zu werden. Ursprünglich ist es von 1998 und wir haben verschiedene Möglichkeiten für den Key, 128, 192, 256. Wir schauen uns jetzt 428 an was Runden basiert berechnet wird in 10 Runden. Und jede Runde passieren verschiedene Operationen. Add-Round-Key, S-Box, Shift-Rows, Mix-Columns, was auch immer das heißt, da gehe ich jetzt auch nicht auf die Details ein. Was wichtig ist für den Angriff zum Teil ist, dass wir einen Runden-Schlüssel haben der abhängig ist vom kompletten Key. Also wir haben ein Secret-Key der Runden-Schlüssel ab, das kann man aber auch rückwärts rechnen. Das heißt, selbst wenn wir jetzt ganz am Schluss in der letzten IES-Runde, wo dann der Cypher-Text aus dem Algorithmus rauskommt den Runden-Schlüssel angreifen können wir den tatsächlichen Schlüssel rekonstruieren und das macht den Seitenangriff zumindest leichter. Also jetzt zu den tatsächlichen algorithmischen Details also wir haben im Fernsehen mal das in der Präsentation gut machen kann. Also wir haben jetzt gegeben 0 bis n Paare gemessener Traces, das heißt, ich habe pro Trace einen unterschiedlichen Cypher-Text. Also ich gehe hier davon aus, dass die Verschlüsselung jetzt nicht immer die gleiche ist, wir verschlüsseln verschiedene Sachen, aber mit dem gleichen Geheimenschlüssel. Der Geheimenschlüssel ändert sich nicht. Da haben wir ein Voltage oder Power Trace über eine Zeit also hier V, I und zur Korrelation brauchen wir eben eine Hypothese vom Geheimenschlüssel. Normalerweise macht man das dann Bit oder Byteweise, weil wenn man jetzt den kompletten Schlüssel nehmen würde müssten wir praktisch 228 Korrelationen berechnen. Das wäre dann auch nicht besser wie also ja, vielleicht nicht unbedingt nicht besser wie Blutforce, immerhin kann man ja aus den Daten, die man hat, das berechnen braucht aber wahrscheinlich viel viel zu lange zu berechnen. Es ist wahrscheinlich genauso schlecht wie Blutforce zu machen. Deswegen kann man Byte- oder Bitweise machen, dann wird es eher linear zur Key-Länge, also vielleicht dauert es dann eben nur 128 lang oder 256 mal 8 also das heißt so viel 256 mögliche Werte, die ihn weit annehmen kann und die 128 Bit von AES sind eben 8 Byte. Jedenfalls machen wir eine Annahme über die Auswirkung vom Schlüssel auf den Voltage Trace, das heißt zum Beispiel Byteweise können wir ein Hamming-Modell verwenden. Das wäre jetzt halt hier ein Hamming-Modell gezeigt über die Key-Hypothese, also das TAR-Hyp, da haben wir mehrere davon, eben pro Byte haben wir dann 256 verschiedene Hypothesen und danach kommt unser Leakage-Modell, das ist die letzte AES-Runde in der invertierte S-Box und in der invertierten S-Box eben der Rundenschlüssel, das CI oder der Teil vom Rundenschlüssel verxorten mit unserer Key-Hypothese vom letzten Rundenschlüssel. Das Cypher-Text koaliert verxorten mit der Key-Hypothese vom letzten Rundenschlüssel. Wir müssen dann eine Korrelation aller Traces machen mit allen Hypothesen, also wir haben das Hamming-Modell von allen Hypothesen von allen Zeitpunkten und wir koalieren mit der Pearson-Correlation das finden wir jetzt so auf Wikipedia, da muss ich jetzt die Details auch nicht erklären, was das genau macht wir vergleichen jedenfalls die Menge X und Y, wir können da jetzt Teile davon vorberechnen, also können wir anfangen über alle Traces zu gehen also wir nehmen eine Key-Hypothese im Bereich von eben den 0255 pro Byte berechnen unser Leakage-Modell das Leakage-Modell müssen wir dann für die Vorberechnung eben für das EY und das EY-Square hinzufügen pro Key-Hypothese aber über alle Traces, also wir müssen die ganze Menge an Traces mitverwenden im nächsten Schritt gehen wir über alle Zeitpunkte im Trace, da müssen wir so was ähnliches machen, wir berechnen jetzt das EX vor, um das EX vorzuberechnen müssen wir auch unser Voltage Trace eben aufadieren also der komplette Voltage Trace also sorry, jeder der Traces jeder der Traces wird eben wer aufadiert, das heißt wir haben das EX pro Zeitpunkt, aber das ist von allen Traces eben ein gemeinsamer Trace sozusagen mittelwert und für die Key-Hypothese müssen wir dann nochmal doppelt also über alle Zeitpunkte und über alle Key-Hypothese müssen wir noch dieses EY der Erwartungswert von XY berechnen der hier oben verwendet wird und ganz am Schluss können wir dann einfach das in unser Pierson's Correlation reinklatschen und wir machen dann eben nochmal über alle Key-Hypothesen und über unseren ganzen Trace also hier rechts von links nach rechts über alle Trace über alle Zeitpunkte also das hier sind alle Zeitpunkte und alle Key-Hypothesen das heißt jeder einzelne Strahl der hier drin ist, ist eine Key-Hypothese während Zeitpunkte sieht man ja auf der X-Achse und die Korrelation ist das Ergebnis dann der Pierson's Correlation so und jetzt war es das eigentlich schon das ist Differential Power Analyzes Angriff durch Correlation Power Analyzes so, das war jetzt nicht der Vortrag, sondern die Zwischenfragen kommen gleich ich sag's vielleicht auch keine Zwischenfragen mehr aufgrund Zeit jedenfalls jedenfalls kommen wir jetzt zum Verhindern von Differential Power Analyzes und Counter Meshes dazu was man eben tun könnte ist das Reduzieren der Schwankung zur Laufzeit es wäre also durch zum Beispiel sowas wie invertierte Logik das heißt wir versuchen die Logik die eben die Schwankung ausgleicht da gibt's was nenn sich Dual Rail Precharge Logic aber zum Beispiel wenn man sich überlegt wenn man Transistoren einfach nur dupliziert, reicht das nicht unbedingt weil es gibt ja Fertigungsschwankung und es wird immer mehr zum Problem dass dann auch dann immer noch Unterschiede drin sind und tatsächlich können minimal statistische Abweichungen ausreichen und in einem hartnäckigen Fall es ist nicht mal so hartnäckig kann man dann mit 4 Millionen Traces trotzdem noch ein Unterschied erkennen wenn man hier jetzt ganz am Ende schaut ist noch ein Unterschied zu erkennen da gibt's auch weiterführende Dinge dazu wer sich damit befassen will Prinzip ist es eher so ein Katz und ein Mauspiel es gibt eigentlich fast keine perfekten Countermashes irgendjemand findet meistens doch irgendwas weil irgendwas liegt trotzdem irgendwie raus wobei man auch algorithmisch wieder was machen kann aber da will ich jetzt nicht ganz drauf eingehen das wird zu viel dann kommen wir zum Aktiven Zeitschannel Angriffen also Folder Text hatte ich vor schon mal kurz erwähnt Differential Fold Analyse es wird zu viel aber ich wollte es eben erzeugen wenn man zum Beispiel die Spannung verringert oder die Taktrate im System erhöht dann kann es eben Berechnungsfehler geben im FPGA zeige ich später mehr dazu wie man das eben machen kann über den schon vorher gezeigten Spannungsabfall den man über den DIDT wollte also den DIDT wollte ich auch wie man den erzeugen können so jetzt wollte ich euch die Zwischenfragen machen wir könnten kurz die Zwischenfragen können wir machen ich brauche wahrscheinlich trotzdem noch 15 Minuten für den Vortrag wenn keine Zwischenfragen sind mache ich einfach weiter keine, ok, dann mach ich weiter und kommt zu putting it together also Power Side Channel Angriffe innerhalb FPGAs das ist jetzt war mein tatsächliches Forschungsthema sozusagen was wir jetzt tatsächlich neu machen weil alles was ich bisher präsentiert hab ist eigentlich ein alter Hut was ich sogar schon also komm ich zum Szenario was das Problem sein könnte hab hier so ein lustiges Diagramm und zwar mit ein Angreifer hätte der einen einzelnen FPGA angreifen will es ist vielleicht nicht interessant weil das ist dann verschlüsselt Bitstreams können verschlüsselt werden ist zwar auch schon geknackt aber jedenfalls gehen wir eher davon aus dass man komplettes System haben in dem FPGA Logik ist ein Shared FPGA System da könnte der Angreifer eben irgendwie ein Benutzer vom System sein wenn man jetzt der CPU zum Beispiel mehrere Tasks auf der CPU hat und irgendein Task hat einen Teil vom FPGA unter seiner Gewalt und der andere Task hat einen anderen Teil dann könnte der eine Task indirekt den anderen dem seine FPGA Logik zumindest angreifen falls da jetzt kryptografische Beschleuniger drin sind und so was kann es halt auch so kommen aber zumindest bietet es Amazon auch irgendwelche Accelerator an die man kaufen kann für den FPGA oder mieten kann bisher bieten die aber pro User nur ein FPGA also es ist da noch kein Problem bis sie auf die Idee kommen das zu virtualisieren jedenfalls sind die Komponenten elektrisch verbunden miteinander und dadurch halt potentiell exploitbar und der Zugriff der FPGA ist halt schon irgendwo Software basiert weil mir die Konfiguration feuern können in einem Szenario also für Side Channel Angriffe könnte man jetzt vom FPGA eventuell irgendwie die Spannungsschwankung messen oder auf der anderen Seite können wir irgendwie Spannungseinbrüche erzeugen das kann man jetzt auch durch die FPGA primitiv machen wenn man die kreativ irgendwie verwendet da ist es noch was im Slidefall staunten aber ja also für Side Channel Angriffe wollen wir die Spannung messen wir brauchen einen Spannungssensor und für Fold Angriffe müssen wir die Spannung manipulieren das machen wir durch Ring Oscillatoren auf eine bestimmte Art die später erklärt wird erstmal zu zurück zu dem hier, zu digitalen Logik ich hatte ja vorher gesagt, wir haben jetzt irgendeinen Zeitschritt und der Zeitschritt ist jetzt halt anhand von unserem Clock definiert und dass keine Fehler im System passieren jetzt können bei niedriger Spannung wenn man jetzt 10 Nanosekunden hier maximal erlaubt hat können die niedrige Spannung bedeuten die sind trotzdem in 9,8 Nanosekunden also es ist innerhalb unserer Zeit die das braucht, dass es gut funktioniert oder 9,2 Nanosekunden das ist dann halt noch besser, auch noch in der Zeit wo es funktioniert wir könnten das aber mit Absicht ausnutzen dass es eben nicht funktioniert aber mir dadurch sehen wie die Spannung sich verändert also hier in dem Fall habe ich jetzt auch auf der linken Seite ein Einbittregister auf der rechten Seite ein Einbittregister sinnloserweise ein Endgate genommen das beide Inputs zusammenverschaltet hat also eigentlich passiert nichts Sinnvolles deswegen muss man auch den FPGA-Tools beibringen das trotzdem nicht wegzuoptimieren aber wir können uns vorstellen, haben wir ein Anfangs- Anfangs-Element, das braucht vielleicht 0,1 Nanosekunden da haben wir ganz viel Verzögerung und bis dahin geht es vielleicht genau 10 Nanosekunden im schlechtesten Fall und 9,6 im idealen Fall, je nach Spannung und das kann man jetzt so schrittweise durchgehen wenn es jedes Element vielleicht 0,1 Nanosekunden braucht dann kann man mehr oder weniger wenn man was dazwischen baut, abschätzen also dazwischen baut, wer das hier wie weit jetzt die Spannungsschwankungen sind, wie hoch oder niedrig, zumindest relativ gesehen also haben wir zum Beispiel wenn wir hier am Anfang sagen wir schaffen es, das erste Register dazu zu bringen wir geben dem einfach eine 0 dann gibt es eine 0 aus danach machen wir eine 1 rein und dann wäre ja das andere Register hier einen Tag später das hat ja erstmal eine 0 drin stehen und dann machen wir einen Übergang von 0 auf 1, dann fängt an die 1 von links nach rechts durch diese ganzen Elemente durchzulaufen wenn es die Spannung niedrig ist also wenn man mal eine schöne Tabelle anschaut bei niedriger Spannung wird es jetzt heißen praktisch in b kommt eigentlich immer die 1 an wir hatten ja gesagt b an der Stelle okay oder nicht immer aber fast immer eine 1 wenn man 10,1 nanosekunden oder 9,7 nanosekunden braucht aber bei a kann es halt sein wenn die Spannung dann zu niedrig ist steht da eben immer noch eine 0 von vorher drin das kann man jetzt weiter so machen und dann ganz viele Bits machen dann hat man richtig schön ein Sensor gebaut und zwar nennt sich das aber auch Time to Digital Converter das heißt wir können jetzt am Anfang anstatt irgendein Register zu nehmen das 0 und 1 macht einfach den Takt nehmen der Takt macht ja eh schon 0 oder 1 und der Takt läuft dann eben durch die Initialen Delays erstmal durch und am Schluss haben wir ne sogenannte observable Delay Line weil meistens interessieren uns ja nur die letzten Bits und nur die schwanken tatsächlich und dann bauen wir überall diese Register dazwischen und in dem speziellen Fall ist an irgendeiner Stelle halt noch 1 und ab irgendeinem Zeitpunkt steht dann eben 0 drin und am Schluss können wir dann 64 Bit zum Beispiel nehmen und können dann in dem Fall sagen ok das encodieren wir jetzt als 2 Bit, weil 2 1 so weit rein propagiert sind und so haben wir eigentlich ein Spannungssensor ich denke die Idee haben hier vorne zumindest die Leute wohl verstanden ok da kann man damit auch da so Spannungsabfälle wenn man jetzt einen massiven Abfall hat sieht man das tatsächlich dann im System und sieht so einen schönen Abfall hier und wie sich die Spannung auch wieder erholt jetzt würde es vielleicht auch in Codes sehen ich habe noch 10 Minuten Zeit ok wobei ich glaube nicht allen Code erklären werde es fällt auch etwas klein sieht es da hinten hier da ja geht ok gut also wir haben es ist auch nicht der komplette Code aber bei VHDL brauchen wir eben so eine Art Prototypenheader oder nicht Prototypen sondern die wie kann man es nennen Parameter Portmap das sind die ganzen Portverbindungen drin die habe ich jetzt auch weggelassen wir sollten Don't Touch verwenden sonst wird auch irgendwas wegoptimiert das allein reicht aber nicht danach müssen wir in unserer Architektur irgendwann unsere Signale eben deklarieren die wir verwenden wollen wir hatten Relative Location Constraints und Bell Constraints diese Bell Constraints sind dann für diese Register also hier auf der rechten Seite das sind Register, das in der Mitte sind die Carry Elemente das Rote sind letztendlich die Verbindungen die wir haben wollen um jetzt innerhalb des Slices Register zu platzieren, muss man dann Bell verwenden ansonsten sind die durcheinander gemischt S ist zum Safe Net also das ist irgendwie so eine Art Keep die Signale beibehält und nicht entfernt werden manchmal werden sie trotzdem entfernt Keep macht sie extern Keep funktioniert normalerweise immer aber Keep auf diese Zwischensignale zu machen würde heißen dass die extern im Slice sichtbar sein müssen und dann kann sein, man kann die Verbindung gar nicht mehr erstellen also Keep heißt, dass wir mehr zu den Slice haben und Verbindung am Ausgang vom Slice macht es Keep Constraint dass die Signale auch aus dem Slice rauskommen also Zwischensignale im Slice sollte man damit nicht unbedingt belegen aber manchmal muss man dann zumindest zu Safe Net nehmen dass nicht auch irgendwas doch wegoptimiert wird hier unten habe ich nur zur Vereinfachung ein Array gemacht mit den Namen, weil wir müssen irgendwie Strings verwenden, dass später die Software das verwendet, also wir machen Attribute mit Strings also zwar true und yes einmal warum auch immer und wir haben dann ein Array in dem ich jetzt eben die Strings auch abspeichern die man dann verwenden kann für diese Flip Flop Bell Constraints so jetzt sind jetzt die Constraints und das ist mehr oder weniger die Implementierung von zumindest diesem Teil hier links also wir haben einmal eine Delay Chain, dann nenne ich das diese Carry Elemente wir laufen die Carry Elemente durch ich kann jetzt in dem Generate kann ich auch das Arlog verwenden und kann dann in Integer hochzählen an welcher Stelle eben das jetzt platziert werden soll dass sie so nach und nach platziert werden und hier habe ich jetzt eine Verbindung und die Verbindung sagt eigentlich nichts anderes dass mir von dem Carry Element eigentlich gar nichts wirklich groß verwenden wollen außer also das Carry Element ist dazu gedacht dass man damit Adder implementieren kann oder alles was irgendwie die Carry Logik hat wo ein Signal lang durchläuft das machen wir gar nicht wir setzen alles was in dieser Logik drin ist so nur ein Signal durch Mucse durchläuft die aber keine Veränderung an dem ganzen Signal machen das soll wirklich nur zur Zeitverzögerung dienen das heißt wir haben hier wirklich nur solche Zeitverzögerungen Elemente die von unten nach oben durchlaufen und dann die Zwischen-Elemente rausziehen auf Register und die Register stehen hier unten im Code die sind jetzt auch sehr ähnlich gemacht auch mit irgendeinem i das hier halt durchläufen müssen da halt irgendwie durch 4 teilen oder das pro Slice haben wollen jeder Slice hat 4 davon dann machen wir eben diese Spell Constraint um dann eben immer wieder die 4 Elemente nacheinander in dem Slice aufzufüllen und ja so wenn jemand den Code dann genauer angucken will kann dann auch haben wenn er mich fragt von daher reicht das soweit denke ich mal so sieht jetzt eins dieser Carry Elemente im Detail aus das heißt hier links ist der Mucse immer permanent gestalt gemacht, wir verwenden also tatsächlich nur diese Mucselemente und das Signal das hier durchläuft und am Ende verwenden wir irgendwelche Register und das sind dann letztendlich unsere ganzen Outputs und die nacheinander so wenn man das jetzt dann auf die FPGA Primitive Map den Sensor, den wir vorher gesehen haben haben hier unten jetzt halt irgendein initiales Deal da habe ich alles mögliche Elemente verwenden die brauchen einfach eine Weile an Zeit und am Schluss machen wir dann auch die Register wirklich raus, dass wir das Signal anschauen können so jetzt kann man das für ein Side Channel Angriff verwenden das werde ich hier vielleicht nicht mehr alle Details erzählen da die Zeit nicht mehr so lang reicht aber ihr habt vorher das Prinzip ja schon gesehen wie Side Channel Angriffe funktionieren die funktionieren intern halt genauso wie extern weil wir ja indirekt auch Spannung messen das ist auch ein veröffentliches Paper zusammen mit Leuten aus Bochum das ist auch Open Access verfügbar wenn das jemand finden will dann kann er mich auch fragen oder vielleicht steht es dann auch später online drin weiß ich gar nicht jedenfalls haben mir zwei Floor Plans untersucht einmal ein IS-Modul mit dem Sensor der ziemlich nah dran ist und einmal ein IS-Modul mit dem Sensor der ziemlich weit weg ist also wenn ihr vorher diesen Spannungsabfall gesehen hattet im Diagramm, das war nur ein extremer Fall von einem sehr hohen Spannungsabfall ob man jetzt IS wirklich sieht sichtbar macht auf dem Sensor, das war zu dem Zeitpunkt für uns noch nicht klar deswegen haben wir verschiedene Sachen ausprobiert das könnte man sich im rechten Fall vielleicht auch denken, okay das könnte Nutzer A und B sein in irgendeinem System jedenfalls unsere Referenzmessung wurde extern mit dem Oszilloskop gemacht und ihr kennt die Correlation Diagramme schon das heißt hier sieht man eine gute Correlation von dem Secret Key auch über die Traces und wir brauchen sehr wenige Traces nur, dass es gut funktioniert dann haben wir auch das ganze mit dem nahen Sensor probiert im FPGA, man sieht hier das sieht schon etwas unschöner aus es ist nicht ganz so perfekt weil es halt eigentlich kein richtiges Oszilloskop ist wir hatten auch einen thermischen Drift hier noch drin, den haben wir nicht raus korrigiert wir hatten gemerkt, dass es teilweise auch wieder schlechter wird wenn man hier rechts das Diagramm ansieht ist hier irgendwie sowas drin meistens wird es eher besser über die Zeit der Sensor war mit 96MHz getaktet und AIS mit 24MHz also wir haben schon mehr gesampelt mit dem entfernten Sensor hat es aber auch ganz gut funktioniert bei 96MHz in dem Fall hier jetzt am Anfang korreliert es noch nicht so gut aber mit sehr wenig Traces kann man schon den Secret Key extrahieren also mit weniger wie 1000MHz und dann haben wir zu guter letzt auch probiert mit der exakt gleichen Taktrate wie das AIS-Modul den Sensor zu clocken und das hat auch relativ gut funktioniert da muss man dazu sagen, dass der Sensor eigentlich nicht sampled wie ein traditionelles Oszilloskop weil man halt die Verzögerungszeit und die Verzögerungszeit findet über den ganzen Taktzyklus hinweg statt das heißt was wir eigentlich messen ist tatsächlich der komplette Durchschnitt der innerhalb von einem Taktzyklus passiert das heißt es ist gar nicht so extrem wichtig das exakt zu sampled das ist ein Oszilloskop das ist im Prinzip sogar ein Vorteil ist zumindest so meine Vorstellung davon wir sind da immer noch ein bisschen dran zu überlegen warum das eigentlich dann ganz gut funktioniert zum Teil ist es natürlich auch synchron gewesen wir haben aber auch schon das Nichtsynchron probiert leider brauche ich noch mindestens 5 Minuten oder 10 eher 5 ich probiere es mal jetzt so Side Channel Angriffen in Summary also fpga zu fpga Power Side Channel sind möglich was man aber auch sehen kann ist tatsächlich Software die im Armcore läuft also das ist jetzt so ein fpga SOC wo hier irgendwie 2 Cortex A9 Prozessoren sind und wenn die jetzt kein richtiges RSA sondern eben so ein Multiply und Square Algorithmus macht also eher so Textbook RSA OpenSSL ist tatsächlich ja gegen solche Dinge schon protected auf irgendeine Weise dann kann man tatsächlich simples RSA auch angreifen will ich jetzt auch nicht näher drauf eingehen es geht auf jeden Fall der nächste Schritt was ich noch sagen wollte sind eben Default Attacks das hatte ich ja vorhin schon gesagt wir können auch ein System so Denial of Service machen auf DR also ein fpga Crashing also mit wenigen Ressourcen machen wir nochmal so mit wenigen Ressourcen ohne Spezial Tools das ist vielleicht wichtig zu erwähnen weil klar es gibt akademische Tools mit denen man diesen Bitstream komplett manipulieren kann da kann man dann eventuell sogar Kurzschlüsse einfach im fpga rein programmieren aber die Idee ist dass man das einfach durch normale Hersteller Tools machen können und durch das Verfahren das wir jetzt verwenden brauchen wir auch relativ wenig Ressourcen in den meisten fpga's so das war getestet auf mehreren fpga's und SOC boards von Xylings über Intel, Altera halt Lattice und hier sind jetzt nur Xylings fpga's abgebildet wir können auch die ARM CPUs dann damit crashen das heißt das ganze System ist dann irgendwie kaputt danach und wenn man die anderen fpga's zumindest diese beiden die gab es als PC Express Karten wenn man die im PC drin hat und wir machen das das Board irgendwie so gecrash dass wir danach den PC runterfahren müssen am Ende das Netzteil ausschalten und wieder einschalten müssen und erst dann können wir überhaupt wieder was mit den Boards anfangen also wenn ich einfach Reboot mache und danach Zugriff will, ist das Board immer noch tot also Jtech Zugriff geht auch nicht dann liegt aber daran weil der Spannungsregler von dem Board sich einfach abschaltet das ist nicht speziell jetzt so spezielle fpga also das haben wir damit gemacht wir können jetzt die Ringoscillatoren konfigurieren wir verwenden im Prinzip den Effekt wie vorher gesagt ein hoher Strom in kurzer Zeit aber nicht jetzt den Ringoscillator selber weil der tockelt ja jetzt intern irgendwie beliebig schnell takte der jetzt eben im Ring und sondern wir verwenden mehr also wir verwenden die Ringoscillatoren mit einem Enable Signal und ganz viele davon mit Generate wie ich auch schon vorher erklärt hab wenn wir jetzt ganz viele davon praktisch ein Schlag aktivieren wie diesen vorher gezeigten Voltage Top messen mit den Sensoren das reicht aber nicht unbedingt ums zu crashen manchmal hat es irgendwie doch ausgereicht wo wir uns dann gewundert haben und deswegen sind wir auch erst drauf gekommen das muss wohl eine Resonanz in der Spannungsversorgung liegen die wollen wir jetzt angreifen das heißt wir machen jetzt eine Frequenz mit dem mal wiederum die Ringoscillatoren an und abschalten und verbinden jetzt praktisch mit dem Enable von den Ringoscillatoren und die Frequenz ist definiert die können wir uns raussuchen und intern laufen die Ringoscillatoren das ist uns egal, die laufen wahrscheinlich im Gigahertz-Bereich aber sie erzeugen auf jeden Fall einen hohen Strom oder brauchen einen hohen Strom wenn man jetzt das dann Frequenz-Sweep macht dann reichen bei manchen FPGAs nur 8% der Look-Up-Tables bei anderen brauchen wir 35% der Look-Up-Tables aber dann ist das System halt meistens die FPGA ist dann resettet und die Konfiguration ist weg oder der Armcore crashed und die beiden PC-Expressboards waren tatsächlich gar nicht mehr verwendbar bis man sie komplett ausgeschaltet Stromlos gemacht hatte also permanent bis zum Power-Seikeln bei manchen Boards und Armcore-Crashing auch das sieht dann, wenn man gleichzeitig zu einem Board mit JTech verbunden ist mit diesem Chipscope, dann kriegt man sowas hier ist nochmal also das ist jetzt in dem FPGA wo man nur 8% der Ressourcen gebraucht haben da haben wir einen gewissen Bereich in Frequenzen, wo es eigentlich immer crashed das sind eher die niedrigeren Frequenzen und ab einer gewissen höheren Frequenz ist das System so wie es aussieht eigentlich stabil wir haben das auch extern natürlich gemessen am Ostsee sieht, wir wundern uns ein bisschen warum direkt jetzt hier der Spannungsregler aussteigt, weil was man am Ostsee sehen kann ist, dass man eben eine Schwankung und ab und mir hat hier auch das Signal dass die Ring-Hoscillatoren aktiviert und die Spannung die hat zwar schon ein relativ hohen Ausschlag aber die fängt dann irgendwie an irgendeiner Stelle einfach runter zu gehen wissen wir jetzt selber nicht genau warum das ist an irgendeiner Stelle ist dann der FPGA auf jeden Fall dekonfiguriert, weil wir haben ein Pin, der immer high ist der geht dann auch auf 0, weil der FPGA wohl die Konfiguration verliert langfristig bleibt der Spannungsregler dann halt auf 0 bei diesen 2 PCI Express-Karten zumindest jetzt komme ich zum Fazit und ihr könnt dann endlich Fragen stellen und ich habe nicht mal so viel überzogen 5 Minuten, ok also zum Fazit wir haben erfolgreiche Angriffe auf elektrischer Ebene innerhalb FPGAs zeigen können dazu gibt es 2 Veröffentlichungen die Angriffe können rein durch Software eingebracht werden wir können halt ausreichend für Side-Channel-Angriffe und wir können Aktivität generieren die für einen Crash, also Denial of Service ausreichen also kann man sagen, dass FPGAs so auf jeden Fall noch nicht wirklich für Multi-Useranwendungen verwendet werden können weil das potenzielle Probleme mit sich bringt als Ausblick was man dagegen tun könnte eventuell können wir jetzt Bitstream Checking anfangen, also so ein Viren-Scanner für Bitstreams, naja nicht unbedingt die tollste Idee wahrscheinlich aber noch nur heuristisch und das mit Satz-Säuber zu machen braucht wahrscheinlich dafür Tage wenn man beweisen will, dass die maximal Aktivität dann natürlich auch nur unter gewissen Annahmen nach physikalischen Modellen zu viel ist könnte man sagen, das ist zu viel aber defaults könnte man zur Laufzeit vielleicht frühzeitig erkennen weil der Drop geht ja schon runter dann könnte man irgendwie was tun, vielleicht um was abzuschalten aber falls jemand jetzt einen bestimmten Bereich hat, dann kriegt er vielleicht einen Takt in den Bereichen, wir könnten diesen Takt abschalten aber eigentlich kann sich ja auch selber jemand einen Takt bauen mit Ringoscillatoren also kann man es auch nicht unbedingt so verhindern Side-Channels gibt es klassische Vermeidungsstrategien Masking und Hiding also man versucht algorithmisch oder implementierungsmäßig die Leakage zu reduzieren haben wir noch nicht getestet und jetzt bin ich aber auch am Ende vom Vortag anstellen. Vielen Dank Dennis, ja das mit dem Viren Scanner klingt sehr interessant, besonders mit FPGAs, da denke ich sofort an große Möglichkeiten im Bereich Blockchain-Technologie Okay, haben wir noch Fragen aus dem Publikum? Direkt hier vorne Hallo Dennis, die erste Frage wäre in welchem System ist ein schon wirklich Multi-User-Betrieb auf FPGAs bekannt und die zweite für die Korrelation braucht es ja eine Synchronisierung der Daten in einer Form, wie kriegst du das bewerkstelligt? Ja also ich muss sagen, das ist halt wie gesagt eher ein akademisches Projekt gewesen, dementsprechend haben wir nicht versucht ein echtes System anzugreifen und mir ist auch momentan kein Multi-User-FBGA System bekannt, es gibt allerdings schon zumindest unzählige Papers und es gibt auch Vorträge wo Microsoft als Keynote in der Konferenz hält wo sie sagen wir wollen Multi-User-FBGAs machen machen sie jetzt noch nicht aber da gibt es auf jeden Fall viele Pläne dazu, die sind damit zumindest jetzt vorläufig nicht so leicht zu bewerkstellen, da muss man halt noch mehr machen und es zur Synchronisation das war, haben wir halt also was Problemes in Sidechannel angriffen, ist dass wir ja vielleicht ein System haben, wo wir gar nicht wissen was drin vor geht, wir müssen jetzt aber wissen wann exakt der AES Algorithmus anfängt zu rechnen, weil wir hatten ja Synchrone-Zeitpunkte, wir gehen davon aus dass alle Traces zur selben Zeit praktisch auch wirklich die gleiche Berechnung praktisch ausführen und das haben wir aber uns nicht damit befasst es ist tatsächlich halt ein Problem, wenn man jetzt wirklich einen voll realistischen Angriff macht ja, hallo zum Beispiel mit den FPERs in Handys natürlich noch eine Frage und zwar in wiefern ist es da wirklich möglich dann so zu führen, also ich denk mal ich weiß jetzt nicht wie und man dann die FPER-Programmierung in den Handys als Mail-Ware oder wie auch immer verändert haben haben sie sich damit beschäftigt Ach so, ich denk das mal das momentan wahrscheinlich noch nicht kann, wie gesagt, ich habe dir gesagt bis jetzt gibt es keine kommerziellen Systeme von denen ich jetzt weiß, dass sie direkt angreifbar sind ich glaube die sind nicht frei programmierbar Hi was kann der Grund sein, dass auch bei geringer Schaltfrequenz von den Ring-Ostylatoren der FPGA crashed, weil du meinest ja, das sei so ein Resonanzeffekt mit der Spannungsversorgung aber es würde ja bedeuten, dass nur bei bestimmten Frequenzen der FPGA crashen müsste ja, da muss ich sagen, bin ich mir auch nicht ganz sicher drüber, warum das passiert bei geringen Frequenzen ich glaube eigentlich reicht es sogar aus wenn man spontan alle Ring-Ostylatoren aktiviert, also in manchen Fällen hat es schon mal eben dazu geführt, dass durch das das mir das oft wiederholen erhöhen wir halt die Wahrscheinlichkeit, dass es mal funktioniert so haben wir noch weitere Fragen aus dem Publikum ja, dann vielen Dank für diesen umfassenden Vortrag es war sehr interessant einen großen Applaus nochmal für Dennis, bitte und euch wünsche ich viel Spaß an den weiteren Vorträgen und noch viel Spaß auf der GPM