Schlamperei in der Softwareentwicklung

25 gefährliche Programmierfehler

05.09.2011
Von 


Joachim Hackmann ist Principal Consultant bei PAC – a teknowlogy Group company in München. Vorher war er viele Jahre lang als leitender Redakteur und Chefreporter bei der COMPUTERWOCHE tätig.

Unsichere Interaktion zwischen Komponenten

Unzureichende Eingabevalidierung: Die Möglichkeit, falsche Daten in ein Eingabefeld einzutragen, ist der Killer Nummer eins für fehlerhafte Software, schreibt das SANS-Institut. Gemeint sind fehlende Prüfroutinen, wenn etwa die Software etwa eine Zahlenangabe erwartet, der User aber fälschlicherweise Buchstabenfolgen eingibt. Hier versäumen es Programmierer schon mal, eine entsprechende Vorsorge zu treffen und unzulässige Eingabe abzufangen. Komplexe Applikationen bieten eine Vielzahl von Möglichkeiten zur falschen Dateneingabe. Oft sind die Fehlerquellen schwer zu erkennen.

Das Institut empfiehlt Tools zur Eingabevalidierung wie etwa das Framework Apache Struts oder die Methodensammlung ESAPI des Open Web Application Security Project (OWASP).

Ungenaue Kodierung und Maskierung der Ausgabedaten: Dieser Programmierfehler ist Pedant zur fehlenden Eingabevalidierung. Wenn ein Programm eine Ausgabe erzeugt, die anderen Komponenten als Input dient, dann sollten Anweisungen und Metainformationen von den eigentlichen Daten getrennt werden. Ein weit verbreitetes Vergehen besteht darin, alle diese Informationen in einem Datenstrom einzustellen und nur durch spezifische Trennzeichen voneinander abzugrenzen. Dies kann Angreifern die Möglichkeit eröffnen, die integrierten Anweisungen, etwa SQL-Statements, zu manipulieren.

Das SANS-Institut rät daher Programmierern, explizit Encoding-Zeichen zu setzen, wann immer das Protokoll es erlaubt.

Unsichere SQL-Statements (auch bekannt als SQL-Injection beziehungsweise SQL-Einschleusung): Wenn Angreifer die SQL-Abfragen manipulieren können, fällt es ihnen leicht, sich Zugang zu wesentlichen Informationen zu verschaffen. Werden SQL-Queries für Sicherheitsfunktionen wie Authentifizierung verwendet, können Angreifer diese verändern und sich unerlaubten Zugriff auf dieses System verschaffen. Abhilfe schaffen Datenbank-Frameworks und Shared Procedures. Zudem sollten Entwickler den Einsatz von Persistenzlösungen wie Hibernate in Erwägung ziehen.

Fehlerhafte Web-Seiten-Programmierung (Cross-site Scripting): Das Cross-site scripting (XSS) gehört zu den gängigen, hartnäckigen und gefährlichen Schwachstellen von Web-Anwendungen. Basis dafür ist die Kombination von http, Parametern und Scripts zur Erzeugung dynamischer Web-Seiten. Wurde sie nicht sorgfältig implementiert, können Angreifer beispielsweise Javascript einschleusen, das von Browsern der Web-Seiten-Besucher ausgeführt wird.

Unsicherer Aufruf von externen Programmen: Oft arbeitet eine Applikation als Mittler zwischen Anfragen, die von außen kommen, und den internen Funktionen des Betriebsystems. Dies ist der Fall, wenn Applikationen native Programme des Betriebssystems aufrufen und dabei nicht verhindern, dass unzulässige Eingaben in das Kommando eingeschleust werden. Angreifer könnten damit die Herrschaft über das Betriebssystem übernehmen. Wo möglich sollten daher Bibliotheken anstatt externer Prozesse aufgerufen werden.

Klartext-Übertragung sensibler Daten: Zum Teil versenden Applikationen sensible Daten unverschlüsselt über das Netz. Sniffer-Tools sind weit verbreitet, so dass Interessenten den Datenverkehr lesen können. Die Informationen mit URL-Kodierung oder Base64 zu verschlüsseln bietet keinen Schutz. Sensible Daten sollten immer verschlüsselt werden. Web-Applikationen mit SSL sollten so gestaltet werden, dass die gesamt Transaktion und nicht nur der Anmeldeprozess verschlüsselt wird.

Anfälligkeit für Cross-Site Request Forgery (CSRF): Kaum jemand würde am Flughafen einen Koffer mit unbekanntem Inhalt von einem Fremden mit entgegen nehmen. Genau das macht die Cross-Site Request Forgery, nur das der Angreifer Daten einer Webanwendung manipuliert, indem er den Zugang berechtigter User nutzt. Der Web-Browser des Opfers setzt wie vom Angreifer gewünscht HTTP-Request an die Web-Anwendung ab. Gefährlich wird es dann, wenn der angemeldete Benutzer über Administrator-Rechte verfügt.
Als Gegenmittel gibt es Anti-CSRF-Pakete wie CSRFGuard vom OWASP.

Unbeabsichtigte Wettlaufsituationen (Race Condition): Verkehrsunfälle entstehen, wenn zwei Fahrzeuge zur exakt gleichen Zeit den genau gleichen Fahrbahnabschnitt nutzen wollen. So etwas passiert auch im Softwarebetrieb. Oft kollidieren mehrere Prozesse, wobei der Angreifer die Kontrolle über einen Prozess hat. Die Konkurrenz der Prozess kann zum Denial of Service führen, also zum Totalausfall der System. Die Probleme können sich über das Web auf andere Seiten fortpflanzen.

Einige Programmiersprachen implementieren Synchronisierungsfunktionen. Eine andere Lösung ist es, Spring-Abstraktionen zu nutzen, um die Threads zu sichern.

Schwachstellen in Fehlermeldungen: Allzu viel sagende Fehlermeldungen bieten Angreifern wertvolle Informationen über Interna in der Software. Zu den Angaben, die nicht in eine Fehlermeldung gehören, zählen etwa Daten, die etwa Personen identifizieren können, Authentifizierungsbestätigungen sowie Server-Konfigurationen. Zunächst mögen die gewährten Einblicke harmlos erscheinen, wie etwa Angaben zum Installationspfad der Software. Die Vielzahl der Informationen kann eine Attacke erleichtern. Besser ist es, dem Nutzer eine einfache Fehlermeldung zuzustellen. Begründungen inklusive Log-File sind nicht angemessen.