{"id":588,"date":"2010-03-13T01:51:05","date_gmt":"2010-03-13T00:51:05","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=588"},"modified":"2010-03-13T02:32:33","modified_gmt":"2010-03-13T01:32:33","slug":"sicherheitsbewusstsein-von-softwareentwicklern","status":"publish","type":"post","link":"http:\/\/blog.benny-baumann.de\/?p=588","title":{"rendered":"Sicherheitsbewusstsein von Softwareentwicklern"},"content":{"rendered":"<p>Jeder ist sie gewohnt: Die mehr oder weniger regelm\u00e4\u00dfigen Abst\u00fcrze von Programmen, die halt mal hin und wieder passieren. Und auch in Gro\u00dfprojekten findet man immer wieder einmal recht interessante Missgeschicke, die verheerende Auswirkungen nach sich ziehen. So z.B. wenn beim Auff\u00fcllen zu kurzer Kontonummern in der Arbeitsagentur die Nullen auf der rechten Seite der Kontonummer eingef\u00fcgt werden, oder bei der NASA die Messbereiche f\u00fcr die Beschleunigungssensoren \u00fcbersch\u00e4tzt werden und daher die in gro\u00dfen Teilen von den Ariane-4 \u00fcbernommene Firmware der Steuercomputer wegen einem Hardware-\u00dcberlauf entscheidet, die Rakete zu sprengen. Derlei Geschichten m\u00f6gen vielleicht auf den ersten Blick witzig erscheinen, sind aber im Endeffekt dennoch zu einem gewissen Teil durch fachfremdes Personal, zu kurze Entwicklungszyklen oder \u00fcberhastete Entscheidungen erkl\u00e4rbar.<\/p>\n<p>Ich m\u00f6chte hiermit bei weitem nicht sagen, dass jeder Nicht-Informatiker automatisch schlechten Code erzeugt, dennoch sollte jeder der Software implementiert &#8211; und sei es f\u00fcr sich privat oder die &#8222;Weitergabe im Kleinen Kreis&#8220; -, fragen, welche Priorit\u00e4t die Fehlerfreiheit seiner Software einnimmt. Wahrscheinlich einen viel zu geringen. Zumindest, wenn ich mich in meinem Umfeld umschaue, in dem zahlreiche Programmierer &#8211; sowohl studierte wie auch fachfremde &#8211; ihr Unwesen treiben: Ein Programm soll tun, was ich von ihm will, ist da nur allzu h\u00e4ufig eine der ersten Antworten, die man da zu h\u00f6ren bekommt.<!--more--><\/p>\n<p>Und ehrlich gesagt: Ich k\u00f6nnte mich jedes Mal \u00fcber derlei Verhalten aufregen, da es im Grunde genommen einfach nur Fahrl\u00e4ssig ist. Klar komm ich mit einem Auto von A nach B wenn ein Motor drinnen ist, ich ein Lenkrad hab und ggf. auch noch ein Tank vorhanden ist. Wenn ich aber vergesse, eine Bremse einzubauen, oder ein Bremspedal vorzusehen, fehlt vielleicht nichts Wichtiges, aber ich gef\u00e4hrde unn\u00f6tig andere &#8211; und auch mich selbst -, wenn ich mit einem solchen Gef\u00e4hrt die Stra\u00dfen benutzen w\u00fcrde.<\/p>\n<p>Aber genau das ist es, was man in der Informatik immer wieder antrifft. Quereinsteiger, die auf Grund von 3 in Flash oder VB gehackten Zeilen Kot meinen, den Computer im Griff zu haben (\u00c4hnlichkeiten zu real existenten F\u00e4llen sind rein zuf\u00e4llig). Nicht, dass diese Leute nicht programmieren k\u00f6nnen, aber oftmals kommt zu dieser \u00dcbersch\u00e4tzung auch noch Naivit\u00e4t hinzu. Die Naivit\u00e4t, dass man es mit seinem eigenen Wissen hinbekommt, was rein oberfl\u00e4chlich betrachtet auch stimmt, unter der Haube aber halt zu Autos ohne Bremsen f\u00fchrt.<\/p>\n<p>Und genau hier liegt ein kritischer Punkt, der in der Informatik zu gewaltigen Problemen f\u00fchrt und den viele im Gegensatz zu anderen nicht mal als kritisch erkennen. Obwohl jedoch niemand an anderer Stelle auf die Idee k\u00e4me, beim Architekten ins B\u00fcro zu gehen und sich sein Haus selber zusmmenzuklicken. Genau dies ist es aber, was tagt\u00e4glich zu Hauf in der Informatik geschieht: Laien aus anderen Fachbereichen, die sich in an Sie &#8222;angepassten&#8220; Entwicklungsumgebungen als Programmierer f\u00fchlen und dabei oftmals nicht mal die Grundlagen der Programmierung kennen, sondern annehmen, durch Zusammenklicken von Schaltungen oder Abl\u00e4ufen einen Informatiker ersetzen zu k\u00f6nnen.<\/p>\n<p>Aber nehmen wir mal ein konkretes Beispiel (und ich hoffe, die betroffene Person nimmt mir dies hier nicht allzu \u00fcbel ;-)): Bernd ist Medientechniker. Bernd schreibt gern B\u00fccher, gestaltet Filme, arbeitet Multimedial an zahlreichen Projekten, dabei u.a. auch mit Flash und hat zudem auch bereits in andere Programmiersprachen reingeschnuppert. Soweit sicherlich nichts ungew\u00f6hnliches. Bernd entscheidet sich nun, f\u00fcr seine Arbeit ein Programm Foo zu schreiben, was ihm bei seiner Arbeit mit Drehb\u00fcchern helfen soll. Sobald dieses Programm soweit fertig ist, soll es zudem &#8222;im kleinen Kreise&#8220; weitergegeben werden. Auch hieran ist an sich nichts auszusetzen. Was jedoch ein erster Grund zur Besorgnis ist, ist die Tatsache, dass sich Bernd trotz berechtigter Hinweise zur Sicherheit dieses Programms f\u00fcr die Programmiersprache VB entscheidet, und zwar nicht aus sachlichen Gr\u00fcnden, sondern weil ihm die, f\u00fcr dieses Projekt durchaus g\u00fcnstigeren Alternativen C# und Java nicht zu seinem Kenntnisstand geh\u00f6ren.<\/p>\n<p>L\u00e4sst man jedoch auch diesen Punkt au\u00dfer Acht und nimmt f\u00fcr einen Moment den Einspruch von Bernd als Gerechtfertigt an, dass die vorgebrachten Sicherheitsrisiken &#8211; darauf komm ich gleich noch zu sprechen &#8211; unbegr\u00fcndet w\u00e4ren, bliebe noch ein zweiter Punkt: Der Verzicht, fertige Bibliotheken zum Verarbeiten externer Datenformate wie XML heranzuziehen. Wie jetzt? Ist XML nicht einfach? Das kann doch jeder implementieren? Eben nicht!<\/p>\n<p>Wer sich einmal g\u00e4ngige XML-Parser-Bibliotheken wie SAX bei Java angeschaut hat, d\u00fcrfte festgestellt haben, dass deren Aufgabe bei weitem nicht trivial ist; insbesondere dann nicht (oder sollte man besonders dann nicht sagen), wenn man es mit potentiell untrustworthy Content aus Datendateien des Benutzers zu tun hat. Nicht, dass ich Bernd nicht zutraue, einen funktionierenden Parser f\u00fcr XML zu schreiben; ich traue Bernd nicht zu, dass zu k\u00f6nnen, woran auch zahlreiche Experten scheitern: Dies fehlerfrei bei einem derart komplexen System zu beherrschen.<\/p>\n<p>Und nun mag der eine oder andere vielleicht denken &#8222;wer nutzt den vollst\u00e4ndigen XML-Standard?&#8220;: Keiner. Wer aber XML als Datenformat verwendet, muss damit rechnen, dass er eben alle m\u00f6glichen Funktionen sieht, die dieser Standard beschreibt. Programmierung nach dem Credo &#8222;das wird nicht vorkommen&#8220; ist so, als ob man auf den Bahngleisen zum n\u00e4chsten Bahnhof l\u00e4uft, weil die Bahn schon nicht kommen wird. Es ist kurzsichtig und allein auf das &#8222;Fertigwerden&#8220; des Projektes gerichtet, l\u00e4sst aber vollkommen au\u00dfen vor, dass eine Software auch eine Qualit\u00e4t besitzen muss, also nicht auf den Testcases des Programmierers funktionieren muss, sondern unter Realbedingungen bestehen muss.<\/p>\n<p>F\u00fchrt man diesen Punkt auf, beklagt sich Bernd, dass es ihm doch nichts bringe, sein eigenes Programm zu hacken. Auch hier ist eine erschreckende Kurzsichtigkeit zu versp\u00fcren. Im GeSHi patche ich Sicherheitsl\u00fccken wenn ich sie finde, nicht erst, wenn sie mir von extern auch noch mal gemeldet werden, sondern sobald ich sie selber sehe. Und dabei warte ich auch nicht auf den Zufall, sondern schaue bei Code-Reviews immer wieder \u00fcber meinen Source. Im Grunde hacke ich also mein eigenes System, streng genommen sorge ich aber nur daf\u00fcr, die Rahmenbedingungen f\u00fcr sicheres Arbeiten mit dem Programm zu verbessern. Nutzen habe ich direkt von dieser freiwilligen Suche nach Fehlern eher nicht, da dies \u00fcberwiegend harte Arbeit bedeutet, was auch durch das zu verlierende Ansehen nur ungen\u00fcgend gedeckt wird.<\/p>\n<p>Der Grund ist vielmehr v\u00f6llig trivial: Fehler, die ich nicht finde, werden fr\u00fcher oder sp\u00e4ter durch andere gefunden. Dabei ist es i.A. egal, wer sie findet, denn wahrscheinlich werden diese Fehler gegen die Software eingesetzt werden. Oder kurz: Mit jedem Sicherheitsfehler in meinem Programm kann ich nur an Vertrauen meiner Anwender verlieren, egal wie ich es drehe. Von daher sollte ich versuchen, es von Anfang an richtig zu machen.<\/p>\n<p>Und etwas richtig machen, hei\u00dft nunmal auch, etwas vollst\u00e4ndig umzusetzen, selbst wenn f\u00fcr die eigene Anwendung 99% eines Standards nie ben\u00f6tigt werden. Nehmen wir dazu einmal den RFC822 als Beispiel (Internet Message Format, u.a. bei Mail und HTTP verwendet). Dieses RFC definiert ein einfaches Name-Wert-Schema um Meta-Daten an eine Nachricht anzuh\u00e4ngen. Bei einer Email z.B. Absender, Empf\u00e4nger, Datum und Betreff. Wer jetzt losgeht, und hier denkt, er kenne mit der Definition &#8222;Wort gefolgt von Doppelpunkt gefolgt von Wert, der am Zeilenende endet&#8220; genug, um einen Parser zu schreiben, wird bereits an den meisten HTTP-Anfragen moderner Browser kl\u00e4glich scheitern. Diese sind zwar auch RFC822 (wenn auch in \u00fcberarbeiteten Formen), nutzen aber nicht nur die einfache Form, sondern eine ganze Menge mehr an g\u00fcltigen Konstrukten, wie der Line-Continuation oder Parameter-Encodings nach diversen anderen RFCs. Ein sch\u00f6nes Beispiel f\u00fcr einen g\u00fcltigen Request lieferte hierbei Fefe auf dem 26C3, als er einen g\u00fcltigen RFC822-Header mit mehrzeiligem ASCII-Art zeigte, an dem zahlreiche &#8222;Homebrew&#8220;-Parser sicherlich gescheitert w\u00e4ren. Wie reell dieses Problem f\u00fcr den konkreten Fall ist, steht jedoch noch einmal auf einem anderen Blatt.<\/p>\n<p>Wichtig ist hierbei jedoch, dass keine Anwendung fehlerfrei ist und es daher die verdammte Pflicht eines Programmierers ist, sich um Sicherheitsl\u00fccken und Bugs in von ihm ausgelieferter Software zu k\u00fcmmern. Womit wir wieder am obigen Punkt bzgl. VB w\u00e4ren: F\u00fcr VB muss man eine Runtime ausliefern. Diese d\u00fcrfte auf aktuellen Systemen zwar vorhanden sein, ist sie dies aber nicht, muss diese mit \u00fcbertragen werden. Und hier gibt es nicht weniger Programmierer (und das betrifft nicht nur VB), die solche externen Bibliotheken zwar mitliefern, diese aber nicht weiter Pflegen und daher beim Anwender versauern lassen. Wird also in einer solchen Runtime-Bibliothek ein Fehler entdeckt, so bleibt dieser in der Regel f\u00fcr viele Anwendungen ungefixt, selbst wenn der Original-Maintainer bereits einen Bugfix herausgegeben hat. Dieses Problem reduziert sich zwar mit dem Einsatz von Paket-Verwaltungssoftware wie DPKG\/APT, Emerge und Konsorten unter Linux erheblich, da es viele Programmierer ermutigt, die externen Pakete zu referenzieren, statt die n\u00f6tigen Libraries selbst mitzuliefern, funktioniert aber nur korrekt, wenn sich alle Beteiligten daran halten und auch jede Software vern\u00fcnftig \u00fcber dieses System verwaltet werden kann. Wenn aber jeder Autor die immer gleiche Funktionalit\u00e4t dennoch immer wieder implementiert, hilft auch solch eine Paketverwaltung nur bedingt.<\/p>\n<p>Womit wir den Punkt Code-Dopplung h\u00e4tten, der als eines der schlimmsten Laster in der Informatik angesehen werden kann. Und damit meine ich nicht die tausenden Rezepte-Datenbanken oder anderen Einsteiger-Aufgaben, die jeder einmal implementiert haben d\u00fcrfte, sondern den oft zu beobachtenden Drang vieler, bestehende Bibliotheken noch einmal selbst schreiben zu m\u00fcssen, statt sich bei diesen Bibliotheken mit den Autoren in Verbindung zu setzen, um den vorhandenen Source zu verbessern. Dies ist nicht nur kontraproduktiv, sondern verschwendet auch unn\u00f6tig Arbeitszeit, die man besser in die Implementierung neuer Algorithmen investieren sollte.<\/p>\n<p>Informatik ist eine Wissenschaft und als solche sollten keine Laien als Pr\u00e4diger an der Spitze sitzen, oder Leute, die dem aktuellen Stand um Jahre hinterher hinken. Vielmehr sollte man die Informatik als das begreifen, was sie ist: Eine Wissenschaft, die Algorithmen f\u00fcr die effiziente Umsetzung von Algorithmen entwickelt. Und damit ist es nunmal t\u00f6dlich, wenn man sich st\u00e4ndig mit den bereits gefestigten Grundlagen besch\u00e4ftigt, statt aktuelle Erkenntnisse umzusetzen und Neues zu entdecken.<\/p>\n<p>Und zu diesen Erkenntnissen geh\u00f6rt nunmal auch, dass man sich anschaut, wie man Fehler in seinen Programmen vermeidet. Denn was wir heute als Fehler in unseren Programmen sehen, ist nichts anderes als das Ergebnis der Unf\u00e4higkeit derjenigen, sich an den Stand der Technik in Bezug auf die Fehlervermeidung anzupassen. Was fr\u00fcher Puffer\u00fcberl\u00e4ufe waren, sind heute SQL-Injection, XSS und CSRF: Ein Symptom dessen, dass man Leute an Dinge heran l\u00e4sst, von denen Sie nichts verstehen &#8211; und die dann zus\u00e4tzlih oftmals lernresistent sind, weil sie meinen, dies sei normal und m\u00fcsse so sein.<\/p>\n<p>Wenn man immer nur einen Hammer zur Verf\u00fcgung hat, sieht irgendwann alles aus, wie ein Nagel, den es gilt, in die n\u00e4chstbeste Wand zu schlagen. Das Aussehen ist dabei erstmal egal; kracht dieses Provisorium aber einmal zusammen, ist das Geschrei gro\u00df.<\/p>\n<p class=\"wp-flattr-button\"><a href=\"http:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=588&amp;md5=fd499cfec34d36259bfb06c8391f45fe\" 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>Jeder ist sie gewohnt: Die mehr oder weniger regelm\u00e4\u00dfigen Abst\u00fcrze von Programmen, die halt mal hin und wieder passieren. Und auch in Gro\u00dfprojekten findet man immer wieder einmal recht interessante Missgeschicke, die verheerende Auswirkungen nach sich ziehen. So z.B. wenn beim Auff\u00fcllen zu kurzer Kontonummern in der Arbeitsagentur die Nullen auf der rechten Seite der [&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,95,128],"class_list":["post-588","post","type-post","status-publish","format-standard","hentry","category-software","tag-bugs","tag-developement","tag-gesellschaft","tag-meinung"],"_links":{"self":[{"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/588","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=588"}],"version-history":[{"count":3,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/588\/revisions"}],"predecessor-version":[{"id":590,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/588\/revisions\/590"}],"wp:attachment":[{"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=588"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=588"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=588"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}