Skip to main content

Kurzüberblick zur statischen Codeanalyse

Zweck und Verwendung der statischen Codeanalyse

Artikel von:
0 Min. Lesezeit

Eine wichtige Voraussetzung jeder Software ist die Codequalität. Denn die wirkt sich unmittelbar auf die Qualität der resultierenden Software aus. Die Codequalität korreliert dabei nicht nur mit der Sicherheit, sondern auch mit der Stabilität und Verlässlichkeit der jeweiligen Anwendung. Um sie zu gewährleisten, werden gerne Verfahren wie Code-Reviews und automatische oder manuelle Tests verwendet.

Die sind zwar wichtig für die Codequalität, führen aber nicht unbedingt sämtliche Probleme zutage. Und da sie von Menschen gesteuert werden, schaffen es einige Sicherheitslücken trotzdem noch in die Produktionsumgebung.

Laut dem State of Cloud Native Application Security Report sind Konfigurationsfehler und bekannte, aber unbehobene Schwachstellen die Hauptursachen für Sicherheitslücken in cloudnativen Umgebungen.

wordpress-sync/security-incidents-by-type

Open-Source-Codeanalysen könnten jede zweite davon verhindern. Denn anstatt lediglich die Symptome zu bekämpfen, wird das Problem bei der statischen Codeanalyse mithilfe einer eingebetteten Qualitätssicherung und obligatorischen Programmierstandards bereits zu Beginn der Softwareentwicklung an der Wurzel gepackt.

Was versteht man unter statischer Codeanalyse?

Die statische Codeanalyse (auch: Quellcodeanalyse oder statischer Code-Review) erkennt Mängel in der Programmierung sowie potenzielle Schwachstellen und Sicherheitslücken im Quellcode, ohne diesen auszuführen. Es handelt sich also um eine Form von White-Box-Tests.

So lassen sich Programmierfehler und andere Anfälligkeiten erkennen, die bei anderen Verfahren und Tools wie dem manuellen Code-Review oft übersehen werden.

Die kurzen Feedbackschleifen sind ein zentraler Bestandteil von DevOps. Und mit der statischen Codeanalyse lassen sich in kürzester Zeit automatische Rückmeldungen zur Erkennung von Mängeln generieren, die andernfalls zu noch gravierenderen Problemen führen könnten.

Doch die statische Codeanalyse ist nicht nur zur Kontrolle des Programmierstils geeignet. Vielmehr lässt sie sich auch für das statische Testen der Anwendungssicherheit (Static Application Security Testing, SAST) einsetzen.

Bei der statischen Codeanalyse wird der Quelltext auf folgende Gesichtspunkte hin überprüft:

  • Programmierfehler und Sicherheitslücken

  • Dokumentationsqualität

  • Einklang von Formatierung und Softwaredesign

  • Berücksichtigung von Projektvorgaben, Programmierstil und Best Practices

  • Verstöße gegen Regeln und Konventionen mit Folgen für die Programmausführung und nichtfunktionale Qualitätsaspekte des Softwaresystems wie Komplexität und Wartungsfreundlichkeit

Im nächsten Abschnitt wird der Frage nachgegangen, wieso die statische Codeanalyse in der Softwareentwicklung Berücksichtigung finden sollte.

Static Code Analysis (SCA) und Static Application Security Testing (SAST) im Vergleich

Beim Static Application Security Testing (SAST) werden Sicherheitslücken mithilfe statischer Codeanalysen gesucht. Grundsätzlich lassen sich damit Schwachstellen in Stil, Format, Qualität, Leistung und Sicherheit identifizieren. SAST-Tools sind auf größtmögliche Präzision ausgelegt. So sollen False Positives und False Negatives vermieden werden – also Falschmeldungen und übersehene Sicherheitsrisiken. Diese Tools liefern detaillierte Angaben über die zugrunde liegenden Ursachen und schlagen auch gleich Gegenmaßnahmen vor.

