Über 26 Milliarden Geräte sind heute schon mit dem Internet verbunden – und bis 2025 werden es fast dreimal so viele sein. Das belegen Hochrechnungen des Online-Statistikportals Statista. Im Zuge dieser Entwicklung wird das Thema Sicherheit wichtiger denn je – gerade im Unternehmensbereich. Doch dort ist man sich den Gefahren mit IoT nicht immer bewusst: «Gerade kleine IoT-Geräte sind nicht wirklich gut geschützt», erklärt Markus Burri, Senior Software Engineer von bbv. «Ein schlecht geschützter Wettersensor reicht Hackern schon aus, um sich Zugriff auf wichtigere Geräte oder aufs interne Firmennetzwerk zu verschaffen.»
Geräte sollten deshalb so gut wie nur möglich geschützt werden – ein sicherer Code ist dazu unerlässlich. Doch was genau bedeutet das? Mit diesen 10 Tipps lässt sich die Sicherheit von Programmiercode erhöhen:
1. Architektur
Das Thema Sicherheit beginnt bereits mit der Wahl und dem Aufbau der Softwarearchitektur. «Es bringt nichts, an ein Haus unzählige Schlösser anzubringen, wenn man das Fenster nicht schliessen kann», sagt Markus Burri. «Bei der Software-Entwicklung verhält es sich gleich.» Für eine sichere Architektur müssen Angriffsvektoren, Zonen und Perimeter definiert werden. Mehrere Zonen mit klar bestimmten Regeln und Abgrenzungen segmentieren den Zugriff auf die Architektur und erlauben es, verschiedene Sicherheitslevels zu implementieren und Berechtigungen zu vergeben.
2. Eingabewerte überprüfen
Parameter sollten immer überprüft werden – bei der Eingabe, bei Zonenübergängen (Perimeter) und vor allem auch vor dem Gebrauch. Dabei muss die Überprüfung für jede Stufe genau spezifiziert sein – ansonsten läuft man Gefahr, dass Hacker Daten bewusst per Buffer Overflow korrumpieren.
3. Einfacher Code
Da beim Programmieren von einer konstanten Fehlerrate ausgegangen werden kann, gilt: Je weniger Code, desto weniger Fehler. Das Thema Clean Code ist deshalb auch im Zusammenhang mit Code-Sicherheit elementar. «Oft stehen beim Programmieren aber die Features, und nicht das regelmässige Refactoring von Code im Vordergrund», hält Markus Burri fest. «Der Code wird dadurch immer komplizierter, die Fehlerrate steigt und ein nachträgliches Refactoring ist dann sehr schwierig und mit Risiken verbunden.»
4. Secure Coding
Dank Secure Coding können schon im Software-Entwicklungsprozess zahlreiche Probleme beseitigt werden. Grundlage für sicheren Code bilden dabei verschiedene Programmierstandards, die es einzuhalten oder zu berücksichtigen gilt. Dazu gehören etwa:
- Autosar: Richtlinien zur Nutzung von C++ in sicherheitskritischen Systemen
- MISRA: Richtlinien zur Qualitätssteigerung in der Software-Entwicklung, insbesondere für kritische Systeme
- SEI CERT C Coding Standards: C-Programmierstandard zur Verbesserung der Sicherheit und Zuverlässigkeit von Software-Systemen
- CWE – Common Weakness Enumeration: Auflistung gängiger Software-Schwachstellen
- OWASP Open Web Application Security Project: Entwicklungs- und Dokumentationsprojekte für die Entwicklung sicherer Web-Applikationen
5. Tools zur statischen Code-Analyse
Statische Code-Analysen, in denen der Quelltext einer Reihe formaler Prüfungen unterzogen wird, tragen ebenfalls zur Software-Sicherheit bei. Dazu stehen Entwicklern unterschiedliche Tools zur Verfügung. False-Positives sollten dabei vermieden werden, da die Softwarequalität darunter leiden würde: «Treten zu viele Falschmeldungen auf, gehen die richtigen darin unter – und werden angezweifelt, erklärt Markus Burri.» Zu den gängigsten Werkzeugen gehören etwa Clang-Tidy, CPPCheck oder SonarQube.
6. Warnungen beachten
Dass allen angezeigten Warnungen nachgegangen werden soll, klingt zwar logisch; trotzdem werden oft nicht alle Meldungen bearbeitet – so bleiben auch relevante Warnings unbeachet. Deshalb sollten stets alle Sicherheits- und Fehlermeldungen unter die Lupe genommen werden. Einige Tools für Legacy-Code bieten dazu auch die Möglichkeit, nur neu dazugekommene Meldungen anzuzeigen.
7. Moderne Tools und Programmiersprachen
Compiler und Analyser sollten immer auf dem neuesten Stand sein – genauso wie Programmiersprachen. Dort ermöglichen neue Standards, den Code zu vereinfachen. Das erhöht die Lesbarkeit, Wartbarkeit und Verständlichkeit von Code – und verringert gleichzeitig seine Fehleranfälligkeit. Neuere Tools decken auch mehr Schwachstellen auf.
8. Automatisierte Tests
Dank Testautomatisierung wird die Entwicklungsgeschwindigkeit in agilen Teams erhöht. Für Markus Burri sind automatisierte Tests unabdingbar: «Ohne Automatisierung werden Tests gar nicht oder nur sporadisch durchgeführt», hält er fest. «Manuell zu testen und nach Fehlerursachen zu suchen, würde viel zu lange dauern und sorgt für unnötige Verzögerungen.» Die manuellen Tests werden – wenn überhaupt – nur sporadisch ausgeführt, da es schwierig wird, die gefundenen Fehler einer Änderung zuzuordnen.
9. Code Review
Arbeiten Entwickler im Pair- oder Mob-Programming zusammen, können zwar weniger Features implementiert werden; die Fehlerrate verringert sich dafür aber deutlich – wodurch die Zeit, die für die Fehlersuche und -behebung erforderlich wäre, wieder eingespart wird. «Am Ende ist die Entwicklungszeit etwa gleich lang, die Fehlerrate beim Pair oder Mob Programming aber viel kleiner als beim alleinigen Entwickeln, was die Qualität markant erhöht», erklärt Markus Burri. Gleichzeitig findet durch die Zusammenarbeit ein Wissensaustausch statt, der gerade für agile Arbeitsmethoden zentral ist.
10. Continuous Integration / Continuous Delivery
Continuous Intergration und Continuous Delivery optimieren das Software-Deployment, indem neue Teilfunktionen und Features in kurzen Entwicklungszyklen bereitgestellt und bei Bedarf überarbeitet werden können. Dies kommt der Code-Sicherheit deutlich zu Gute: Der Migrationsaufwand ist geringer, und Iterationen bleiben überschaubar – wodurch die Fehlerquote sinkt.