2009-08: Die falsche Programmiersprache gefährdet das Internet
Die Entscheidung, um was sich die aktuelle Kolumne drehen sollte, war diesmal schwierig: Die Zugriffe der USA auf alle europäischen Banktransaktionen bei SWIFT schien spannend, ebenso der neue „Internet-Brief“ der Deutschen Post. Aber jetzt wurde es doch ein ganz anderes Thema, nämlich Programmiersprachen und Security.
Was hat das eine mit dem anderen zu tun?
Buffer Overflows sind bekanntlich die Ursache vieler Schwachstellen. Die Ursache vieler Buffer Overflows ist aber ausgerechnet eine Programmiersprache, nämlich C . Erst Ende Juni hat Adobe eine Sicherheitslücke in Flash gemeldet. Betroffen sind auch Flash-Filme, die in PDFs eingebunden sind. Die Ursache der Schwachstelle ist ein Buffer Overflow.
Ein weiteres, großes Problem bei C ist: es kennt nur primitive Datentypen, noch nicht einmal einen String (oder ähnliches) kennt es, sondern immer nur 'char *' (Zeiger auf einen Charakter). Will man den String durchlaufen, wird der Zeiger erhöht. C kann in einem derartigen Konstrukt nicht feststellen wie groß der Speicherbereich für den String ist und damit besteht keine Chance zu bemerken, wenn der Zeiger schon nicht mehr auf den Puffer zeigt. Genau das ist die Ursache für die ständig auftretenden Buffer-Overflows!
Es gibt zwarGegenmaßnahmen, beispielsweise strncpy() statt strcpy(), aber dazu muss man die Länge der Puffer durch das gesamte Programm schleifen. Das ist lästig und fehleranfällig.
Noch ein Beispiel: Eine Schwachstelle in der ActiveX Template Library (ATL), die Microsoft am Wochenende (sic!) gemeldet hat, wird ebenfalls durch eine umständliche Syntax von C verursacht: Ein Typecast und ein kleines, unscheinbares &-Zeichen, das leicht zu übersehen ist, bedingt den Fehler: '(void *)&varname'. Der Typecast verhindert, dass der Compiler den Fehler entdeckt.
Auf Heise Security gibt es übrigens eine recht lesbare Beschreibung zur Fehlerursache.
Einfach die falsche Programmiersprache
Eine Programmiersprache soll den Programmierer bei seiner Arbeit unterstützen. Dazu gehört es, möglichste wenige Fallstricke und dafür das eine oder andere Sicherungsseil einzubauen. Aber nur wenige Programmiersprachen werden hier ihrer Aufgabe gerecht.
C ist mehr oder weniger ein offener Geländewagen, bei dem sich der Programmierer um alles kümmern darf – und muss. Es ist verständlich, dass der Sprache ein Modulkonzept fehlt. Das wurde erst ein Jahr nach C erdacht. Es stellt sich aber die Frage, weshalb noch so viele Programmierer das Risiko in Kauf nehmen und mit einer Sprache arbeiten, die mit so vielen konzeptionellen Mängeln behaftet ist.
Was dann?
Es muss ja nicht gleich ein Programmiersprache wie Modula oder Oberon sein und Sie brauchen auch nicht auf Java umzusteigen. Schon der simple Wechsel zu C++ oder Objective-C bringt mehr Sicherheit. Denn in diesem Programmiersprachen gibt es intelligente Datentypen, beispielsweise einen String-Typ, der die Länge des Puffers kennt und überwacht. Die Programmierer werden dadurch entlastet, der Compiler nimmt ihnen Arbeit ab.
Übrigens: Meine Philosophie findet sich in The Zen of Python genau wieder.
Eigentlich wollte ich nie mehr einen Sprachenstreit lostreten, die Diskussion anno 1993 mit 470 Beiträgen war brotlos genug. Wenn Sie aber diskutieren wollen: Mailen Sie einfach an kolumne@goebel-consult.de. Oder posten Sie besser gleich in alt.religion.programming-languages :-)