BenBE's humble thoughts Thoughts the world doesn't need yet …

13.03.2010

Sicherheitsbewusstsein von Softwareentwicklern

Filed under: Software — Schlagwörter: , , , — BenBE @ 01:51:05

Jeder ist sie gewohnt: Die mehr oder weniger regelmäßigen Abstürze von Programmen, die halt mal hin und wieder passieren. Und auch in Großprojekten findet man immer wieder einmal recht interessante Missgeschicke, die verheerende Auswirkungen nach sich ziehen. So z.B. wenn beim Auffüllen zu kurzer Kontonummern in der Arbeitsagentur die Nullen auf der rechten Seite der Kontonummer eingefügt werden, oder bei der NASA die Messbereiche für die Beschleunigungssensoren überschätzt werden und daher die in großen Teilen von den Ariane-4 übernommene Firmware der Steuercomputer wegen einem Hardware-Überlauf entscheidet, die Rakete zu sprengen. Derlei Geschichten mögen vielleicht auf den ersten Blick witzig erscheinen, sind aber im Endeffekt dennoch zu einem gewissen Teil durch fachfremdes Personal, zu kurze Entwicklungszyklen oder überhastete Entscheidungen erklärbar.

Ich möchte hiermit bei weitem nicht sagen, dass jeder Nicht-Informatiker automatisch schlechten Code erzeugt, dennoch sollte jeder der Software implementiert – und sei es für sich privat oder die „Weitergabe im Kleinen Kreis“ -, fragen, welche Priorität die Fehlerfreiheit seiner Software einnimmt. Wahrscheinlich einen viel zu geringen. Zumindest, wenn ich mich in meinem Umfeld umschaue, in dem zahlreiche Programmierer – sowohl studierte wie auch fachfremde – ihr Unwesen treiben: Ein Programm soll tun, was ich von ihm will, ist da nur allzu häufig eine der ersten Antworten, die man da zu hören bekommt.

Und ehrlich gesagt: Ich könnte mich jedes Mal über derlei Verhalten aufregen, da es im Grunde genommen einfach nur Fahrlässig 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ährde unnötig andere – und auch mich selbst -, wenn ich mit einem solchen Gefährt die Straßen benutzen würde.

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 (Ähnlichkeiten zu real existenten Fällen sind rein zufällig). Nicht, dass diese Leute nicht programmieren können, aber oftmals kommt zu dieser Überschätzung auch noch Naivität hinzu. Die Naivität, dass man es mit seinem eigenen Wissen hinbekommt, was rein oberflächlich betrachtet auch stimmt, unter der Haube aber halt zu Autos ohne Bremsen führt.

Und genau hier liegt ein kritischer Punkt, der in der Informatik zu gewaltigen Problemen führt und den viele im Gegensatz zu anderen nicht mal als kritisch erkennen. Obwohl jedoch niemand an anderer Stelle auf die Idee käme, beim Architekten ins Büro zu gehen und sich sein Haus selber zusmmenzuklicken. Genau dies ist es aber, was tagtäglich zu Hauf in der Informatik geschieht: Laien aus anderen Fachbereichen, die sich in an Sie „angepassten“ Entwicklungsumgebungen als Programmierer fühlen und dabei oftmals nicht mal die Grundlagen der Programmierung kennen, sondern annehmen, durch Zusammenklicken von Schaltungen oder Abläufen einen Informatiker ersetzen zu können.

Aber nehmen wir mal ein konkretes Beispiel (und ich hoffe, die betroffene Person nimmt mir dies hier nicht allzu übel ;-)): Bernd ist Medientechniker. Bernd schreibt gern Bücher, 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öhnliches. Bernd entscheidet sich nun, für seine Arbeit ein Programm Foo zu schreiben, was ihm bei seiner Arbeit mit Drehbüchern helfen soll. Sobald dieses Programm soweit fertig ist, soll es zudem „im kleinen Kreise“ 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ür die Programmiersprache VB entscheidet, und zwar nicht aus sachlichen Gründen, sondern weil ihm die, für dieses Projekt durchaus günstigeren Alternativen C# und Java nicht zu seinem Kenntnisstand gehören.

Lässt man jedoch auch diesen Punkt außer Acht und nimmt für einen Moment den Einspruch von Bernd als Gerechtfertigt an, dass die vorgebrachten Sicherheitsrisiken – darauf komm ich gleich noch zu sprechen – unbegründet wären, 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!

