CERT vs. MISRA vs. ISO/IEC 17961 Der richtige Coding-Standard für sichere Embedded Software

Autor / Redakteur: Richard Bellairs * / Sebastian Gerstl

Bei Softwareentwicklung sollte Security von Anfang an fester Bestandteil sein. Etablierte Coding-Standards können diesen Prozess vereinfachen. Aber welcher Standard ist für welche Ansprüche der Beste?

Firmen zum Thema

Coding-Standards können hinsichtlich Security by Design dem Entwickler eine Menge Arbeit einsparen. Doch was sind die Vorzüge und Nachteile der drei gängigsten Standards, und wie kann sich ein Entwickler für den entscheiden, der seinen Ansprüchen am nähsten kommt?
Coding-Standards können hinsichtlich Security by Design dem Entwickler eine Menge Arbeit einsparen. Doch was sind die Vorzüge und Nachteile der drei gängigsten Standards, und wie kann sich ein Entwickler für den entscheiden, der seinen Ansprüchen am nähsten kommt?
(Bild: Logomontage/VCG)

Die Sicherheit bei Software ist ein brisantes Thema. Und eines, um das man sich angesichts eines zunehmenden Vernetzungsgrades und immer schnelleren Entwicklungszyklen wirklich kümmern muss. Wenn es um eingebettete Systeme geht, ist C immer noch die dominante Programmiersprache, C++ gewinnt immer mehr an Popularität. Doch egal auf welche Sprache ein Entwickler setzt: Sicherheit solle von Anbeginn an im Code implementiert sein. Denn Sicherheit nachzurüsten stellt nicht nur deutlich mehr Arbeit dar - der bereits angerichtete Schaden durch Sicherheitsmängel lässt sich im Nachgang nicht mehr verhindern.

Über Grundlagen der Sicherheit bei Embedded-Software sind wir an anderer Stelle bereits eingegangen. Doch wie kann ein Entwickler Sicherheit von Beginn an schnell und einfach in seinen Code integrieren? Wer einen Coding-Standard einsetzt, kann auf bereits bewährte Methoden für einen hohen Grad an Sicherheit setzen. Und Tools zur automatisierten Codeanalyse können ihm zusätzlich helfen, Zeitaufwand und Kostenrahmen gering zu halten. Dieser Artikel vergleicht aktuelle Coding-Standards und gibt Hilfestellungen, um Code mit C und C++ zu erstellen, der einen höheren Sicherheitsgrad besitzt – wenn man sich an die erwähnten Coding-Standards hält.

Vorneweg muss aber eines nochmal betont werden: Sichere Software gibt es nicht auf Knopfdruck! Wer die Sicherheit seiner Software optimieren will, muss dies – in einer gemeinsamen Anstrengung – auf mehreren Ebenen tun. Und er sollte sich an die von der Industrie vorgegebenen Best-Practice-Richtlinien halten.

Coding-Standards für optimalen Schutz der Anwendungen

Beim Schutz von Daten und den Verbindungen zwischen Geräten gibt es, wie sich gezeigt hat, in den allermeisten Fällen noch immer gravierende Sicherheitslücken. Zwei aktuelle Beispiele: fehlerhafte Software Updates haben dazu geführt, dass die Baby-Überwachungskameras von TrendNet und die Thermostate von Nest gehackt werden konnten. Die Lücken bei Sicherheit und Datenschutz stellen nicht nur ein Risiko für die Nutzer dar. In ihnen steckt auch das Potenzial, dem Ruf einer Firma erheblichen Schaden zuzufügen. Deshalb ist Sicherheit oberstes Gebot im Geschäftsleben.

Wie wichtig gesicherte Software ist, hat also in den vergangenen Jahren an Bedeutung gewonnen. So haben sich denn auch neue Coding-Standards, die auf die Sicherheit nach außen ausgerichtet sind, neben den bereits ausgereiften sicherheitskritischen Standards entwickelt. Auch wenn die zugrundeliegenden Ziele unterschiedlich sind, kommt es häufig zu Überschneidungen ihrer Empfehlungen.

Die meisten der hier genannten Coding-Standards verwenden Regeln, um Aspekte einer Programmiersprache, die vom jeweiligen Normierungsgremium als ungeeignet angesehen werden, zu verhindern. Darüber hinaus zeigen sie auch Wege, wie der Entwicklungsprozess und die Effizienz der Sprache verbessert werden können. Bisweilen definieren sie auch eine neue Sprache, die hilft, Software sicherer, vorhersagbarer, stabiler und besser wartbar zu machen.

