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
:-)