6 gute Argumente für Quellcodeanalysen

Erfolgt die statische Codeanalyse im Rahmen eines DevOps-Prozesses, bietet eine automatische Prüfung diverse Vorteile in der Entwicklung.

1\. Kosten- und Zeitersparnis

Die Quellcodeanalyse unterscheidet sich insofern von anderen Testverfahren, als sie die Erkennung von Programmierfehlern ermöglicht, ohne dass der Quellcode ausgeführt werden muss.  Die Kosten, die mit der Beseitigung von Schwachstellen verbunden sind, steigen mit jeder Phase im Entwicklungsprozess exponentiell an. Die statische Quelltextüberprüfung spart Zeit und Aufwand und verkürzt so den Entwicklungsprozess. Und Sie können mit ihr enorme ungeplante Kosten einsparen, da Programmierfehler zu einem Zeitpunkt erkannt werden, an dem ihre Beseitigung noch relativ günstig ist.

2\. Mehr Codesicherheit

Das Thema Codesicherheit ist in der Softwareentwicklung extrem wichtig. Da heutzutage so gut wie alles von Software abhängt, muss der Quellcode permanent auf potenzielle Schwachstellen hin geprüft werden, wie sie in modernen Anwendungen nur allzu oft anzutreffen sind (wie unzureichende Verschlüsselung, Ressourcenlecks, unsichere Schnittstellen, Pufferüberläufe etc.). Bei der statischen Codeanalyse wird der Quelltext bereits beim Programmieren automatisch auf Sicherheitslücken hin überprüft, was Datenverlusten einen Riegel vorschiebt. Durch die frühzeitige Einbindung der Sicherheitskontrollen in den Entwicklungsprozess lassen sich deshalb sowohl die Kosten als auch die Risiken durch spätere Sicherheitslücken eingrenzen.

3\. Geringere Fehlerquote

Tools für die statische Quellcodeanalyse verhindern Softwarefehler, indem sie Programmierfehler und Bugs erkennen, noch bevor diese in die nächste Release gelangen können. Zudem verhindert eine Quellcodeanalyse, dass sich strukturelle Mängel wiederholen. Auf diese Weise lassen sich Präventionsrichtlinien aufstellen und damit Programmierfehler im gesamten Softwareentwicklungs-Lebenszyklus verhindern. Bei der Entwicklung komplexer sicherheitsrelevanter Softwaresysteme ist eine möglichst frühzeitige Erkennung von Mängeln extrem wichtig. Denn schon ein einziger Fehler kann gravierende Folgen haben – bis hin zu Personenschäden oder Systemausfällen.

4\. Prozessoptimierung

Bei einer Einbindung der statischen Codeanalyse in DevOps verringern automatische CI/CD-Abläufe den Prüfaufwand und entlasten damit auch die Entwicklungsabteilung. Zudem erhält diese zeitnah genaue Rückmeldungen und Verbesserungsvorschläge, die wiederum zu einer höheren Programmierqualität führen und Wiederholungsfehler unwahrscheinlicher machen.

5\. Geringeres Risiko bei komplexen Codebases

Je wichtiger Softwaresysteme für das Unternehmen sind, desto komplexer wird auch die Codebasis – und desto schneller wächst sie an. Meist umfasst sie dabei sowohl neue als auch überarbeitete ältere Codebestandteile. Letztere mögen zwar dazu beitragen, die Entwicklungskosten insgesamt zu senken. Doch sie bergen auch die Gefahr von Fehlern und sind relativ kompliziert zu übertragen.

Viele junge Programmierer kopieren gerne Code von Websites wie StackOverflow, ohne sich jedoch über dessen konkrete Folgen bewusst zu sein. Mithilfe der statischen Codeanalyse können die daraus resultierende Komplexität und die entstehenden Risiken aber eingegrenzt werden. Denn sowohl der neu geschriebene als auch der bereits vorhandene Code wird überprüft, bevor er im Projekt verwendet wird. Damit bietet die statische Codeanalyse eine Möglichkeit, sowohl internen als auch externen Entwicklungsstandards Geltung zu verschaffen.