Die wichtigsten Security-relevanten Coding-Standards sind heute der CERT C Secure Coding Standard, MISRA C:2012 und die C Secure Coding Rules (ISO/IEC TS 17961:2013).

Drei Coding-Standards im Vergleich

Um die hier besprochenen Coding-Standards vergleichen zu können, haben wir neun Bewertungskategorien aufgestellt. Einige davon sind in der Lage, die Leistung eines Standards auch qualitativ zu bewerten. Der Leistungsindikator (1 bis 3 Sterne) leitet sich ab von den Einschätzungen und Eindrücken, die PRQA bei seinen Kunden gesammelt hat. Diese können als offizielle Bestätigung jedes Standards angesehen werden. Wir kategorisieren die Standards anhand von neun Punkten:

Industrie: Der ursprüngliche Industriesektor, für den der Coding-Standard geschaffen wurde

Referenzsprachversion: Die Version des C-Standards, der aktuell als Referenz für die Kodierungsrichtlinien benutzt wird. Das ist wichtig, denn es beeinflusst die Wahl der Coding-Standards für ein Projekt. Ein Beispiel: sollte C11 eingesetzt werden (weil es für eine bestimmte Applikation einfach die beste Wahl ist), dann ist MISRA C:2012 nicht der geeignete Kandidat, außer es gibt spezielle Compliance-Anforderungen, die den Einsatz notwendig machen.

Automatische Durchsetzbarkeit: Die Einfachheit der Erstellung von automatischen Regelüberprüfungen/Überprüfungen der Richtlinien, die nicht zu „false positive“ führen. Das hängt normalerweise davon ab, wie streng oder vage spezielle Richtlinien definiert sind.

Abdeckung: Eine qualitative Aussage über den Umfang des Coding-Standards und die Anzahl der definierten Richtlinien. Je breiter der Umfang, desto höher der erzieherische Nutzen des Coding-Standards. Hinsichtlich der Wartung der Richtlinien sowie der Toolabdeckung kann ein großer Umfang jedoch auch eine gewisse Komplexität mit sich bringen.

Marktannahme: Das Einsatzverhalten in realen Projekten, hinsichtlich formaler Compliance-Anforderungen (z. B. in Anwendungen für funktionale Sicherheit) und „freiwilligem“ Einsatz zur generellen Verbesserung der gesamten Softwarequalität.

Verfügbarkeit des Werkzeugs: Die Marktverfügbarkeit eines automatisierten Codeanalysetools zur Durchsetzung des Coding-Standards (dies ist in der Regel mit dem Stand der Marktannahme verknüpft).

Evolution: Ein sich schnell entwickelnder Standard passt sich schneller an die Rückmeldungen der Entwickler an und führt zu einer schnelleren Einbindung neuer Features. Das ist in der Regel gut für die Endverbraucherprodukte, aber schlecht für andere Bereiche. CERT C nutzt zwei Methoden, seine Richtlinien zu veröffentlichen: über ein webbasiertes Wiki und über ein frei verfügbares PDF. Das Wiki ist naturgemäß schneller als das PDF.

Ressourcen: Das kann sich auf den Standard der Programmiersprache C beziehen, auf andere Standards, Unterlagen, Artikel oder auf andere hilfreiche gemeinsame Wissensdatenbanken.

Beispiele: Sie veranschaulichen Probleme im Zusammenhang mit der Verletzung einer speziellen Richtlinie und/oder einer konformen Lösung.

Hier eine Vergleichstabelle für die drei vorgestellten Coding-Standards und wie sie in den oben genannten Kategorien abschneiden:

CERT C MISRA C:2012 ISO/IEC 17961:2013(E)
Industrie Generic-agnostic Embedded
safety-critical
applications
Generic-agnostic
Referenzsprachversion C11 C90, C99 C11
Automatische Durchsetzbarkeit ** ** ***
Abdeckung *** ** *
Marktannahme ** *** **
Verfügbarkeit des
Werkzeugs
** *** **
Evolution Wiki - schnell
Book - langsam
langsam langsam
Ressourcen *** ** *
Beispiele *** *** **

Den geeigneten Coding-Standard für die richtige Anwendung wählen