Wer sich einmal gängige XML-Parser-Bibliotheken wie SAX bei Java angeschaut hat, dürfte 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ür XML zu schreiben; ich traue Bernd nicht zu, dass zu können, woran auch zahlreiche Experten scheitern: Dies fehlerfrei bei einem derart komplexen System zu beherrschen.

Und nun mag der eine oder andere vielleicht denken „wer nutzt den vollständigen XML-Standard?“: Keiner. Wer aber XML als Datenformat verwendet, muss damit rechnen, dass er eben alle möglichen Funktionen sieht, die dieser Standard beschreibt. Programmierung nach dem Credo „das wird nicht vorkommen“ ist so, als ob man auf den Bahngleisen zum nächsten Bahnhof läuft, weil die Bahn schon nicht kommen wird. Es ist kurzsichtig und allein auf das „Fertigwerden“ des Projektes gerichtet, lässt aber vollkommen außen vor, dass eine Software auch eine Qualität besitzen muss, also nicht auf den Testcases des Programmierers funktionieren muss, sondern unter Realbedingungen bestehen muss.

Führt 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üren. Im GeSHi patche ich Sicherheitslücken 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 über meinen Source. Im Grunde hacke ich also mein eigenes System, streng genommen sorge ich aber nur dafür, die Rahmenbedingungen für sicheres Arbeiten mit dem Programm zu verbessern. Nutzen habe ich direkt von dieser freiwilligen Suche nach Fehlern eher nicht, da dies überwiegend harte Arbeit bedeutet, was auch durch das zu verlierende Ansehen nur ungenügend gedeckt wird.

Der Grund ist vielmehr völlig trivial: Fehler, die ich nicht finde, werden früher oder später 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.

Und etwas richtig machen, heißt nunmal auch, etwas vollständig umzusetzen, selbst wenn für die eigene Anwendung 99% eines Standards nie benötigt 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ängen. Bei einer Email z.B. Absender, Empfänger, Datum und Betreff. Wer jetzt losgeht, und hier denkt, er kenne mit der Definition „Wort gefolgt von Doppelpunkt gefolgt von Wert, der am Zeilenende endet“ genug, um einen Parser zu schreiben, wird bereits an den meisten HTTP-Anfragen moderner Browser kläglich scheitern. Diese sind zwar auch RFC822 (wenn auch in überarbeiteten Formen), nutzen aber nicht nur die einfache Form, sondern eine ganze Menge mehr an gültigen Konstrukten, wie der Line-Continuation oder Parameter-Encodings nach diversen anderen RFCs. Ein schönes Beispiel für einen gültigen Request lieferte hierbei Fefe auf dem 26C3, als er einen gültigen RFC822-Header mit mehrzeiligem ASCII-Art zeigte, an dem zahlreiche „Homebrew“-Parser sicherlich gescheitert wären. Wie reell dieses Problem für den konkreten Fall ist, steht jedoch noch einmal auf einem anderen Blatt.

Wichtig ist hierbei jedoch, dass keine Anwendung fehlerfrei ist und es daher die verdammte Pflicht eines Programmierers ist, sich um Sicherheitslücken und Bugs in von ihm ausgelieferter Software zu kümmern. Womit wir wieder am obigen Punkt bzgl. VB wären: Für VB muss man eine Runtime ausliefern. Diese dürfte auf aktuellen Systemen zwar vorhanden sein, ist sie dies aber nicht, muss diese mit übertragen 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ür 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ötigen Libraries selbst mitzuliefern, funktioniert aber nur korrekt, wenn sich alle Beteiligten daran halten und auch jede Software vernünftig über dieses System verwaltet werden kann. Wenn aber jeder Autor die immer gleiche Funktionalität dennoch immer wieder implementiert, hilft auch solch eine Paketverwaltung nur bedingt.

Womit wir den Punkt Code-Dopplung hätten, 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ürfte, sondern den oft zu beobachtenden Drang vieler, bestehende Bibliotheken noch einmal selbst schreiben zu müssen, 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ötig Arbeitszeit, die man besser in die Implementierung neuer Algorithmen investieren sollte.

Informatik ist eine Wissenschaft und als solche sollten keine Laien als Prädiger 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ür die effiziente Umsetzung von Algorithmen entwickelt. Und damit ist es nunmal tödlich, wenn man sich ständig mit den bereits gefestigten Grundlagen beschäftigt, statt aktuelle Erkenntnisse umzusetzen und Neues zu entdecken.

