15.06.2016 Penetrationstests und Statische Codeanalyse

Dieser Artikel bespricht zwei wesentliche Techniken aus dem Bereich der sicheren Softwareentwicklung – Penetration Tests und statische Code Analyse – sowie deren Einsatzmöglichkeiten. Es wird aufgezeigt, welche Vorteile sich durch den Einsatz dieser Techniken in der Praxis ergeben. 

Möchte man die Qualität von Software sicherstellen, gibt es grundsätzlich zwei unterschiedliche Ansätze. Man kann einerseits den Quellcode genau analysieren, um Fehler oder Schwachstellen zu finden, oder man kann das Programm starten und die Funktionen aus Benutzersicht überprüfen. Diese Techniken finden auch bei der Überprüfung der Softwaresicherheit Anwendung, man nennt sie statische Code Analyse [1] und Penetration Tests [2].  Am Masterstudiengang IT & Mobile Security der FH JOANNEUM führen wir solche Überprüfungen der Softwaresicherheit regelmäßig durch. In diesem Artikel möchte ich unsere Erfahrungen zusammenfassen. 

In der Praxis kommen unterschiedliche Ausprägungen dieser beiden Techniken zum Einsatz [3, 5]: 

  • Manuell statische Analyse
    Der Quellcode und andere Teile eines Softwaresystems werden durch manuelle Inspektion analysiert. Dabei können potentielle Schwachstellen und Sicherheitslücken aufgespürt und in einem Report festgehalten werden. Diese Technik funktioniert auch für Dokumente und Diagramme.
  • Automatisierte statische Analyse
    Ein Nachteil der manuellen Inspektion ist, dass sie bereits für mittelgroße Softwaresysteme zu aufwändig und fehleranfällig wird. Abhilfe schaffen Tools, die aus dem Quellcode Modelle aufbauen und mit einem Regelwerk vergleichen können. Dieser heuristische Ansatz führt naturgemäß zu falschen Fehlermeldungen (false positives) oder zu nicht gefundenen Schwachstellen (false negatives). 
  • Explorative manuelle Penetrationstests
    Bei diesem Ansatz wird das Softwaresystem aus Sicht der Benutzer verwendet und dabei gezielt angegriffen. Die Angriffsziele werden erst während des Tests festgelegt und folgen keinem vorgegebenen Plan. Hier kommt es auf die Erfahrung des Testers an, um mögliche Schwachstellen während der Verwendung der Software zu erkennen.
  • Systematische manuelle Penetrationstests
    Im Gegensatz zum explorativen Ansatz wird beim systematischen Testen vorab ein Testplan aus dem Anforderungsdokument erstellt. Dieser Testplan wird dann manuell abgearbeitet und die Ergebnisse protokolliert.
  • Automatisierte Penetrationstests
    Hier steht ebenfalls die Automatisierung im Vordergrund, um größere Softwaresysteme in kurzer Zeit testen zu können. Viele Angriffsszenarien werden mit unterschiedlichen Tools realisiert, sodass es hier eine große Auswahl – auch im Open Source Umfeld – gibt. Die Tools orientieren sich nicht an den funktionalen Anforderungen, sondern wenden eine Mischung aus Brute Force Methoden und bekannten Angriffsmustern an.

Welche dieser Verfahren eingesetzt werden, hängt vom verwendeten Softwareentwicklungsprozess, der Anwendungsdomäne und nicht zuletzt von der verwendeten Zielplattform ab. Trotzdem lassen sich einige Beobachtungen aus dem praktischen Einsatz beschreiben:

Die statische Codeanalyse kann bereits sehr früh im Projektverlauf eingesetzt werden, lange bevor es eine lauffähige Applikation gibt. Üblich ist der Einsatz von Tools im Zuge eines automatisierten Build-Prozesses. Die generierten Reporte müssen regelmäßig manuell verifiziert und priorisiert werden, d.h. es müssen potentielle Schwachstellen im Quellcode untersucht werden. Auch muss entschieden werden, ob es sich um ausnutzbare Probleme handelt. Die notwendigen Änderungen sind aber während der laufenden Entwicklung leicht möglich und verursachen kaum Mehrkosten. Die Penetrationstests überprüfen eine fertige Applikation in einem möglichst realen Umfeld, d.h. am Ende des Projektverlaufes. Auch hier setzt man stark auf die Verwendung von Tools, um die Effizienz zu steigern. Wiederum müssen die generierten Reporte manuell überprüft werden. Sollten Änderungen in der Implementierung oder am Design nachträglich notwendig sein, so kann das erhebliche Kosten verursachen.

