•  
  •  
  •  
  •  
  •  
IoT-Security

10 Tipps für sicheren Code

Mit IoT gewinnt das Thema Sicherheit zusätzlich an Bedeutung. Security beginnt schon im Kleinen, im Programmiercode. Diese 10 Tipps tragen zu sicherem Programmiercode bei.

02.07.2019Text: bbv0 Kommentare
10 Tipps zum sicheren Code
  •  
  •  
  •  
  •  

Ü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.

Der Experte

Markus Burri

Markus Burri ist Senior Software-Ingenieur Embedded bei bbv. Das Thema «Sicherheit» steht bei ihm im Fokus – besonders in Bezug auf die Applikationsentwickung in C++ für Embedded-Systeme und bei Netzwerken. Markus Burri leitet zudem die Security Community von bbv.

Unser Wissen im Abo

Kommunikation in schwierigen Situationen

Die Grenzen der effektiven Kommunikation

Softwareentwicklung
Softwareentwicklung budgetieren

Tipps für realistische Kostenschätzungen

Softwareentwicklung
User Stories in agilen Frameworks

Die 5 häufigsten Fehler beim Schreiben von User Stories

Softwareentwicklung

Artikel kommentieren

Die E-Mail-Adresse wird nicht publiziert. Notwendige Felder sind mit einem * versehen.