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?

Anbieter 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 *** *** **

(ID:45190803)