Ein weiterer Aspekt ist die Verfügbarkeit von geschultem Personal. Penetrationstests werden häufig zugekauft. Das erlaubt den Einsatz von hoch spezialisierten Personen über eine kurze Periode. Andererseits ist die Chance, dass das Entwicklungsteam von diesem Wissen profitiert, eher gering. Die statische Codeanalyse begleitet das Team durch das gesamte Projekt. Das bedeutet üblicherweise, dass das Wissen im Team vorhanden sein muss, bzw. dort aufgebaut wird.

Die Entscheidung, ob manuelle Techniken oder automatisierte Tools eingesetzt werden, wird sehr oft durch zeitliche Vorgaben getroffen. Es zeigt sich aber, dass eine Kombination von Tools und manuellen Analysen eine wesentliche Verbesserung der Analysequalität ermöglicht. Während Tools auch in großen Softwaresystemen schnell bekannte Schwachstellen aufspüren können, finden manuelle Techniken auch neue Schwachstellen an.

Eine massive Effizienzsteigerung lässt sich durch die Kombination von Penetrationstests und statischer Codeanalyse erreichen. Ein Penetrationstest simuliert sehr genau den Zugang von externen Hackern. Dabei darf man aber nicht vergessen, dass Penetrationstests zeitlich immer limitiert sind, was bei Hackerangriffen selten der Fall ist. Ein Penetrationstest kann in kurzer Zeit nie alle Schwachstellen eines Softwaresystems aufspüren. Die statische Code Analyse kann theoretisch viel mehr Angriffspunkte und Probleme aufzeigen. Eine Schwachstelle wird aber oft erst als solche wahrgenommen, wenn sie ausgenutzt wird. Erst der gemeinsame Einsatz beider Techniken erlaubt es, in kurzer Zeit viele Schwachstellen zu finden und auszunutzen. Die statische Codeanalyse liefert eine Liste potentieller Probleme, die Penetrationstests versuchen genau diese Schwachstellen auszunutzen.

Es ist unmöglich, eine allgemeine Vorgehensweise zu beschreiben, zu unterschiedlich sind die verwendeten Tools und das Wissen von Entwicklungsteams zum Thema Softwaresicherheit. Trotzdem decken sich unsere praktischen Erfahrungen in weiten Bereichen mit den Ergebnissen von internationalen Studien [4]. Die wesentlichsten Übereinstimmungen sind: Statische Codeanalyse kann im Mittel mehr echte Schwachstellen finden als Penetrationstests; Eine Kombination aus statischer Codeanalyse und Penetrationstests führt schneller zu brauchbaren Ergebnissen; Es empfiehlt sich, zuerst mit automatischen Tools zu beginnen und erst anschließend manuelle Techniken einzusetzen.

Unser Ziel an der FH JOANNEUM ist es, das Wissen zum Thema Softwaresicherheit durch praktische Projekte weiter auszubauen und vor allem auch dieses Wissen an unsere Studierenden weiter zu geben. 

Literatur:

[1] Brian Chess und Gary McGraw, Static analysis for security, IEEE Security & Privacy, 2004
[2] Matt Bishop, About Penetration Testing, IEEE Security & Privacy, 2007
[3] Andrew Austin und Laurie Williams, One Technique is Not Enough: A Comparison of Vulnerability Discovery Techniques, International Symposium on Empirical Software Engineering and Measurement, 2011
[4] Riccardo Scandariato und James Walden und Wouter Joosen, Static analysis versus penetration testing: A controlled experiment, 24th International Symposium on Software Reliability Engineering, 2013
[5] Gary McGraw, Software Security: Building Security In, Addison Wesley, 2006

Über den Autor

Datum der Veröffentlichung: 15.06.2016

Für den Inhalt verantwortlich:
  • FH Joanneum