6\. Laufende Optimierung

Die statische Codeanalyse erlaubt Einblicke in Programmierfehler und die Bestimmung von Verbesserungsmöglichkeiten in der laufenden Entwicklung. Sie sorgt für geringere Fehlerquoten und verbessert die Qualität von Codeänderungen, die vor der Weitergabe an das Quellcode-Repository durchgeführt werden. Zudem werden Fehler bereits während des Programmierens erkannt, die ansonsten auf manuellem Wege kaum bemerkt würden. Kurzum: Die statische Codeanalyse ermöglicht eine Softwareentwicklung ohne Kompromisse in Sachen Qualität, Tempo und Genauigkeit.

Damit bietet sie eine gute Möglichkeit zur Verbesserung von Programmierqualität und Anwendungssicherheit, verhindert Programmierfehler und senkt den Zeit- und Kostenaufwand im gesamten Prozess.

In den nachfolgenden Abschnitten werden Fragen vorgestellt, die man sich vor der Festlegung auf ein bestimmtes Tool für die statische Codeanalyse stellen sollte.

So finden Sie das richtige Tool

Die statische Codeanalyse hat enorme Fortschritte gemacht. Viele aktuelle SCA-Tools lassen sich in DevOps-Prozesse und agile Workflows einbinden und können auch komplexe, umfangreiche Codebases auswerten. Und das wiederum bedeutet eine größere Reichweite, weniger Missverständnisse und Unterbrechungen und somit mehr Anwendungssicherheit.

Doch nicht alle Tools bieten dasselbe. So sind einige nicht umgebungs- und plattformunabhängig, während andere nur bestimmte Frameworks und Programmiersprachen unterstützen. Im folgenden Abschnitt werden daher Programme für die statische Codeanalyse vorgestellt, mit denen Sie Ihre Anwendungen schützen können. Eine zentrale Rolle nehmen dabei SAST-Tools ein.

Die Auswahl des passenden Tools hängt also von mehreren Faktoren ab, darunter Entwicklungsumgebung, Sicherheitsbudget, verwendete Tools und Frameworks, die Größe der Codebasis, die verwendete Programmiersprache und der Entwicklungsablauf. Und nur wenn diese berücksichtigt werden, findet man ein Tool für die statische Codeanalyse, das einerseits die Produktivität steigert und andererseits für möglichst wenig Frust und Zusatzkosten sorgt.

Diese Fragen sollten Sie sich dabei stellen:

  • Ist das Tool entwicklerfreundlich?

  • Unterstützt es die gängigen Programmierstandards?

  • Ist es kostenpflichtig oder gratis?

  • Wie kompliziert sind Einrichtung und Verwendung?

  • Wie verlässlich sind die Befunde?

  • Wie lange dauern die Scans?

  • Sind Berichts- und Warnfunktionen vorhanden?

  • Wird die verwendete Programmiersprache unterstützt?

  • Wie praxistauglich und zuverlässig sind die Analyseergebnisse?

  • Bietet das Tool Überblicke zu Programmierfehlern und Sicherheitslücken?

  • Wie gut lässt es sich in die bestehenden Entwicklungsprozesse einbetten?

Aktuelle Open-Source-Tools für die statische Codeanalyse:

Hier stellen wir einige geeignete Programme für die statische Codeanalyse vor. Die Tools sind entweder komplett lizenzfrei oder als kostenlose Variante erhältlich.

  1. Snyk Code: Das entwicklerfreundliche SAST-Tool Snyk Code ist kostenlos für zahlreiche Programmiersprachen wie Python, Java, JavaScript und C++ erhältlich. Snyk wird bereits während der laufenden Entwicklung ausgeführt und ermöglicht es, Schwachstellen aus der Codebasis fernzuhalten.

  2. Bandit: lizenzfreies Programm, das häufige Sicherheitsprobleme in Python-Code findet.

  3. Brakeman: kostenloser Schwachstellen-Scanner für Ruby.

  4. Spotbugs: (früher „FindBugs“) ein gängiges lizenzfreies Programm für die Codeanalyse in Java.

  5. Graudit: enthält Skripte und Signaturen und findet mit dem GNU-Tool Grep Sicherheitslücken im Quellcode.

