09.04.2008, 08:26 Uhr
Die Sicherheit der Sprachwahl
Gibt es Unterschiede bei der Sicherheit der unterschiedlichen Programmiersprachen?
Marc Ruef ist Buchautor und Security Consultant beim Sicherheitsunternehmen scip AG, Zürich. www.scip.ch
Ein Computer führt einzelne Instruktionen aus, welche in ihrer reinsten Form als Reihen von Nullen und Einsen zu verstehen sind. Für Menschen ist es schwierig, wohl definierte Programme direkt in dieser Maschi-nen-sprache zu schreiben. Daher wurden höhere Programmiersprachen wie etwa Fortran, Pascal und Java entwickelt.
Sie verwenden Schlüsselworte und einfache Konstrukte, um komplexe Abläufe abzubilden. Durch Variablenzuweisun-gen, erweiterte Kontrollstrukturen und andere Konzepte wird es für Programmierer damit einfacher, umfassende Applikationen zu schreiben. Vor der Ausführung durch den Computer muss das Programm compiliert, also in Maschinencode umgewandelt werden.
Grundsätzlich kann man dabei nicht sagen, eine Programmiersprache sei sicherer als eine andere. Eine Programmiersprache selbst ist schliesslich nur eine alternative Darstellung einer bestimmten Befehlsabfolge. Die Sicherheit der Anwendung wird in erster Linie durch die Richtigkeit dieser Anweisungen und deren Abläufe erreicht.
Allerdings wird eine Sprache, die besonders einfach gehalten ist und sich damit intuitiv benutzen lässt, zu weniger fehleranfälligen Entwicklungen führen. Ein möglichst einfacher Syntax sowie eine strenge Prüfung semantischer Gegebenheiten helfen dabei, sichere Anwendungen zu schreiben.
Die Umwandlung der Programmiersprache in ausführbaren Maschinencode durch den Compiler hat weiterführenden Einfluss auf die Sicherheit. Bei dieser Übersetzung muss die abstrakte Logik der Programmiersprache in den linearen Ablauf des Maschinencodes übertragen werden. Fehler in diesem Prozess können zu Schwachstellen in der finalen Programmnutzung führen.
Ist ein Compiler etwa nicht in der Lage, den für eine Variable effektiv zu nutzenden Speicher richtig zu alloziieren, kann dies zu einer klassischen Pufferüberlauf-Schwachstelle führen. Dieses Problem tritt vorzugsweise in der Sprache C auf, die leider einige undurchsichtige und leicht falsch zu nutzende Funktionen wie strcpy() und gets() anbietet. Die Liberalität der Sprache im Umgang mit eben diesen Funktionen führt erst die Möglichkeit derartiger Schwachstellen ein.
In der Diskussion um sichere Programmiersprachen äussern sich Spezialisten immer wieder gegen PHP. Effektive Argumente hierzu finden sich aber selten. Ein Aspekt mag sein, dass die Sprache eine Vielzahl an redundanten Built-In-Funktionen bereitstellt, die jeweils mit gänzlich unterschiedlicher Syntax daherkommen (zum Beispiel chop() und rtrim()). Dies begünstigt den Umstand der fehlerhaften Nutzung einzelner Funktionsaufrufe, was aber eher auf die Unzulänglichkeit des Programmierers zurückzuführen ist.
Die tatsächlich mit PHP in Verbindung zu bringenden Schwachstellen sind schluss-endlich nur jene, die sich in der Zend-Engine finden, welche für die Interpretation des PHP-Codes zuständig ist. Bei der Übersetzung werden also auch hier Fehler begangen, die zu Speicherschutzverletzungen führen und damit erweiterte Rechte erlangen lassen können. Die Sprache PHP selbst, also die Konstruktion der Schlüsselworte als solche, kann dafür aber wenig.
Damit wird klar: Die Diskussion zu sicheren Programmiersprachen ist genauso unfruchtbar wie der Streit, welches das bessere Betriebssystem ist. Schluss-endlich haben der Entwickler und der Benutzer gewisse Anforderungen an eine Lösung. Eine gute Programmiersprache ist deshalb je nachdem einfach, einheitlich, orthogonal, systemnah, ab-strahiert, verständlich, kaskadiert, modular, sicher, aussagekräftig, effizient, komfortabel und populär. Die ultimative Sprache, die all diese Wünsche gleicher-massen erfüllt, ohne für sich selbst erneut Nachteile einzuführen, gibt es leider nach wie vor nicht.
Marc Ruef