Flowchart: Wann empfiehlt sich der Einsatz welches Coding-Standards? Weiß unterlegte Standards sind im jeweiligen Fall stark empfohlen. Grau unterlegte sind tauglich, aber im direkten Vergleich weniger stark.
Flowchart: Wann empfiehlt sich der Einsatz welches Coding-Standards? Weiß unterlegte Standards sind im jeweiligen Fall stark empfohlen. Grau unterlegte sind tauglich, aber im direkten Vergleich weniger stark.
(Bild: PRQA)

Den einen besten Standard für das Kodieren geschützter Software gibt es nicht. Die richtige Auswahl muss verschiedene Aspekte berücksichtigen – wie lange dauert das Projekt (hier ist die Stabilität der Referenz von großer Bedeutung), welche Sprachversion wird eingesetzt? Und: gibt es bestehenden Code?

Erst informieren, dann auswählen. Das Flussdiagramm links kann die Auswahl optimieren.

Szenario 1: Wenn die Anforderungen eine Compliance mit einem anerkannten Coding-Standard vorschreiben (ein übliches Szenario bei sicherheitskritischen Anwendungen), dann ist MISRA C die erste Wahl. Die neueste Version dieses Standards ist MISRA C:2012 mit der Ergänzung 1. Wird eine Vorgängerversion von MISRA verlangt (zum Beispiel MISRA C:2004), dann profitiert das Projekt, wenn man zusätzlich die Sicherheitsregeln von ISO/IEC 17961:2013 einbindet (es erfordert einen gewissen Aufwand, die C-Version anzupassen und die Überschneidungen zu entfernen. Mit dem Addendum 2 von MISRA C:2012 “Coverage of MISRA C:2012 against ISO/IEC 17961:2012 C Secure” ist man auf einem guten Weg.)

Szenario 2: Sofern für die Anwendung keine Compliance-Anforderungen bestehen und es keinen Bedarf an Hochleistungen auf Kosten der Code-Portabilität gibt, empfiehlt sich weiterhin, den Blick auf höchste Integrität zu richten. Auch in diesem Fall wäre MISRA C:2012 die beste Wahl.

Szenario 3: In Szenario 1, wie auch in Szenario 2 könnte CERT C im Hinblick auf die Security wertvolle Unterstützung bieten. Die Empfehlung lautet, CERT C parallel in die vorgeschlagenen Standards einzubinden (im Flussdiagramm ist das durch eine gestrichelte Linie angedeutet). Wenn MISRA C:2012 jedoch als zu restriktiv angesehen wird – zum Beispiel bei einem Ansatz mit hoher Integrität – wäre die Empfehlung, nur CERT C einzusetzen. Damit schafft man Code Security auf einem guten Niveau.

Schlussfolgerungen

Für welchen Coding-Standard man sich entscheidet, um sicheren Code zu erzeugen, hängt von vielerlei Faktoren ab. Dazu muss man die Eigenschaften und Vorteile jedes Standards kennen. Und vor allem wissen, wie sie die Anforderungen des aktuellen Entwicklungsprojekts erfüllen können.

Das hier gezeigte Verfahren zielt darauf, automatisiertes Testen mit Werkzeugen wie den automatisierten Analysetools QA-C und QA-C++ von PRQA durchzuführen. Solche Tools führen eine Tiefenanalyse von Softwarecode durch, um Fehler zu entdecken und zu eliminieren. Oder am besten: gar nicht erst entstehen zu lassen. Sie erzwingen automatisch das Einhalten von Kodierungsregeln für standardkonforme Software.

Gefahr für die Industrie: Schon vor Meltdown und Spectre waren industrielle Steuerungsanlagen  und Embedded-Systeme durch Cyberattacken bedroht.

Warum Security by Design im IoT noch nicht angekommen ist

Da Safety und Security zum Teil unterschiedliche Regelsätze und Protokolle verwenden, zogen es Softwareentwickler in der Vergangenheit vor, eines der beiden über das andere zu priorisieren – meist zu Lasten der Security. Doch das ist nicht zwingend nötig.

Lösbarer Konflikt – Safety und Security in der Softwareentwicklung

Die Sicherheit eingebetteter Systeme ist unerbittlichen Attacken ausgesetzt. Darunter sind auch SCADA-Systeme (Supervisory Contron and Data Acquisition), die Industrieanlagen, Verkehrsnetze oder Kraftwerke überwachen und steuern.

Software-Design

Grundlagen der Sicherheit bei Embedded-Software

* Richard Bellairs ist Product Marketing Manager bei PRQA.

(ID:45190803)