Im nächsten Abschnitt wird gezeigt, wie sich SAST-Tools in DevSecOps einbinden lassen.

Statische Codeanalyse in der Praxis

Zu Beginn des Entwicklungsprozesses wird meist zunächst der Code in der lokalen Umgebung analysiert – und zwar manuell. Doch Schwierigkeiten etwa bei der Durchsetzung von Konformitätsanforderungen werden oft erst mit der Zeit spürbar. Das gilt umso mehr für Open-Source-Projekte, bei denen sich die Beteiligten nicht alle am selben Ort befinden.

Eine Möglichkeit zur Sicherstellung der Konformität besteht darin, die statischen Sicherheitstests in die gesamte DevSecOps-Pipeline einzubinden. SAST-Tools wie Snyk Code bieten dabei eine besonders gute Einbindung in DevSecOps und eine große Reichweite. Und die ist auch nötig, will man Sicherheitsrisiken von OSS-Containern, Bibliotheken und Software und andere Artefakte erkennen, die Sicherheitslücken aufweisen könnten.

Das lässt sich am Beispiel von MongoDB veranschaulichen:

„Vor Snyk war Open Source für uns eine langwierige Angelegenheit. Denn vor jedem Release mussten wir entweder eine Reihe manueller Kontrollen vornehmen oder mehrere Drittanbieter-Tools einsetzen.

Deshalb hat sich unsere Sicherheitsabteilung angesehen, welche SAST-Lösungen es auf dem Markt gibt. Letztlich entschieden wir uns für Synk Code. Besonders überzeugten uns dabei die automatische Korrektur, der entwicklerfreundliche Ansatz, die Benutzerfreundlichkeit, die zeitsparende Bereitstellung und die Möglichkeit einer unmittelbaren Einbindung in Entwicklertools und Workflows wie GitHub.“

Stuart Larsen, Security Engineer, MongoDB

Die lokale Codeprüfung ist allerdings nur die halbe Miete. Denn SAST muss auch in die CI/CD-Pipeline eingebunden werden. So lassen sich automatische Code-Reviews auf den gesamten App-Katalog anwenden und auf diese Weise zukunftsfähige, sichere Anwendungen gewährleisten.

Als Nächstes geht es dann an die Auswahl des passenden Tools. Doch die meisten SAST-Tools sind weder besonders treffsicher noch besonders schnell. Das schadet ihrer Zuverlässigkeit und führt zu übermäßig vielen falsch-positiven Ergebnissen. Damit sind sie ineffektiv und nicht schnell und beweglich genug. Außerdem können zu viele falsche Treffer dazu führen, dass Warnungen mit der Zeit ignoriert werden.

Ein verlässliches SAST-Tool sollte deshalb entwicklerfreundlich und schnell sein und möglichst wenige falsch positive Ergebnisse liefern.

Snyk Code lässt sich mit einer Rechtschreibprüfung vergleichen und ist ein Tool für die statische Codeanalyse, das Schwachstellen zwischen zehn- und fünfzigmal schneller findet als andere SAST-Tools. Dabei werden Leistungs- und Sicherheitsprobleme mittels semantischer Analyse identifiziert und falsch-positive Ergebnisse fast vollständig vermieden. Und das wiederum macht die Entwicklungsabteilung handlungsfähiger und effizienter.

Wer das richtige SAST-Tool in seine Pipeline einbindet, erhöht also die Sicherheit und schützt sich vor Schwachstellen und anderen Problemen, die es viel zu oft bis in die Produktionsumgebung schaffen.