{"id":1499,"date":"2013-09-02T08:41:52","date_gmt":"2013-09-02T06:41:52","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=1499"},"modified":"2013-10-02T23:26:41","modified_gmt":"2013-10-02T21:26:41","slug":"kaputt-dank-implementierung","status":"publish","type":"post","link":"https:\/\/blog.benny-baumann.de\/?p=1499","title":{"rendered":"Kaputt dank Implementierung"},"content":{"rendered":"<p>Irgendwie frustriert einen der aktuelle Zustand unserer Kryptographie-Softwarelandschaft. Einerseits m\u00f6chte man es dem Nutzer so einfach wie m\u00f6glich machen, andererseits aber einem Angreifer so schwierig wie m\u00f6glich. Prinzipiell sind alle hier g\u00e4ngigen Bibliotheken, sei es <a href=\"https:\/\/openssl.org\/\">OpenSSL<\/a>, <a href=\"http:\/\/gnutls.org\/\">GnuTLS<\/a>, <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/NSS\">NSS<\/a>, <a href=\"http:\/\/nacl.cace-project.eu\/\">NaCl<\/a> und die diversen OpenPGP-Implementierungen zwar an sich einig, wie die verschiedenen kryptographischen Verfahren umzusetzen sind, aber in den Details stecken so einige Stolpersteine, die einfach nicht sein m\u00fcssen.<!--more--><\/p>\n<p>Bereits relativ fr\u00fch fiel mir hierbei ein Limit in allen PGP-Implementierungen auf, welches in keinem einzigen der relevanten Standards (<a href=\"https:\/\/tools.ietf.org\/html\/rfc1991\">RFC 1991<\/a>, <a href=\"https:\/\/tools.ietf.org\/html\/rfc2440\">RFC 2440<\/a>, <a href=\"https:\/\/tools.ietf.org\/html\/rfc4880\">RFC 4880<\/a>) erw\u00e4hnt wird, aber irgendwie dennoch &#8211; fast wie abgeschrieben &#8211; in jeglichen Implementierungen wie als w\u00e4re es im Standard fix festgeschrieben wieder auftaucht: Maximale Schl\u00fcssel-L\u00e4nge <a href=\"http:\/\/git.gnupg.org\/cgi-bin\/gitweb.cgi?p=gnupg.git;a=blob;f=g10\/keygen.c;h=3b02f043d9224792a200b1c7ac10d05e03c38b10;hb=HEAD#l1984\">4096 Bit RSA<\/a>, <a href=\"http:\/\/git.gnupg.org\/cgi-bin\/gitweb.cgi?p=gnupg.git;a=blob;f=g10\/keygen.c;h=3b02f043d9224792a200b1c7ac10d05e03c38b10;hb=HEAD#l2011\">4096 Bit DSA<\/a> (fr\u00fcher sogar nur 1024 Bit) und ECC <a href=\"http:\/\/git.gnupg.org\/cgi-bin\/gitweb.cgi?p=gnupg.git;a=blob;f=g10\/keygen.c;h=3b02f043d9224792a200b1c7ac10d05e03c38b10;hb=HEAD#l1547\">basierend auf der verwendeten Kurve<\/a>. Nutzt man einen ElGamal-Subschl\u00fcssel (besser bekannt als &#8222;Signaturschl\u00fcssel f\u00fcr DSA&#8220;) wird sogar pl\u00f6tzlich <a href=\"http:\/\/git.gnupg.org\/cgi-bin\/gitweb.cgi?p=gnupg.git;a=blob;f=g10\/keygen.c;h=3b02f043d9224792a200b1c7ac10d05e03c38b10;hb=HEAD#l1997\">nur 3072 Bit<\/a> verwendet.<\/p>\n<p>Nun stammen zahlreiche OpenPGP-Implementierungen aus den Urzeiten der <a href=\"https:\/\/wiki.openrightsgroup.org\/wiki\/Crypto_Wars\">ersten Crypto-Kriege<\/a>, in denen die Verwendung starker Verschl\u00fcsslungsalgorithmen verp\u00f6hnt und doch bitte der Generalschl\u00fcssel bei der Regierung zu hinterlegen war; aber diese Zeiten haben wir doch hoffentlich endlich hinter uns gelassen. Auch das Argument, der damals deutlich rechenleistungs\u00e4rmeren Computer &#8211; laut Moore&#8217;s Law immerhin nur ein Millionstel dessen, was vergleichbare Technik heute leistet &#8211; kann unm\u00f6glich als legitime Rechtfertigung akzeptiert werden.<\/p>\n<p>Ja, damals\u2122 <strong>war<\/strong> alles besser, aber die begrenzte Schl\u00fcssell\u00e4nge schon aus R\u00fccksichtnahme auf den eigenen Rechner anzuraten. Und das hat jeder halbwegs klar denkende Nutzer schon von sich aus beherzigt: Man hat damals deutlich gemerkt, dass gerade mit dem asymmetrischen Schl\u00fcssel gearbeitet wurde. Das Argument, dass man mit langen Schl\u00fcsseln also einen Denial of Service-Angriff fahren kann, stimmt somit nur bedingt. Zumal: Dann sollte sich diese Schranke doch eher an der Rechenleistung des Systems orientieren, statt f\u00fcr alle Ewigkeiten in irgendwelchen Code-Leichen zu lauern.<\/p>\n<p>Interessant ist mindestens bei GnuPG, dass es nicht ein solches Limit gibt, sondern gleich zwei unterschiedliche: W\u00e4hrend das eine Limit einzig bei der Schl\u00fcsselgenerierung erzwungen wird und bei 4096 Bit seit Ewigkeiten festgeschrieben ist, wird <a href=\"http:\/\/git.gnupg.org\/cgi-bin\/gitweb.cgi?p=gnupg.git;a=blob;f=g10\/gpg.h;h=693f2ccdab5af754314f169e5c2d165c912c4c82;hb=HEAD#l38\">das andere Limit<\/a> nicht etwa beim Rechnen mit gro\u00dfen Zahlen, also dann wenn wirklich Zeit ben\u00f6tigt wird, gepr\u00fcft, sondern beim Lesen und Schreiben eben solcher \u00fcberlangen Zahlenkolonnen; also in dem Moment, wenn die Schl\u00fcsselgenerierung bereits tagelang Rechenleistung verbraten hat und somit nach Abschluss dieser Arbeiten das Ergebnis in die M\u00fclltonne bef\u00f6rdert.<\/p>\n<p>Eine andere irrwitzige Beschr\u00e4nkung dieser Kategorie findet sich in OpenSSL, wie ich leidlich feststellen musste, als ein SSL-Assessment-Test fehlschlug, beim Versuch, die 13337 Bit umfassenden DH-Parameter auszuhandeln. Nein, nicht wegen eines Timeouts, sondern wegen &#8211; gut geraten &#8211; einem fest kodierten Limit der Maximal-L\u00e4nge von 10000 Bit. Ein Limit was \u00fcbrigens an lediglich <a href=\"http:\/\/git.openssl.org\/gitweb\/?p=openssl.git;a=blob;f=crypto\/dh\/dh.h;h=0cbb32e3362d0278936b7e74caddf428ddef107e;hb=HEAD#l77\">einer Stelle<\/a> definiert, und auch nur an <a href=\"http:\/\/git.openssl.org\/gitweb\/?p=openssl.git;a=blob;f=crypto\/dh\/dh_key.c;h=e296f453bb346cb12773e8d173f8402d74009c8d;hb=HEAD#l223\">exakt einer Stelle<\/a> gepr\u00fcft wird. Die Stelle der Pr\u00fcfung findet man in OpenSSL \u00fcbrigens auch nur anhand der Fehlermeldung, aber das ist eher ein Problem der Code-Qualit\u00e4t von OpenSSL, \u00fcber die man besser nicht reden sollte.<\/p>\n<p>Qualit\u00e4t liefert an dieser Stelle \u00fcbrigens auch die Implementierung von GnuPG bei der Sicherung des Private Keys, die beschr\u00e4nkt durch ein ewig <a href=\"http:\/\/man7.org\/linux\/man-pages\/man2\/mlock.2.html\">niedriges Limit<\/a> von <a href=\"http:\/\/www.linuxhowtos.org\/Tips and Tricks\/ulimit.htm\">32KiB &#8222;sicherem Speicher&#8220;<\/a> unter Linux beim kleinsten Hustenanfall mit einem halbwegs &#8222;sicheren&#8220; Schl\u00fcssel gleich Schreikr\u00e4mpfe bekommt, das zu wenig Platz da sei. Oder anders ausgedr\u00fcckt: Entweder man vertraut seinem Rechner eh von Haus aus &#8211; dann brauch man diese Farce mit gesichertem Speicher nicht &#8211; oder man muss dieses Feature abschalten: Was einem nur in der Form gelingt, dass man ihm mitteilt, dass er doch soviel &#8222;sicheren Speicher&#8220; initialisieren soll, dass er der Meinung ist, dass es keinen g\u00e4be und er daher mit einer Warnmeldung dennoch fortsetzt. Versucht man an der Stelle die direkte Deaktivierung, verweigert GnuPG den Dienst komplett.<\/p>\n<p>Ein anderes interessantes Speicherproblem hat an dieser Stelle auch Mozilla in seiner NSS-Implementierung im Angebot, was aus drei Gr\u00fcnden sehr bemerkenswert ist: 1. es ist konstant reproduzierbar, 2. es ist Abh\u00e4ngig von der Schl\u00fcssel-Operation und 3. es ist vollkommen unlogisch. Aber der Reihe nach, denn dieses Problem braucht etwas Erkl\u00e4rung. Wie einige sicherlich festgestellt haben, verwendet dieser Blog SSL. <a href=\"http:\/\/en.wikipedia.org\/wiki\/SSL\">SSL<\/a> ist dieser <a href=\"http:\/\/en.wikipedia.org\/wiki\/X.509\">Krypto-Foo mit Zertifikaten<\/a>, was einmal <a href=\"http:\/\/blog.cryptographyengineering.com\/2012\/09\/on-provable-security-of-tls-part-1.html\">zum Absichern von 50-Dollar-Transaktionen<\/a> entworfen wurde. Nunja, eben dieses SSL wird auf diesem Server mit einem X.509-Zertifikat mit einem 8192-Bit-RSA-Schl\u00fcssel verwendet. Kein Problem, braucht 2KiB, ggf. 8KiB RAM f\u00fcr ein paar Potenzierungsoperationen, aber ist sonst nicht der Rede wert. Au\u00dfer man versucht sich mit eben jenem Schl\u00fcssel in Form eines Client-Zertifikates bei einer Website zu authentifizieren. Das f\u00fchrt reproduzierbar zu einem Out-of-Memory-Fehler, und zwar nicht erst bei 8192 Bit, sondern exakt bei allem, was mindestens ein Bit mehr als 4096 Bit RSA hat. W\u00e4re die Grenze wenigstens bei irgendetwas krummen, k\u00f6nnte man das ganze mit wirklicher Speichernot erkl\u00e4ren, wobei selbst dann das WTF bleibt, warum man nur so wenig gesicherten Speicher verf\u00fcgbar hat. Ach ja: Gleiches Zertifikat im Thunderbird f\u00fcr Email-Signaturen eingesetzt l\u00e4uft \u00fcbrigens reibungslos. Und bevor das Argument mit krummen Schl\u00fcssell\u00e4ngen kommt, sei noch erw\u00e4hnt, dass es mit 4095 Bit reibungslos funktioniert.<\/p>\n<p>Aber eines muss man Firefox an dieser Stelle lassen: Im Gegensatz zu diversen Apple-Produkten erh\u00e4lt man wenigstens eine klare Fehlermeldung; wenn auch keine wirklich hilfreiche. Auf Apple sieht das Ganze etwas anders aus: Hier reicht ein Besuch des Blogs in der Regel bereits aus, um Safari auf die Reise ins Nirvana zu schicken. Und da Apple an dieser Stelle eine konsistente User Experience bietet, geschieht dies konsequent auch auf iOS 6-Devices, was sich sowohl mit dem iPhone, als auch einem i<del>Tampon<\/del>Pad reproduzieren lie\u00df. Auf iOS 7 gab es zwischenzeitlich sogar einmal Besserung: Nein, die Krypto hat nicht einfach mal ihren Dienst getan, zumindest nicht so, dass ein Nutzer h\u00e4tte etwas damit anfangen k\u00f6nnen. Der Fortschritt bestand hier vielmehr darin, dass es iOS 7 geschafft hat, dem Nutzer das Zertifikat der Website zu p\u00e4sentieren, bevor es &#8211; nach dessen \u00dcberpr\u00fcfung und Akzeptanz &#8211; eine Endlos-Schleife mit Page-Reloads angetreten hat.<\/p>\n<p>Nun bin ich absolut kein Freund von Apple oder Safari, aber einfach nur zu sagen Safari ist hier kaputt w\u00fcrde die Sache etwas sehr stark vereinfachen. Vielmehr haben wir hier ein Problem in der Krypto-Lib von iOS am Hals, was sich auch an anderer Stelle wunderbar zeigt. Denn wir alle m\u00f6gen Mails, diese kleinen RFC-822-formatierten Text-Konglomerate die zu 90% Spam und 10% anderen Bullshit enthalten. Manchmal verirrt sich hier auch eine sinnvolle Mail darunter, was oft dadurch erkennbar wird, dass diese Mails eine Signatur tragen. Solche Signaturen sind praktisch. Manchmal findet man diese auch auf Mailing-Listen. Zu dumm nur, wenn der Mail-Client der Wahl aus Versehen immer dann abst\u00fcrzt, wenn man versucht, die Mail zu lesen, zu verschieben, zu l\u00f6schen oder anderweitig irgendetwas mit dieser Mail anzufangen.<\/p>\n<p>Und alle diese Dinge waren komplett von den passenden Standards gedeckelt, oder basierend auf der zugrundeliegenden Mathematik vollst\u00e4ndig legitim, was umso interessanter wird, wenn man sich einmal eine Reihe von Standards anschaut, die Rahmenbedingungen f\u00fcr diverse Verschl\u00fcsslungsverfahren festlegen. Denn wer hat sich noch nicht gewundert, warum in Public Keys bei RSA immer 65537 vorkommt (naja, au\u00dfer bei so ein paar Schl\u00fcsseln von mir) und man nicht der mathematischen Grundlage folgt, nach der e einfach nur teilerfremd zu sowohl p als auch q sein muss? Hier gibt es prinzipiell zwei Antworten, wobei die eine prim\u00e4r die Wahl der Zahl erkl\u00e4rt &#8211; was eine reine Performance-Entscheidung darstellt -, w\u00e4hrend die andere zu einem NIST-FIPS-Standard f\u00fchrt, der festlegt, dass e mindestens 65537 (zur Vermeidung von einigen Angriffen) aber maximal 2^256-1 sein darf. Womit wir an der Stelle w\u00e4ren, wo der Standard einfach keinen Sinn ergibt: Ja, man m\u00f6chte ein Limit haben, aber dieses ist prim\u00e4r dadurch begr\u00fcndet, dass bei gro\u00dfen Exponenten die Wahrscheinlichkeit f\u00fcr d &lt; &lt; e deutlich zunimmt; liest man hierzu die passende Literatur, ergibt sich ein sinnvolles Limit bei ungef\u00e4hr 70% des Modulus n, was selbst bei moderaten 4096er Schl\u00fcsseln bereits 2^3072-1 ergibt &#8211; AKA eine Zahl, die 10 mal so lang ist.<\/p>\n<p>Mangels passenden Utilities konnte ich noch nicht pr\u00fcfen, wieviel kaputte Krypto-Software den Public Exponenten als Gott-gegeben mit 65537 annimmt, aber so wie das bisher ausschaut, w\u00fcrde es mich nicht verwundern, wenn mit entsprechenden Schl\u00fcsseln noch eine ganze Menge Software den Geist aufgibt.<\/p>\n<p>Was mich zu meinem Punkt an dieser Stelle bringt: Wann h\u00f6ren die Leute endlich auf, die Standards w\u00f6rtlich zu implementieren, frei von jeglichem Verstand der darunterliegenden Verfahren? Ja, es ist ein absolutes Desaster, wenn man <a href=\"http:\/\/www.metasploit.com\/users\/hdm\/tools\/debian-openssl\/\">zuf\u00e4llig uninitialisierte Speicherzugriffe patcht<\/a> oder gleich <a href=\"http:\/\/blog.cryptographyengineering.com\/2013\/09\/the-many-flaws-of-dualecdrbg.html\">die Backdoor im PRNG platziert<\/a>, aber warum muss dann bitte sch\u00f6n die Funktionalit\u00e4t k\u00fcnstlich beschr\u00e4nkt werden, nur weil der Geheimdienst des eigenen Misstrauens sonst nicht ausreichend mitlesen kann?<\/p>\n<p>Macht Krypto bitte endlich einmal richtig!<\/p>\n<p>AAAH-CHOO!<\/p>\n<p class=\"wp-flattr-button\"><a href=\"https:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=1499&amp;md5=b6abf6763167da2d0dec2e53df24e626\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Irgendwie frustriert einen der aktuelle Zustand unserer Kryptographie-Softwarelandschaft. Einerseits m\u00f6chte man es dem Nutzer so einfach wie m\u00f6glich machen, andererseits aber einem Angreifer so schwierig wie m\u00f6glich. Prinzipiell sind alle hier g\u00e4ngigen Bibliotheken, sei es OpenSSL, GnuTLS, NSS, NaCl und die diversen OpenPGP-Implementierungen zwar an sich einig, wie die verschiedenen kryptographischen Verfahren umzusetzen sind, aber [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[29],"tags":[14,98,69,112,128,122,50],"class_list":["post-1499","post","type-post","status-publish","format-standard","hentry","category-software","tag-bugs","tag-developement","tag-internet","tag-kryptographie","tag-meinung","tag-rfc","tag-ssl"],"_links":{"self":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1499","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1499"}],"version-history":[{"count":6,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1499\/revisions"}],"predecessor-version":[{"id":1505,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1499\/revisions\/1505"}],"wp:attachment":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}