 Ja, willkommen zur deutschen Übersetzung von High Show und Skriptus Software, also Hoch-Sicherheits-Skriptus-Tof-Ware von Daniel G. Bernstein und Tanja Lange. Am 6.30 Uhr kann man das Kommunikation-Kongress in Leipzig. Alle Talks am Kongress werden live zwischen Deutsch und Englisch und manchen eine weitere Sprache übersetzt. Heute eigentlich russisch. Vielen Dank dafür schon mal, eure Übersetzer für diesen Talks sind Lukaro und André. Und jetzt legen wir los. Ja, warum machen wir uns überhaupt Gedanken über die Software-Qualität? Es gibt ein paar aktuelle Nachrichten über gehackte Kryptografie, so stark, dass sogar private Keys veröffentlicht wurden können. Und es geht auch immer wieder darum, dass das Timing sehr wichtig ist. Also hier sind ein paar Timing-Angriffe, die zum Beispiel auch erlebtische Kurven total zerstört haben. Ja, Timing and Text sind nichts Neues. Früher, als man noch ein Server eingeloggt hat und das Passwort abgefragt hat, hat er es vielleicht Zeichen für Zeichen verglichen. Und dann schaut er, wenn das erste Zeichen, was das erste Zeichen ist, AAA, BB, CC, CC, dann könnte man natürlich herausfinden, was das erste Zeichen ist, weil natürlich erst mal wird davon keins funktionieren. Aber man kann feststellen, dass die Zeit, die es dauert, bis der Server sagt, das Passwort ist falsch. Und dann stellt man fest, dass CCC ein bisschen länger braucht, um viel zu schlagen als die anderen beiden. Dann fängt man nicht an und macht weiter und probiert CAA, CBB, CCC und so weiter. Natürlich wird es immer viel schlagen und immer in einer ähnlichen Zeit viel schlagen, bis auf vielleicht COO. Und dann probiert man das dritten Zeichen durch, so lange, bis man es vielleicht irgendwann reinkommt. Und dann ist es, das war 1974, Attacke auf das Tennex-System, ziemlich lange, bevor die meisten von uns hier geboren wurden. So konnte man sich einloggen und er hat diese Charakterweise Vergleiche gemacht. Und die Zeit, die braucht, um ein Crypto-Einführung zu berechnen, ist ziemlich bekannt. Aber natürlich wird es jetzt ziemlich komplizierter, wenn man jetzt nicht nur Charakterweise vergleicht. Zum Beispiel, wenn man jetzt hier Diffy-Helmen-Argoten muss als Kryptosystem mit RSA implementiert, dann muss man natürlich hier diese exponentiale Berechnung berechnen. Und dann geht man zu seiner Krypto-Einführung zurück. Also man soll natürlich jetzt nicht die Multiplikation berechnen, sondern es gibt natürlich ein Quadratisierungs- und Multiplikations-Algorithmus, der sich die BITS anschaut, das Exponenten. Also ich möchte mir CD in BITS anschauen und ich möchte mir auch die Länge in BITS anschauen. Und dann fange ich an, das Initialisieren. Also die Nachricht Initialisieren und dann für jede Schritt macht man eine Quadratisierung. Und wenn das BIT gesetzt ist, dann macht man eine Multiplikation. Und das läuft vielleicht vom ersten BIT bis zum letzten BIT oder so. Und das ist ein Pfeifen, also die Reichweite sind also die obere Ganzes nicht eingestogen. Also deshalb minus 1. Aber da gibt es natürlich auch Probleme. Wenn man jetzt ein Angreifer ist und wenn man weiß, dass der Benutzer diesen Algorithmus verwendet, dann kann man feststellen, dass diese Laufzeit gibt einem paar Informationen über D, und zwar nämlich die Länge von D in BITS. Die Länge war so definiert, wie viele BITS hat D. Also für manche D ist das ziemlich kurd. D ist ziemlich kürzer als N, viel kürzer als V von N. Also man könnte deshalb herausfinden, dass es kürzer ist, weil einfach die Laufzeit nicht so lange ist. Außerdem gibt es hier eine Verzweigung. Und wenn dieses BIT 1 ist, oder wenn es nicht, dann werde ich einfach weitermachen. Also je nachdem, wie genau mein Zugruf ist, könnte ich sogar nachschauen, ob man diese Modifikationen macht. Und im schlimmsten Fall könnte man sogar dieses Schema von Null und Einsen auslesen. Nur daran, ob man halt diese Verzweigung eingeht oder nicht. Natürlich, normalerweise sieht der Angreifer immer nur die Gesamtzeit. Aber das ist jetzt hier von einem aktuellen Paper aus TPM Fail. Und Sie haben herausgefunden, oder Sie haben über sich geschaut, wie lange es dauert, wie lange es dauert, bestimmte Operationen durchzuführen. Und man kann sehen, dass die Großteil der Berechnungen, also für manche, für die meisten Exponenten wird es ungefähr so lange dauern. Aber wenn man eine gewisse Anzahl an vorausgehenden Nullen hat, dann ist es wohl deutlich schneller. Es gibt ein bisschen Varianten. Es könnte natürlich schneller sein, weil das D ziemlich leer ist. Also eine Eins und dann viele Nullen, dann für ich noch eine Eins. Das wäre genauso schnell wie etwas, was weniger bitzlang ist, aber dafür dichter. Aber Sie wissen jetzt, deshalb wissen jetzt nicht, ob es kurz war und deshalb schnell, oder ob es halt ziemlich leer war und deshalb schnell. Aber wenn es viel schneller ist, dann ist es wahrscheinlich beides. Also die vorangehenden Bits fehlen, also da gibt es keine Multiplikation. Also wenn man sehr schnell ist, dann hat man eine gute Vermutung, dass dieses Ding tatsächlich null war. Starke Abhängigkeit von der Länge und von der Zeit. Eine richtige Implementierung würde das nicht tun. Für uns ist aber Zeit sehr kostbar, also versuchen wir, möglichst schnell zu sein. Wir nehmen eine 0x36C3, also 14.019, da scheiben wir jetzt näher hin und dann multiplizieren wir das. Vom Top-Bit herunter, auf den RSE-Loop herunter. Aber du willst dir ein paar Multiplikationen aussparen? Dann gibst du dir zwei Bit auf einmal. Du komputest zuerst um das C² C4. Um das Ganze zu komputieren, du kannst nicht zwei Mal das Quadrieren auf einmal. Das erste Schicksal, der ist nur 0, da fängst du mit C3 an beim zweiten. Das ist ganz einfach. Jetzt gehen wir wieder zwei Bit weiter. Da unten kommt die vierer Potenz da unten, Position 1 und 2. Da gibt es C wieder, auch 4, mit C². Es ist so wie beim vorherigen Loop, nur halt zwei Mal. Also wir sehen, wenn das nächste Bit schon gesetzt ist, dann können wir multiplizieren auf C² C3 C4. Und das reduziert eindeutig die Multiplikationszeiten. Also die 14.019 geht mit 10 Number of Scorings vier Multiplikationen statt sieben. Also fast halb so lange. Diesen Abstand nennen wir einen Fenster. Wenn man sich die Spuren davon anschaut, dann gibt es noch viel weiter als eine lange Nationale Boxen. Wo 12 ist. Unten links ist. Die Windows gehen viel schneller auseinander. Wenn du vier Bit und du musst 15 Käse haben, muss du 16 Multiplikationen haben, das dauert ein bisschen länger. Aber du sparst derzeit. Also die Länge weißt du noch nicht, ob die Bits gesetzt wurden oder wie sie gesetzt wurden. Was tun die paar Bits? Also du willst das nicht liegen hinter den RSA Key und dein DH. Aber das geht schon. Mit einigen Wissen, du musst wirklich gut sein. Oder du musst irgendwas in Gröber kaputt machen. Oder wenn du mit RSA mit CAD Ägyptien hast, dann gibt es ja keine Kombinationstricks, die man machen kann. Da habe ich schon vor ein paar Jahren gelernt, wie man das kombinieren kann. Wenn du ein paar Bits weißt von D und P, dann kombinierst du sie. Dann kann man schnell mehr lernen. Wo es wirklich daneben geht, wenn du Signatures nimmst von DSA oder ECDSA. Die sind extrem fragil, dass sie sieben. Also wenn du dir anschaust, die Multiplikationen, die du nur ein einziges Mal brauchst, eine Single Generation einmal, nimmst sie, tust deine Explotation und dann tust du was anderes mit der Nummer. Diese einmal Exponents, wenn sie in irgendeine Richtung Bayer ist, wenn du z.B. weißt, dass die ersten vier Bits immer null ist, dann kriegst du relativ einfach den Secret Key. Da gibt es diese zwei Papers, ein TPM-Fail in diesem November, dann Magimis, Sona, Eisenbart und Henninger. Die haben gezeigt, also auf eine TPM-Implementierung, dass das funktioniert. Du, TPM, machst die Computation in deinem eigenen Rechter, dann konnten sie die Keys aus der Ferne, also Remodely ausrechnen. Da gibt es ein zweites, den Minerva-Attack. Es gibt schon auf der Wamppage Jan Janschab, Peter Svendor und Vladimir Setlacek. Da haben sie das aus zertifizierten Smartcards gemacht. Es ist ein wirklich übler Attack, weil es mit einer ganz kleinen BIOS in den Nouncers und One-Time Scalers wurde entweder nicht getestet bei der Zertifizierung, oder waren sich nicht bewusst, dass das so einen Effekt hat. Wenn man sich die gesamte Zeit anschaut, da wurden schon ziemlich viele Bibliotheken und Smartcards und TPM, also Plattformmodule, betroffen. Wenn man das Gleiche passiert, auch wenn man Parallele-Attacken oder Cache-Zeit-Attacken macht, dann kann man eben auch herausfinden, wenn man sich den Lookup von den Werten anschaut, dann kann man sich auch anschauen, wo dieser Wert tatsächlich war und kann man schauen, ob der Prozess den Wert abfragt, ob der im Cache ist, oder ob der im Wert der Abfrag der nicht im Cache ist und dann kann man auch herausfinden, was wird in den Exponenten herausfinden und das auch zurückrechnen. Das sollte hier ein Konstruktiv-Autoge sein. Es ist 80 Prozent konstruktiv, also lassen Sie uns mal darüber sprechen, wie wir das jetzt hier fixen. Für alle unsere Krypto-Implementierung haben wir eine obere Grenze. Es ist eine ASL-Entschlüsselung, also unsere erst Arkeys. Wir sind ja 4096 Schlüssel, Bitchlüssel zum Beispiel, also wir haben eine obere Grenze, wie lange das D sein wird. Also warum benutzen wir nicht einfach das? Wir machen diese Laufzeit von der Schleife unabhängig von der Länge, also je nachdem, wie viele Bits wir in N haben, nicht wie viele Bits wir in D haben. Wir erzählieren unsere Nachricht mit dem Ciphertext und dann haben wir das immer kwadriert und multipliziert, aber wir machen das jetzt anders. Wir standen jetzt erst mit 1, und wenn man mit 1 anfängt, dann quadrieren wir einfach solange 1, bis wir tatsächlich bei den Bits ankommen, die unseren D ist. Wir padden unser D auf die gesamte Länge und dann fangen wir auch mit M gleich eins, sodass wir unsere tatsächlichen Werte nicht verändern. Und dann fangen wir mit dem normalen Prozess an, quadrieren und multiplizieren, abgesehen davon, dass wir diese IF-Abfrage jetzt hier nicht mehr drin haben. Cash-Timing-Text könnten jetzt hier auch was herausfinden über die Bits oder tatsächlich sogar auch welche Bits das sind, je nachdem, wie die Multiplikation aussieht. Und was wir dann machen ist, wir verzichten auf ein bisschen Performance, wir machen jetzt eine Multiplikation für jedes Bit, nicht nur wenn das Bit CEO ist, also wenn das Bit 0 ist, und dann benutzen wir, machen wir eine Auswahl, welchen Bit wir benutzen. Also denn, wenn wir gerade benutzt haben, also das H, oder das, was ohne Multiplikation ist, also das M, und wir wollen da jetzt keine IF-Abfrage. Weil, ja, in einem Geilfall könnte sich diese Verzeihung anschauen und herausfinden, ob wir in die alte Abzeihung reingehen dann nicht. Also, wenn das Bit 0 ist, dann habe ich hier 1-0 mal M, also dann kommt da M raus. Oder wenn das Bit 0 ist, dann nimmt man 0 mal H, also bekommt das H raus. Also für das 0-Bit über den WM, aber für das 1-Bit benutzen wir H. Und wenn ich jetzt hier 1-1 habe, dann ist es 0 mal M, also 0 mal M plus 1 mal H, dann kommt da natürlich H raus. Ja, und das hat natürlich ein bisschen Nachteil, also es ist ein bisschen langsamer, also es ist genauso langsamer wie der Worst Case, sowohl in der Länge der Schleife, als auch, ja, weil wir halt eine Quadierung und eine Multiplikation in jedem Bit machen, was sonst höchstens im Worst Case der Fall gewesen wäre. Und ich habe auch etwas über die elliptischen Kurven und Tiffy-Helmen und so was gemacht, dann kann man das Gleiche machen. Wir können mit 1 initialisieren und dann einfach mit dem Generator multiplizieren. Wenn wir das Gleiche mit elliptischen Kurven machen, dann werden die Dinge ein bisschen komplizierter. Ja, wenn du jetzt vor 5 Jahren hier warst, dann habe ich einen Vortrag über elliptische Kurven und da haben wir uns ein bisschen über die Via-Straßen-Kurven aufgeregt. Diese Via-Straßen-Kurven sind deshalb durft zu implementieren, weil man muss über diesen Extra-Punkt sprechen. Also werden hat es dann eine nette Kurve, aber es gibt einen 40. Punkt, nämlich diesen Unendlichkeitspunkt. Und dieser Unendlichkeitspunkt macht viele unsere Archivität kaputt. Also da haben wir keine schönen Formeln für, wo man sagen kann, das ist unser neutrales Element. Und wenn man da anfängt, kann man das einfach verdoppeln, bis irgendetwas Schassätiges kommt. Also die meisten Formeln haben genau diesen Punkt als Ausnahme, sodass man da nicht initialisieren kann. Es gibt da Umwege da auch mehr rum, aber der Standardweg ist nicht so einfach. Wenn man jetzt hier etwas Kurven anguckt, dann ist das neutrales Element einfach ... Man hat diesen Punkt oben auf 12 Uhr, man kann einfach den nehmen, also für etwas Kurven ist alles sehr leicht. Und auch bei Montgomery Kurves sind zum Beispiel diese berühmte Kurve, die man auch im Telefon benutzt, die Peter Montgomery Formeln benutzt. Und da kann man sogar was einsparen. Also man kann eine Addition und eine Verdoppelung für jedes Bit machen, genauso wie bei der Quadrierung. Das ist einfach nur damit, dass wir unsere Mathematiker an Lebenszeit-Einstellungen haben, damit uns keiner ersetzen kann. Also es ist alles dasselbe, es ist Addition und Verdoppelung, nicht mein Punkt. Aber man bekommt diese Kombination aus Additionen und Duplikationen für weniger Kosten, als es sonst kosten würde. Es ist gar nicht mal so schlimm wie bei ASA oder Diffie Helmen. Also der Grund, warum diese 25-19-Kurve verwendet wird, ist einfach, weil sie so effizient ist und am schnellsten implementieren und es ist doch einfacher umzusetzen. Wir bräuchten eine zusätzliche Motivation für Konstantzenzeit. Wenn man herausgefunden hat, was, wie lange dauert, gewisse Tiefen, wie lange dauert, wie lange dauert, wie lange dauert, wie lange dauert, gewisse Tiefen sollten nicht forcieren. Also wenn du weißt, du hast jetzt mit DEC eine Zeit X braucht, dann wirst du es nicht in ein infinite Loups legen, so wie das, wie man auf einem Windows Server in ein DOS fährt. Diese Timing-Attacks sind offen in OpenSSL und es ist ein paar andere Crypto-Libraries. Ja, die haben auch einen empfindlichen Timecode. Was die Leute sagen, sie versuchen es in einer bestimmten, immer der gleichen Zeit zu tun, damit man keine Zeitunterschiede herauszieht. Z.B. RC4, das ist schlechte Crypto. Ja, das ist schlechte Crypto. Aber es wurde eingeführt, mit der Behauptung, es ist eine Great Crypto. Ursprünglich war es proprietary und dann was liegt und dann jener hatte das, das ist stark und das ist cool, das ist konstante Zeit und wie checkt man diese Dinge? Also die Encryption strenger war das ein anderes Thema. Also verwendet kein RC4. Dieses Beispiel ist auf RC4. Wird bitte. Schauen wir mal, was der Code tut und dann schauen wir mal, was der Code macht mit. Das ist der Start zu RC4 verwendet. Der ist im Platz 32 Bit. Ja, 32 Länge ist in der ganzen Ordnung. Dann lockiert, dann wässt du den zu, dann lockiert. Es gibt zwar frei, aber initialisiert ihn nie wirklich. Okay, Work in Progress. Und ein expandierter ihn, da macht er diesen Expansion Prozess, diese RC4 Key Struktur und da sollte ein bisschen Encryption dahinter passieren, ist aber auch noch nicht da. Aber das kann man immer noch kompilieren und da kommt Beiler mit normalen Options wird da nicht drauf kommen, dass der RC4 Key solange nicht das System crasht wird dann das Kommentar los kompilieren und dann kann man das Unterwell mit laufen lassen. Da kann man checken die Memory Problems Also arbeiten Zeug auf Binaries also das funktioniert auf einer Binärenposition, musst keine Validitation Process nehmen, den Code, den du hast und du musst den nicht rekompilieren oder gar nichts, du nimmst den einfach und nimmst den in deinen Code hinein und er wird funktionieren er wird allokieren, expanden, interpretieren wenn die Maschinen Befehle durchgehen und welcher Memory darf ich jetzt nehmen und welcher nicht, wo sitzt Valgrind drauf, du fährst nicht davor, nicht danach Valgrind versucht irgendwie Jack zu halten von dem, wo deine Pointe hinzeigen das wird dir vielleicht oder hoffentlich sagen, was man nicht tun soll und nehmen wir, du hast keine nicht initialisierten Datenset und du verwendest den als Pointer oder du aus deiner Branche, also ein FNLs oder eine Brunch Condition oder dann wird Valgrind einen Fehler auswerfen und das wird in diesem Code dieser Array, der ist nicht digitalisiert Valgrind wird das werden alle diese nicht initialisierte Data in innerhalb des RC4 Key und dann wird er das als Error Code zurückbekommen und er wird sagen User Verwendung nicht initialisierter Werte, das heißt ihr habt irgendwelche Array-Rechnungen gemacht also für den Sinn machen wenn Valgrind sagt, da will ich nicht drüber fahren meint er das ernst oder so oder wenn i nicht digitalisiert ist aber er sagt einfach nur, das ist ein Fehler und das solltest du nicht machen also noch einmal wenn du einen anderen Fehler machst dann wird er wieder dasselbe sagen weil i nicht digitalisiert ist aber hey, das ist genau das was wir wollen um diesen RC4 Key ist das Constant Time Code es wird irgendeine diese Information in dieser Key wird irgendwie abgeleitet aus dem Code für die Brunch oder wird der etwas eingesetzt aus dem Mann wo man einen Cash Timing abbreiten könnte man du fixierst das wirst du RC4 weg oder fixierst deine Software und wenn Valgrind sagt, ist das in Ordnung ja, also doch ein fröhlicher Talk wir haben jetzt hier die fröhliche Situation dass wir doch Constant Time haben für die Exponentierung und für die Skalare Motivation unter ein paar Bedingungen und zwar das eine ist die Arithmetik also man muss die Berechnung am Ende implementieren und man muss diese Integer Algorithmus in Constant also Constant Time implementieren Valgrind wird jede Instruktion einzeln befolgen es gibt noch eine andere Bedingung und zwar das der Prozessor der Prozessor sagt ich mache jetzt hier diese Multiplikation ich mache jetzt hier die Division ich mache eine Audition wenn man jetzt irgendwas hat wo der Prozessor sagt wenn man in einem Arbeitsschritt dann ist er okay also man schaut sich die Bedienungsanleitung an die Referenzcode oder auch das Referenzhandbuch und schaut sich an wie lange dauert es für eine Multiplikation, für eine Audition das kann man sich anschauen wenn man darauf zugefahren hat aber was ist mit anderen Prozessen also ich hatte einen Armstudenten der sich diesen Cortex M3 anschauen musste der ist ein Low End Arm Prozesse der hat auch eine nette Implementierung von den elliptischen Kurven und wenn man haben man jetzt eine Notifikation hat wenn man 2 32-Bit Eingaben hat und eine 64-Bit Ausgabe, dann schaut man sich diese Anzahl an Zyklen dann sieht man 3 bis 7 Cycles, also Zyklen und Fußnote C Fußnote C sagt, dass das könnte natürlich früher terminieren abhängig von der Größenvariante also die die im schlimmsten Falle bis zu 7 Zyklen und natürlich ein Student der Zeit hat kann man das nicht alles testen lassen also hat er diese Flow Chart entwickelt der Cortex M3 gibt einem Werte zwischen 3 bis 7 Zyklen gibt einem jeden Nummer zwischen 3 bis 7 Zyklen und außer 4 je nachdem welche Abzeugung man nimmt und je nachdem ob irgendein Argument 0 oder 1 ist oder so ja, in dieser Situation hilft einem Volgren nicht, das ist halt abhängig vom Prozessor ja, das passiert wenn wir überlegen uns einen konstruktiven Talk zu machen 80% Positiv, ja und dann sprechen wir darüber und stellen fest, na es sind wir doch alles kaputt und es ist irgendwie traurig es ist sogar noch schlimmer es ist nicht nur, dass die Tools nicht das tun was wir tun wollen es geht nicht nur darum, dass es hier nicht in die konstantere Zeit ist sondern der Code ist sogar korrekt wir haben jetzt die Hälfte des Vortages verwendet um irgendwelche Timingetext zu sprechen und die kommen immer wieder in den Nachrichten vor dann gibt es noch mehr CVEs die nicht nur Timingangriffe sind sondern wo es auch, ja gut, lasst uns mal darüber sprechen also Kryptomem kommt das ist eine Funktion innerhalb von OpenSSL die gesagt, es wäre ziemlich peinlich wenn OpenSSL diese 1-byte pro Schritt Passwortüberprüfung innerhalb des Codes also Kryptomem kommt war schon immer bei OpenSSL und der macht angeblich genau das, nämlich konstante Zeit Vergleiche von 2 Strings aber nicht alles in OpenSSL macht also ein bisschen konstanter Zeit aber das ist ein konstanter Zeit und die Implementierung hat ein Fehler und zwar also die kombiniert vergleiche man nur den letzten Bit von jedem Byte also den, ja genau die wissen was PA-Risk-Prozessor sind und es ist eine super Idee für OpenSSL der Assembly-Code ist um Byte-Away zu vergleichen auf einem PA-Risk-Prozessor ich weiß nicht ob irgendjemand schon mal ein PA-Risk-Prozessor benutzt hat okay zumindest 10 Hände sind oben also ich bin beeindruckt das ist jetzt nicht der berühmteste Prozessor aber er existiert und man kann Assembly-Code dafür programmieren und vielleicht kann man sogar ein paar Maschinen finden wo man diesen Code ausführen kann und das ist jetzt nicht krass man kann natürlich Compiler machen auch Dinge häufig kaputt aber auf der anderen Seite zeigt diese Partikul... also diese besondere Implementierung dass auch Menschen Fehler machen also was zeige ich dieser Fehler dass ermöglichtes einem Angreifer Nachrichten zu erfinden die die als korrekt angenommen werden in weniger Zyklen als garantiert bei den Sicherheitsangaben in dem System also wenn wir jetzt ein 128-Bit Authenticator haben am Ende der Nachricht und dann kommt dieser Crypto Mem um halt eben das zu überprüfen und dann wird dieser Authenticator überprüft und wird dann verglichen mit Crypto Mem mit dem was vom Netzwerk reinkommt und wenn jetzt jemand die Nachricht wenn jetzt jemand die Nachricht gefälscht hat dann sollte man nicht möglich sein das zurückzurechnen und dann kann man jetzt dieses Crypto Mem kommt auf seinem Crypto auf dem und dann kann man sich diesen Authenticator verglichen mit dem korrekten Authenticator und es wird immer nur das letzte Bit in jedem von den 16 Bytes verglichen und das Vergleich nur des 16 Bits das entstellt mit einer 228 228 Möglichkeit das zu hacken hatte er 2 hoch 16 Chance also man muss nur 2 hoch 16 Versuche machen anstatt zu 128 ja 2 hoch 16 ist natürlich viel weniger Sicherheit als 228 also es ist ja also als klassische Brötische Unterformulierung formuliert ja es ist natürlich nicht was PiaWisk von allen benutzt wird, aber Intervit von allen benutzt und ja PiaWisk war ganz in Ordnung da lief die Sande wie ist das Park drauf ich glaube nicht dass das irgendwie gibt es doch welche aber Intel hat einen neuen Instruction Set der wirklich populär ist implementiert in seinen Prozessoren beim Verwend von AVX2 das ist die 256 da gibt es eine Implementierung von 1024 Bit Moduli in OpenSSL und der Code aus Juli 2013 wurde 2017 als Overflow-Bug was sind die Folgen diese Overflow-Bug das Security Level sinkt die Attacke gegen DH1024 werden gerade noch als möglich angesehen wie viele Zeit was heißt das ein Tag auf deinem Laptop oder brauchst du ein Jahr auf dem Cluster ich will wissen wie lang das ist das ist keine Antwort da auch im Advisor wie es das nicht wirklich ausdefiniert das sagt man sollte DH1024 nicht verwenden aber die Analyse schlägt vor das könnten die Attacke gegen diese der Schwierigseilensaktus-Advisory und werden nicht als möglich angesehen was ist da passiert da gibt es ein Regional Crypto und da gibt es einen Bug der macht ein anderes Cryptosystem nicht falsch aber ein anderes dieses Cryptosystem ist einfach neuer als das andere also ist es jetzt sicher und wird es sicher sein oder nicht hat sich irgendjemand das wirklich angeschaut wenn wir ein neues Cryptosystem haben wollen wir das ja zerreißen und in jede Menge Review legen und es ist wirklich wichtig dass das alles durchgecheckt ist ja mit vielen Menschen verwenden DH1024 und das heißt viel das sollte es nicht und die sollten Cryptocurves verwenden und wir müssen halt eben viele DH1024 und da gibt es so eine Haufen Papers die das analysieren was heißt das jetzt das heißt naja das heißt eigentlich wir haben uns das angeschaut und wir verwenden das und ach glaubt uns einfach wenn ihr es nicht kaputt machen könnt das ist dann schon in Ordnung bei ein paar Wochen OpenSSL wir haben ein advisory rausgebracht für CW 2019 1551 am 6. Dezember wir haben gewusst dass das kommen wird und wir werden uns amissieren darüber wir haben einen Talk darüber aber wir wissen noch immer nicht was diese Konsequenzen in dieser Box sind das ist ein Beispiel das ist diesen CVE 2017 3738 Patch das ist korrekt der Patch add some lines saying korrekt wir bitte wo es ist halt eher alles gestimmt 100 Cryptografer die Gefahr der Quantum Computer bekämpft und wir sind schon dabei die neuen Systeme zu implitieren für example nein Falcon ist einer der neuen Systeme die da umschweren das ist PostQuantum da gab es ein Announcement im September bei einem Auto selber naja, es gibt ein paar Box und die Konsequenzen sind und die Signature liegt Information an der Private Key und alle die die jüngsten Falcon-Implementierungen hatten alle denselben Box hatten alle denselben Testvektor und man konnte sie alle checken und sie waren mit mit Security Level reduziert wir finden das raus das hat auch bewiesen dass die Methode in der wir herausfinden wie die Kryptologie evaluiert jetzt nicht immer stimmt ja, lass uns jetzt mal über elliptische Kurven nachdenken wenn man jetzt diesen besonderen Punkt hat der besonders behandelt werden muss dann muss man immer fragen kann man den überhaupt addieren kann man das besontieren in unserer Software das macht natürlich die Software viel komplexer wenn man die Signaturen gesehen haben es war ein neues System und das hat eine ganze Weile lang gar kein Einsatz gefunden was aber schon ziemlich lange im Einsatz ist also RSA also das sieht man immer noch und Dinge werden immer noch schlimmer wenn man auch sogar Gegenmaßnahmen wegen Side Channel Attacks hat dann das führt natürlich auch mal mehr Komplexität ein also das zum Beispiel was wir gerade gemacht haben mit der Artmetik vorher hat es gesagt tu das wenn das mit 1 ist wenn das mit 0 ist tu es nicht und mit der artmetischen Ausdruck wird es natürlich noch mal komplizierter also Side Channel Gegenmaßnahmen führt natürlich auch noch mal Komplexität hinzu dann gibt es diesen Vergleichspack im PIWIS Prozessor das war natürlich auch weil Leute versucht haben dass dir vergleich keine Timing-Möglichkeiten also herausgibt es gibt eine Haufen Systeme die haben überhaupt überhaupt noch gar nicht untersucht also wir haben noch gar nicht die ganzen Fallen die da die Komplexität erhöhen auf die wir aufpassen müssen die kennen wir alle noch gar nicht also es ist ein Problem von Kryptografie und dann hat man immer noch diese Anforderung von Geschwindigkeit also es werden so große Mengen an Daten verschlüsselt und entschlüsselt also deshalb gibt es so hohe Ansprüche an Geschwindigkeiten also alles daran eine Quartierung pro jedem für den Schritt wir wollen das zusammen drücken wir wollen hier was einsparen, da was einsparen das macht es natürlich auch Fehler anfällig und natürlich auch eine große Vergrößerung also eine große Vielzahl an Implementationen es gibt Implementationen für verschiedene Implementierungen verschiedene Architekturen welche mit diesen Instrukturen also welche mit AVX2 Architekturen welche mit PRS Instruktionen also es gibt weder Architektur Implementierung und nicht nur den Referenzcode wenn man sich jetzt diesen Ketchup anschaut also der hat diese SHA3 die existiert erst für neue für moderne Plattformen aber es gibt jetzt schon mehr als 20 Implementierung in der Bibliothek Google hat versucht Festplattenverschlüsselung also auch günstigen Smartphones der hat jetzt vielleicht keine Instruktion also haben sie versucht hey wir wollen natürlich trotzdem eine Festplattenverschlüsselung machen aber wir haben natürlich nur einen schlechten also wenn wir jetzt IS-Berechnung machen ohne Hardventerschlüsselung wird es auch viel Batterie verbrauchen viel zu lange dauern, viel zu lange sein und so deshalb benutzen wir nämlich jetzt einen anderen Ziffer, anderen Schlüssel nämlich die Speckverschlüsselung einfach nur wegen der Geschwindigkeitsanforderung also sind sie später nochmal umgeschwitzt auf was Besseres und dann haben sie noch eine andere Implementierung gemacht, also nochmal eine neue Code-Basis eine neue Kombinierung die man Adriane schon mit X-Touchern nennen kann, also da ist viel Code-Review und an vielen Stellen die natürlich auch Fehler einführen können wenn die das Problem daraus besteht dass es die Mathematik so kompliziert wird, die dahinter steht das würde helfen 1 plus 1 ist 2 das ist ein Kommentar aus dem Buch von 1910 das ist der Beweis 1 plus 1 ist 2 die Prinzipia Mathematica und das braucht bis zu braucht fast 400 Seiten bis es dorthin kommt, ihr könnt das alles selber lesen das Problem ist, dass die Leute die Maschinensprache nehmen und es durch komputieren die sind zu schwer wenn sie so komplex sind dass mehr Bugs drin sind ja aber es gibt Anforderungen dass man so viel Arbeit einsetzen sollte solltest du deinen Code oder deine Software und einen Formellen-Proof nicht nur dich überzeugen und deine Freunde du solltest den Computer der deine Code überprüft ja und du solltest das so tun dass dein compiler sagt ja, du hast einen richtigen Code und du hast es richtig gedrückt und richtig codiert und du solltest das entsprechende Input-Output Relation für die Software haben checken diese Instrumente funktionieren aber die Mathematiker die diese Beweisführungen unterbrochen machen mögen sie nicht es ist ein ein bisschen mühsam zu verwenden aber es ist möglich CryptoCode zu Beweisführen es ist nicht un es ist mühsam aber es ist nicht unmöglich latest ever CryptoRelease es gibt verifizierte Software für Kurve 2519 bitte selber reisen von den Slides herunter und da kann man lassen sich dann letztendlich das Basis für Dinge wie HTTPS und so und das ist relativ wichtig supportende Beamte und es gibt Beweise dafür Leute haben sich tatsächlich hingesetzt und haben Standard Beweis Methoden die Software durchgecheckt ob die Kalkulation alle richtig sind das ist eine halbwegs sichere Garantie dafür dass der Code der Maximum Assurance also es ist ja dieser Code ist nicht wirklich den richtigen Output für jeden möglichen Input die Specs sind der Prozessor ist korrekt der Compiler ist korrekt ja, der C-Compiler korrekt es gibt auch ein paar andere Dinge die man auch noch anschauen muss das schauen wir uns selber wie verifiziert man den Compiler also es ist dann doch relativ seriös weil das einzig wirklich ein Problem ist für jede Implementierung wo so das mühsamste Einzelnen darunter richtet tonnenweise Arbeit Kyrptographik Software Beispiel ist nur die Liste diese Funktionen es gibt ein paar dieser Funktionen sind fast implementiert wenn du also auf deinem Laptop ist das nicht dein Thema aber auf deinem Phone oder auf deiner Uhr wo Leistung ein Thema ist dann wird Speed nicht wirklich ein Thema sein also Stand of the Art is Speed wird nicht dabei sein schon deshalb weil der menschliche Aufwand die zu prüfen so komplex ist dass sich das niemand antun will wir könnten uns jetzt eine Stunde noch damit wie cool testen ist ok, Frage hier wie viele Leute hat sich hier anwesend haben sich hier gedacht oh shoot ich hätte oh ja jeder von uns wir hätten das länger testen sollen ja und wer hatte das Gefühl mal zu viele Tests getan zu haben ja vielleicht ein paar ja vielleicht 20 Leute hatten dieses Gefühl schon mal und wer hatte wer hat sich für beides gemeldet welche Leute haben das Gefühl zu viel und zu wenig gemacht zu haben ja also testing also ist großartig wenn man herausfindet dass testen schwer ist dann liegt es wahrscheinlich daran dass man es programmiert hat weil sonst müsste das wenn die Software gut programmiert ist das testen einfacher sein aber es gibt mehr sonst muss man mehr Sachen machen sonst werden die Tests zu kompliziert wenn man Test-Diffen-Development macht dann hat man testbaren Code die ganze Zeit und das ist ein tolles Gefühl bis auf dass es da auch ein kleines Problem gibt aber dieser Crypto-Memcom-Bug in OpenSSL den wir schon diskutiert haben bis Bit verglichen hat und das gibt uns falsche Ergebnisse für 1 von 2 hoch 16 Eingraben also wenn man jetzt 1.000.000 oder 1.000.000 von Tests gemacht hat dann wird es das 4.000.000 herausfinden oder wenn man jetzt einfach nur versucht wenn man jetzt nicht einfach nur Zufallszahlen testen und an das Fasigen sagt er dass uns klug gewählte Zahlen versuchen einfach da und da ein paar Bits flippen um dann halt irgendwie dem rechten bisschen Vergleich zu geben dann füllt man halt schnell heraus dass Crypto-Memcom nicht funktioniert und das sind nur Wege also das könnte man auch denken können während der Implementierung also es war sogar im Test-Frame-Bug eingebaut bevor der Bug eingefüllt wurde OpenSSL also der Code wurde einfach nur nicht mit diesem Framework getestet also warum haben wir diesen Bug nicht gefunden aber es war knapp man hätte den fast gefunden im Allgemeinen ist es so wenn man einen Fehler sieht dann sollte man zumindest rückblickend darüber nachdenken okay wie kann ich Tests einführen die diesen Bug finden würden und normalerweise ist es eine ziemlich einfache Antwort man fügt das einfach zu seiner Test-Suite und so und wenn man wenn man diese Tests wieder mit anderen Leuten teilt dann passt das nie mehr es ist ziemlich effizient abgesehen davon dass man testet natürlich nicht alle möglichen Eingaben und so sieht man ab und zu immer wieder Millionen von Sicherheitslöckern die der Angreiferpaar bestimmte Eingabe findet, die niemand getestet hat weil es war kein Teil des Zufalls-Tests es wurde auch nicht vom Puzzling gefunden also es ist einfach nur eine Moment wo sich der Angreifer gedacht hat wenn ich jetzt genau das versuche mit der Kondition dann wird genau das passieren weil es sich irgendwie komisch verhandelt also das wird man niemals durch Test-Testing herausfinden und auch nicht über irgendwelche Puzzling-Algorithmen also wie kann man damit umgehen was kann man dagegen tun es ist nicht so einfach und es ist etwas was definitiv Krypto betrifft also im November 2019 hat Nerfs und Zaka gesagt dass der schnellste Code für eine von den elliptischen Kurven draußen also Kurven 4,8 also wenn man eine höhere Sicherheit braucht als 22519 da ist ein Fehler der in der Wahrscheinlichkeit von 1 zu 264 findet ja das sind natürlich viele Tests und man kann natürlich 264 Tests machen also das ist nichts das man machen wird mit viel Software immer wieder und wieder ja könnte ein Attacker einen Angreifer diesen diese Lücke finden natürlich klar jetzt wo man das angekündigt wird wenn man dann wirklich im Paper sagt hey wenn hier ist ein Input wenn man den zu einer bestimmten Subproutine füttert dann fütterst du einen Fehler das heißt natürlich nicht dass der Angreifer herausfindet was er den gesamten Prozess geben muss aber man muss natürlich trotzdem gucken dass man das in Park loswilt also da sind verschiedene Eingaben und der Code gibt verschiedene Ausgaben und manche sind falsch und das sind eine ziemlich geringe Wahrscheinlichkeit und deshalb sagen sie Leute die mehr Zeit sagen also entweder muss man ein paar Tests machen die wahrscheinlich einen Fehler finden oder man muss Beweise machen was natürlich viel mehr Arbeit ist und auch viel schmerzhafter aber dafür werden wenigstens alle Bugs gefunden es gibt noch einen anderen Ansatz der ein bisschen symbolisches Testen involviert und zwar, dabei geht es darum man schaut sich Memory also Speichervergleich an jetzt nicht für PAWISC aber das ist nicht das was getestet wird ja und das ist normaler IntelliChip und in OpenSSL man kann man kann sich das durchlesen also vielleicht nicht, weil die Schriftkiste wirklich zu klein ist vielleicht seid ihr auch nicht frießend Assembly aber das ist die Berechnung die es tut für eine bestimmte Eingabe also z.B. wenn wir in der 3-byte Input haben wenn man überprüft jede Länge die man sich anschaut also für jede Länge überprüft man was macht dieser Code und für 3-byte Inputs nimmt er X0, X1 X0, Y0, X1, Y1 und X2, Y1, X2 und X2 und kommt vergleicht untereinander und wie macht es diesen Vergleich in konzentrierter Zeit ja es ist X0 und X1 also X0, Y1 und X1 und X1 also es gibt hier 3 X-order Ergebnisse und die werden bittweils zusammen geordet und das ist halt eben die Nummer zwischen 0 und 265 wenn die Zahlen übereinstimmen dann wird alles 0 sein ansonsten werden die X0s zwischen 0 und 256 sein und auch dann wird das bittweiser oder auch zwischen 0 und 266 sein dann kann man das mit 460 Bit Integer mit 480 extra Nullen umwandeln und dann kann man sehen, dass das einzelt wenn es unterschiedlich in Eingaben sind das ist natürlich ein Vorteil für ein Code Reviewer, wo man sagen kann man fängt mit dem Assembly Code an und versucht herauszufinden was es dafür bedeutet jeder Punkt macht über dem man was herausfinden muss ja so kann man diesen Input in einen gerichteten a-züglichen Grafen umwandeln kann man kann diesen Grafen analysieren und dann anschauen okay gut das funktioniert gut und das kann man natürlich für jeden für die Implementierung machen es gibt Tools, die das total einfach umsetzen können also lassen mich zum Beispiel enger vorstellen aber es hat den großen Vorteil dass es mit Beinriffs arbeiten kann und es wird von Walgoind ausgeführt und macht natürlich dann viel anderen cooles Zeug obendrauf aber dieser große rote Pfeil da oben in der vorhergehenden Folie das heißt, dass es arithmetisch macht also es nimmt das die Bernatter Datei und führt die Instruktionen aus und zeigt hey das ist das was hier passiert für deine Eingabe AOSX und Y und hier ist die Ausgabe als Graf von dieser Eingabe und das macht den Code Review einfacher weil man nicht mehr dabei nachdenken muss was mit Speicher zu gewusst oder mit Pointer oder mit den komplizierten assembly Instruktionen die Ausgabe von Enger ist viel einfacher, es gibt keine Sprünge es ist einfach komplett ausgeräult und ausgewickelt und es gibt aber eine Beschränkung und zwar Enger eben wenn es eine Verzweigung erreicht abhängig von irgendeiner Eingabe X oder Y dann sind es zwei Möglichkeiten und vielleicht nimmt man diese Abzeugung und vielleicht nicht und wenn man jetzt einen array zu basierend auf diese Abzeugung macht dann werden die das natürlich auch aufteilen und sagen es gibt natürlich diese Möglichkeiten je nachdem welchen array index man sich anschaut und das war jetzt der erste Teil des Talks wir wollen das jetzt nicht machen wir wollen keine Sachen variab der Zeit haben wir wollen einfach nur klare Berechnungen haben klare Schleifen basierend auf öffentlichen Daten und die Sequenz, die man gerade arbeitet und deshalb lassen wir das hinter uns wir wollen das sowieso nicht damit beschäftigen wir wollen uns vor Timingattack Angriff verschüssen und dann gibt es den Vorteil, dass Enger ziemlich schnell läuft und einem den entwickelten Code zeichnet und dann kann man manchmal eben sogar die Korrektheit von diesen Code überprüfen also das war nicht überprüflich aber wenn man zum Beispiel dieses Crypto Mem kommen wird es für drei Inputs sagen wird es sagen oh das funktioniert also ja ich werde einfach nur schnell wir haben jetzt auch ganz wenig Zeit ich zeige euch ein bisschen Code das ist ein Call of Crypto MemComp 3 oder 16, aber so wie man nimmt x und y z der compiler wird das nicht vereinfachen der Crypto MemComp wird aufgerufen wird mit einem Enger das ist Leitend das Memer der Code wird in Enger laufen aber du wirst statt 0 auf x und y haben setzt man Variablen ein nebenbei wird die x Variable könnt ihr irgendwas zwischen 2,5 und 1 6,2 dann läuft das mal dann siehst du mal nach dem Einsatz durch den Code gegangen ist fragst du irgendeines von diesen möglichen Bugs können die passieren und da gibt es einen Array von Automated Solvers die das in diesem Fall relativ einfach sagen können hier dieser Code letztes Leit hier was fehlt uns noch wenn du konstanten Zeit Code schreiben willst musst du immer Enger wird du immer Fan arbeiten Enger Management das ist ein Wort Spiel wird deinen Code immer in dieses DAG umwandeln und das interessierende Problem an dem man das SMT ist nicht schlag genug, dass du erkennen musst du neue Tools entwickeln die deine Referenz Code abchecken noch einen Deck für deinen Projekt implementiert und dann willst du sehen machen die 2 auch die Mobilisationen wieder original Leute geben das und es gibt das ganze Spiel hier sorry ich bin draußen es gibt hier um Sortier Code und im Moment der schnellste Intel Sortier Algorithmus für ein Integer Array ist ein neuer Sortier Algorithmus der in konstanter Zeit macht der ist 3-mal schneller als in Intel's Bibliothek wo sie das versuchen zu optimieren und der ist verifiziert um das richtige Ergebnis zu produzieren mit Tools die sich die Grafen anschauen die aus Enger rauskommen und die dann sagen okay gut das ist hinsichtlich der Programmierung wenn man sich dafür interessiert so was zu machen dann sollte man sagen wo noch niemand herausgefunden hat der ist verifiziert und das trifft den meisten Kryptocoat zu dann lass uns versuchen ob der konstante Zeit hat wenn der nicht konstant ist dann kippt es auf jeden Fall Timing Attacks und wenn der konstant ist dann lass uns Enger darauf werfen und dann den Deck anschauen und dann anschauen macht das ist dieser Graph vielleicht identisch zu einem anderen Code der was Ähnliches machen soll dass man sich anschauen ob man diese Grafen vielleicht vergleichen kann ein kleines Pfeifen kann schreiben was die Grafen für einen vergleicht und es ist eigentlich ziemlich ziemlich spaßig das ist das coole an diesem Ansatz vergleichen mit allen diesen Beweistools mit symbolischen Testen mit Enger gefolgt von die Grafen zu vergleichen das macht ziemlich spaß es ist ein spaßiger Weg um Krypto Software zu vergleichen jetzt ist Zeit für Fragen vielen Dank schon mal für eure Aufmerksamkeit aus der Übersetzer-Kabine wenn ihr Feedback habt macht es unter c3lingo oder hastec3t auf Twitter anmastet und vielen Dank wir machen jetzt eine ganz schnelle Q&A nur Frage, keine Kommentare Mikrofon 1 ist eine kurze Frage konstante Zeit die einzige Möglichkeit gegen Zeitattacken ja also man kann natürlich mehr als das machen man kann natürlich auch Randomisierung machen aber das sollte dann wieder nicht davon abhängig sein also ja man kann zwar zuhört sich schon herausfinden kann bevor das Ende der Person erreicht das hat der Angeifer schon die geheimen Daten extrahiert also wenn man jetzt Constant-Time-Code hat dann kann es natürlich nützlich sein im Real-Time-Context, weil es dann noch mal sicherer wird danke für diesen Talk nur eine Frage für Evercrypt du, 5519 Implementation sehr langsamer dann anders zeigst du es darum fliegt von meines Wissens diese 5519 ist eine der schnellsten in meinem auf ERM ist es langsamer auf Internet ist es schneller ist die formelle Verifizierung von Evercrypt gibt prüft sie auch auf Side-Channel-Attacks also es ist ein konstruktiver Weg um Code zu produzieren der Constant-Time-Code hat es prüft nicht nur Side-Channel-Attacks sondern auch Timing-Attacks Compiler-Bugs Wie könnt denn Enger-Bugs und New-Codes verschleiern? Ja es ist möglich also das Problem beim Testen ist man hat seinen originalen Code wird es da ein Fehler dann gibt es das Test-Fermit und man möchte das als möglichst unabhängig man kann sich natürlich vorstellen man muss natürlich auch beweisen dass Enger korrekt funktioniert aber das ist natürlich ziemlich kompliziert und ziemlich viel Pfeifen und SMT-Löser und so also wir sind noch ziemlich weit davon entfernt also klar natürlich ist es möglich dass Enger-Bugs enthält aber ich würde mir da jetzt nicht Gedanken machen weil die werden ja erstmal unabhängig von den Fehler und die man in seinen Krypto-Code macht und sie verringern immer etwas Fehler-Risiko Frage ist im Internet es gibt es einen Fortschritt bei der Beweisung des wahren Zufalls Ich glaube das reicht schon als Antwort Mikrofon Nummer 1 Was ist das Status Das ist ein bisschen komplizierter wenn man einfach nur sich die Anwendung anschauen möchte also dieses TPM-Failpaper hat auch diese Kurven angegriffen also da sind gleich Probleme aufgetreten die Implementierung waren nicht konstant obwohl sie im TPM-Code waren und hätten verifiziert werden sollen das ist irgendwie ein Experimentierungsberechnung also da werden die gleichen Attacken funktionieren in dem Moment war der beste Code nicht in konstanter Zeit letzte Frage Mikrofon Nummer 1 Superscalar Processors die tun diese machen die Algorithmen oder ist das eine gewisse Entfernung nicht mehr relevant darüber nachzudenken ist also wir haben isolierten Datensatz der alle die Geheimschlüsse enthält und es gibt nichts was aus diesem Datensatz herauskoppigiert um sichere Umgebung in die Metadaten die zum Beispiel das Timing kontrolliert wenn man jetzt ein Superscaling-Prozessor hat dann hat man mehr Instruktion pro Rechenzeit aber die Entscheidung welcher Rechnung ausgeführt ist nicht basierend auf der Daten und da muss man sicher sein also dass der Prozessor unabhängig also die Dauer für jede Instruktion ist unabhängig von den Daten innerhalb des sicheren Umgebungs ich denke er spricht uns wieder Danke für diesen Talk mit dem Applaus verabschiedet sich er übersetzt