Und zu diesen Erkenntnissen gehört 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ähigkeit derjenigen, sich an den Stand der Technik in Bezug auf die Fehlervermeidung anzupassen. Was früher Pufferüberläufe waren, sind heute SQL-Injection, XSS und CSRF: Ein Symptom dessen, dass man Leute an Dinge heran lässt, von denen Sie nichts verstehen – und die dann zusätzlih oftmals lernresistent sind, weil sie meinen, dies sei normal und müsse so sein.

Wenn man immer nur einen Hammer zur Verfügung hat, sieht irgendwann alles aus, wie ein Nagel, den es gilt, in die nächstbeste Wand zu schlagen. Das Aussehen ist dabei erstmal egal; kracht dieses Provisorium aber einmal zusammen, ist das Geschrei groß.

Flattr this!

2 Comments »

  1. Schön sowas mal zu lesen.

    Gerade in „einfachen“ Sprachen wie beispielsweise php sieht man viele der beschriebenen Probleme ja sehr oft. PHP ist einfach, PHP kann jeder und führt schon nach kurzer Zeit zu erkennbaren Erfolgen, sei es durch das selbst schreiben oder das verändern irgendwelchen fremden Codes.
    Aber gerade die große Gefahr bei PHP, jeder stellt seinen Code in null komma nix irgendwo ins netz, nicht in Form eines Archivs, sondern als laufender Code auf irgendeinem kostenlos Webspace oder noch viel schlimmer auf leistungsstarken gut angebundenen V/Root-Servern. Die Gefahr dass solche Scripte mißbraucht ist extrem groß, da muss man nur mal die logs von einer Webseite anschauen und gucken wie viele Bots da unterwegs sind die auf bekannte Fehler in Systemen wie phpbb, wordpress, joomla und co testen oder die „besseren“ bots die wirklich sich Quelltexte der Seite anschauen und versuchen (ähnlich Tools wie Chorizo [https://chorizo-scanner.com/] und co) z.b. Code einzuschleusen, über ein Kontakt-Formulare Spam abzusetzen oder andere eventuell mißbräuchlich nutzbaren lücken zu finden. Im Endeffekt betreiben die oftmals automatisiert das, was eigentlich der Programmierer tun sollte, seine Applikation auf sicherheitslücken testen. Der unterschied liegt dann halt auch im Ergebnis, während man selbst bei finden von Sicherheitslücken diese schließen kann, berichtet der Bot eventuell gefundene Lücken seinem Meister oder nutzt sie abhängig von seiner Programmierung auch direkt in einer vorbestimmten Art und Weise aus.

    Gerade wenn man ein System mit Kommentar-Funktion oder irgendeiner Form wo User-input erlaubt ist betreibt sieht man ja was da täglich an Spam reinkommt und wie dort versucht wird BBCode, html, Javscript oder ähnliches einzuschleusen, geht man dann einen schritt weiter und schaut sich die verlinkten seiten an, trifft man sehr häufig wieder auf veraltete foren oder community-systeme bei denen sich in profilen oder Beiträgen recht einfach html/javascript-code einschleußen lässt, weil die Systeme total veraltet sind und nicht mehr gepflegt werden

    Und da sind wir schon beim nächsten Problem das viele Leute im Web „produzieren“. Sei es das kleine Forum für den örtlichen Verein, die Schule, einen Clan/Gilde/Community oder ähnliches, am besten auf kostenlosem Webspace gehostet, dann denkt da keiner mehr nach nem halben jahr dran, wenn es eh keiner mehr nutzt, die eventuell jetzt schon total veraltete Software einfach zu löschen, nein sie läuft und läuft und läuft und wird älter und mehr lücken werden bekannt. Damit bieten sie dann diversen Spammern, Phishern und anderen Personen diverse Möglichkeiten, sei es für email-versand, einfach nur eine seite wo sie eventuell bösen code lagern können oder auch z.b. eine weitere Datenbank für Emailadressen von Leuten (mit etwas glück auch passwörter in ungesicherter Form mit denen man ja einen bot ausstatten soll der anhand dem email-adressen prefix nach solchen accounts auf anderen foren/communitys sucht und schaut ob er da mit dem passwort auch reinkommt)
    Gerade auch für Laien ein oftmals großes Problem, sobald sie mal ein paar Zeilen oder mehr an einem System sei es phpbb,joomla, wordpress oder sonstwas, selbst verändert haben, wollen sie das nicht nochmal machen (Wie erstellt man Patches ? Wie wendet man sie auf Code an ? wie merged man (händisch) Code ? Wie testet man seine änderungen dann [automatisiert]? … das kennt/kann der Laie alles nicht), was auch wieder darin resultiert dass keine Updates gemacht werden und die Software von Tag zu Tag älter wird und mehr bekannte Sicherheitslücken aufweist.

    Auch immer sehr schön wenn man solche Leute auf eventuelle Sicherheits-Probleme anspricht die Kommentare die man da erhält … „mich will schon keiner hacken“, „warum sollte mir das passieren“, „die seite nutzt eh kaum jemand“, „ich kann das nicht updaten weil dann plugin-x und meine eigenen modifikationen y nicht laufen“, …. .
    Kaum jemand von diesen Leuten realisiert, dass in den heutigen Zeiten kein Scriptkiddie mehr sich den aufwand macht explizit eine gewisse Seite vom ortsverein für gemüse-züchter in Unter-Was-Weis-Ich-Was zu hacken, da laufen ein paar Bots die einfach das Web crawlen und auf Sicherheitslücken oder spezielle Programme und Versionen testen, die vielleicht auch eine Datenbank mit seiten und den verwendeten systemen (+version wenn preisgegeben) erstellen um später mit weniger aufwand bei bekanntwerden einer lücke diese direkt ausnutzen zu können.
    Auch ein schöner Kommentar: „Aber das seh ich ja dann und dann kann ich was machen“.
    Eben nicht, im Idealfall wird immer versucht sowas nicht erkennbar zu machen, sieht man ja an Botnetzen und den ganzen Zombie-PCs, wo die Würmer sogar Virenscanner installieren (in manipulierter Form) um weiter potentielle Schädlinge drausenzuhalten, damit sie selbst die Resourcen nutzen können und es dem User möglichst nicht auffällt.

    Kommentar by robo47 — 13.03.2010 @ 12:26:36

  2. Ein Programm soll tun, was ich von ihm will, ist da nur allzu häufig eine der ersten Antworten, die man da zu hören bekommt.

    Das finde ich auch immer toll. Immerhin impliziert diese Aussage ja, dass der Programmierer Abstürze *will* 😉 Normalerweise würde man ja annehmen, dass „es stürzt nicht gleich ab“ auch eine der Eigenschaften ist, die ein Programm haben sollte…

    Nur: ich erwische mich auch ab und zu dabei, „nur schnell mal was zu hacken“… da ist dann keine Fehlerbehandlung drin und wenn doch, ist das ganze so krude, dass man direkt sieht, dass das gehackt war. Irgendwann landet man dann bei der Feststellung dass das Programm doch noch öfter gebraucht wird, und schreibt alles neu.
    Nicht gerade effizient.

    Zum Kommentar über mir passt auch sehr gut ein Satz aus der c’t 2010/6, S.197, in der es um die Ineffizienz von Flash geht.

    Macromedia stellte mit Flash seinerzeit wenig programmieraffinen Designern eine leistungsfähige Plattform zur Verfügung – mit ähnlichen Folgen wie bei PHP: Eine große Zahl unerfahrener Entwickler gestaltete mit fehlertoleranten Werkzeugen Anwendungen, ohne auf den Ressourcenverbrauch zu achten.

    Ähnlich wie Sicherheitsbewusstsein gehört auch das Bedenken von Ressourcenverfügbarkeit immer zu gut entwickelter Software. Manche Konstrukte sollte da ein Compiler / eine Runtime auch direkt ablehnen.
    Grade auf XAMPP-Projekten sieht man unglaublich oft Seiten, die immer wieder die gleichen Datenbankabfragen ausführen. Das mag alles funktionieren, solange noch keiner die Seite besucht. Spätestens wenn man mal geslashdottet wird, hat sich das, weil die Datenbank immer zuerst in die Knie geht. Populäres Beispiel: WordPress. Wies richtiger geht, sieht man bei S9Y.
    Aber das wäre schon wieder einen weiteren Artikel wert; viel zu viel um das in so einem kleinen Kommentarfeld zu schreiben… 😀

    Kommentar by Martok — 13.03.2010 @ 17:32:12

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress