Sichere C- und C++-Entwicklung in Automobilproduktion und Software-defined Vehicles (SDV)
23. Oktober 2024
0 Min. LesezeitMit softwaredefinierten Fahrzeugen bzw. Software-defined Vehicles (SDV) steuert die Automobilindustrie auf einen Wendepunkt in ihrer Geschichte zu. Umso deutlicher wurde dies voriges Jahr auf dem Weltkongress der Society of Automotive Engineers (SAE) in Detroit. Hier wurde herausgestellt, dass durch Forschung und Entwicklung sowie technologische Fortschritte in diesem Bereich ein Marktpotenzial von 500 Milliarden US-Dollar entsteht. Das softwaredefinierte Fahrzeug ebnet den Weg für völlig neue Einnahmequellen durch Abo-Modelle für Features und Services in einer Branche, die seit jeher vom klassischen Einmalkauf geprägt war.
Autobauer und ihre Zulieferer richten sich zunehmend auf die Entwicklung von Tech-Innovationen aus. Antriebsfeder bildet dabei die elektrisch-elektronische bzw. E/E-Architektur, in deren Mittelpunkt insbesondere Halbleiter stehen. Nicht weniger zentrale Elemente auf dem Weg zum softwaredefinierten Fahrzeug bilden Microservices, containerisierte Architektur und eine großumfängliche Nutzung der Cloud.
Aufgrund ihrer Verlässlichkeit, Effizienz und Vielseitigkeit entwickelt man im SDV-Bereich fast ausschließlich in C und C++. Mit Buffer Overflows oder speicherseitigen Anfälligkeiten stehen dem jedoch Sicherheitsrisiken gegenüber, die bereits seit Jahrzehnten existieren. Unsere Mission für sichere Software-Entwicklung ist für den SDV-Markt daher umso relevanter. Von Bedeutung sind dabei auch unsere Lösungen für Infrastructure as Code (IaC) und Container, ebenso wie die nativen Integrationen von Snyk mit verschiedenen Cloud-Anbietern.
Eine führende Rolle in Sachen SDV-Innovation nimmt beispielsweise Mercedes-Benz mit seinem MB Operating System ein.
Mit dem Qualcomm Gen4 8295, dessen Consumer-Launch gerade einmal ein halbes Jahr zurücklag, haben wir schnell die beste am Markt verfügbare Hardware integriert. Ambitioniert war dieses Projekt durchaus, daher bin ich umso stolzer darauf, dass das Team diese Herausforderung angenommen hat. Mehr als 20 GB an kompiliertem Code hat es dazu geschrieben. Dadurch konnten wir diesen Vorläufer von MB.OS nicht nur in die E-Klasse bringen. Wir haben auch ungemein wertvolle Erkenntnisse für die Einführung von MB.OS 1.0 gewonnen.
MISRA-Compliance für C und C++
MISRA C:2023 ist ein Regelwerk, das in erster Linie auf die Sicherheit und Verlässlichkeit kritischer Systeme abzielt. Abgedeckt werden hierbei auch für die Anwendungssicherheit relevante Aspekte, insbesondere im Hinblick auf Punkte, an denen Schwachstellen zu Sicherheitsrisiken führen können. Generell umfasst MISRA C:2023 ein breites Spektrum an Themen. Einige Regeln und Anweisungen sind für die Stärkung der Anwendungssicherheit jedoch besonders relevant, da sie Coding-Methodiken zur Prävention von undefiniertem Verhalten, Memory Corruption, nicht autorisiertem Zugriff und anderen häufig auftretenden Schwachstellen stützen.
MISRA C++:2023, das Pendant zum Regelwerk für C, legt in ähnlicher Struktur verschiedene Regeln und Anweisungen zur Absicherung von Anwendungen zugrunde, einschließlich Beispielen für konformen und nicht konformen Code.
Einige der MISRA Compliance-Richtlinien für die Entwicklung in C und C++ beinhalten Anweisungen und Regeln zur Gewährleistung sicherer Anwendungen wie die Folgenden:
MISRA-Anweisung 4.12 – Keine dynamische Speicherzuweisung: Die Vorgabe, Speicher nicht dynamisch zuzuweisen, kann verschiedenen Schwachstellen rund um Fehler bei der Speicherverwaltung vorbeugen.
MISRA-Regel 1.3 – Kein undefiniertes oder kritisches nicht spezifiziertes Verhalten: Undefiniertes Verhalten kann Schwachstellen nach sich ziehen. Zur Gewährleistung der Sicherheit ist diese Regel daher unbedingt zu beachten.
SRA-Regel 18.1 – Ein aus der Arithmetik eines Pointer-Operanden resultierender Pointer muss ein Element desselben Arrays adressieren wie selbiger Pointer-Operand: Mit dieser Regel soll Out-of-Bounds-Zugriff vorgebeugt werden, eine häufig in C-Programmen auftretende Schwachstelle.
MISRA-Regel 21.3 – Keine Funktionen zur Speicherallokation und -deallokation von<stdlib.h>: Ähnlich wie bei Anweisung 4.12 zielt diese Regel darauf ab, Schwachstellen im Speichermanagement vorzubeugen, indem Speicher nicht dynamisch zugewiesen wird.
MISRA-Regel 22.1 bis 22.20 (Ressourcen): Adäquate Ressourcenverwaltung etwa hinsichtlich der Behandlung von Fehlern und Freigabe von Ressourcen ist unerlässlich für die Prävention von Lecks und Erschöpfung. Diese können sich Denial-of-Service-Angriffe zunutze machen oder in undefiniertem Verhalten resultieren, das ebenfalls für Exploits anfällig ist.
Die in der MISRA C-Spezifikation beschriebenen Richtlinien werden zwar nicht ausdrücklich als Sicherheitsmaßnahmen bezeichnet. Ihre umfangreichen Anweisungen und Regeln erhöhen jedoch die Software-Sicherheit, da mit ihnen viele häufige Quellen für Schwachstellen in C- und C++-Code beseitigt werden. Die Richtlinien gewährleisten verlässliches, klar definiertes Verhalten und tragen so zur Entwicklung sicherer, stabiler und geschützter Systeme bei.
Snyk als Enabler für die Umsetzung
Snyk steht für Security Empowerment von Entwicklern aller Art. So auch für all jene, die C und C++ bei Coding nutzen. Hierzu machen wir es möglich, Code-Security im DevSecOps-Stil in das SDLC zu integrieren. So verhelfen wir Entwicklern dazu, Schwachstellen zu identifizieren, bevor sie zu kritischen Problemen auswachsen. Und dies am frühestmöglichen Punkt: Mit Snyk erkennen Entwickler unsichere Code-Muster bereits in der IDE. Ihr Code muss also nicht erst die Continuous-Integration- und Build-Pipelines durchlaufen oder kompiliert werden.
Mit Tools wie Snyk Code können Sie Ihre auf C- und C++ basierenden Codebases auf Schwachstellen ausleuchten und erhalten konkret umsetzbare Insights für ihre Behebung.
Sehen wir uns dies am Beispiel eines Buffer Overflow an, einer häufigen Schwachstelle in C++. Nachfolgend ein einfaches Code-Snippet, das dieses Problem veranschaulicht:
#include <iostream>
#include <cstring>
void vulnerableFunction(char* input) {
char buffer[10];
// ❌ Potential buffer overflow
strcpy(buffer, input);
}
int main() {
char input[20] = "This is a long string";
vulnerableFunction(input);
return 0;
}
In diesem C++-Programm kann aus der Funktion strcpy
ein Buffer Overflow resultieren, wenn der Input-String die Buffer-Größe übersteigt. Snyk hilft dabei, Anfälligkeiten wie diese aufzudecken, und gibt Empfehlungen für sichere Alternativen wie z. B. die Funktion strncpy
:
void secureFunction(char* input) {
char buffer[10];
strncpy(buffer, input, sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0'; // Ensure null-termination
}
Seine wahre Power spielt Snyk jedoch an zwei anderen Punkten aus:
Snyk erkennt anfälligen Code wie diesen Buffer Overflow ganz ohne den Zwischenschritt einer Kompilierung.
Snyk gibt Ihnen einen Vorschlag zur Behebung mit Snyk Agent Fix.
Wie sich dies in Aktion darstellt, zeigen wir im nachfolgenden Video.

Mit Methoden zur sicheren Programmierung im Verbund mit Tools wie Snyk können Entwickler die Risiken für Schwachstellen in ihren C- und C++-Codebases erheblich reduzieren. Am besten registrieren Sie sich direkt hier für ein Snyk Konto, um in Aktion zu erleben, wie Sie damit Ihre erfolgskritischen Software-Projekte effektiv absichern.
Sicherer, konformer Code und unsicherer, anfälliger Code in C und C++ im Vergleich
Um nachzuvollziehen, wie sich die MISRA-Richtlinien und -Spezifikationen in die Coding-Praxis und Schwachstellenprävention einfügen, hilft ein Blick auf das nachfolgende C-Programm namens program2.c
. Darin enthalten ist ein Beispiel für unerwünschtes Verhalten gemäß MISRA-Regel 1.3 aus der oben aufgeführten Liste.
Der Programmcode lautet wie folgt:
#include <stdio.h>
void undefinedBehavior() {
int x = 5 / 0;
printf("Value of x: %d\n", x);
}
int main() {
undefinedBehavior();
return 0;
}
Division durch Null ist ein undefiniertes Verhalten in C, das in nicht vorhersagbare Folgen resultieren kann. Gemäß MISRA-Richtlinien sind derartige Operationen richtigerweise untersagt, um unsicherem Code in kritischer Software vorzubeugen.
Starten wir nun das Programm, indem wir den Code kompilieren und ausführen:
$ gcc program2.c -o program2
$ ./program2
Wie zu sehen ist, gibt der GCC-Compiler eine Warnmeldung aufgrund der Division durch Null aus:
program2.c:5:15: warning: division by zero is undefined [-Wdivision-by-zero]
int x = 5 / 0;
^ ~
1 warning generated.
Hierbei gilt zu bedenken, dass der Code in diesem Programm einfach gehalten und wenig umfangreich ist. In der Programmierpraxis mit zumeist deutlich größeren Codebases ist es jedoch deutlich schwieriger, derartige Probleme unter den diversen Compiler-Warnungen auszumachen, die an die Standard-Ausgabe angehängt sind.
Aufspüren der Schwachstelle mit Snyk Code
Wie bereits erwähnt, lassen sich Compiler-Warnungen zu undefiniertem Verhalten wie der _Division durch Null_ und anderen Problemen nur schwer und erst spät im Dev-Cycle erkennen. Mit Snyk Code können Sie Ihre Codebase jedoch auf Schwachstellen scannen, noch bevor Sie den Code kompilieren.
Möglich wird dies dadurch, dass die Snyk Engine für Static Application Security Testing maschinelles Lernen zum Einsatz bringt, um den Ablauf von Programmausführungen nachzuvollziehen. So ist sie in der Lage, Sink-Source-Flows im Code-Pfad in Zusammenhang zu setzen und unsicheren Code sowie potenzielle Schwachstellen in Codebases auch ohne Kompilierung zu erkennen.

Tools zur Absicherung von C- und C++-Code und zur Gewährleistung von MISRA-Compliance
Die Open-Source-Community bietet verschiedene Tools für Compliance-Checks von C- und C++-Code gemäß den MISRA-Richtlinien. Dazu gehören:
OpenMRC: Mit OpenMRC steht ein Code-Checker für MISRA-C-Regeln zur Verfügung, der als Plug-in in die Eclipse CDT-Umgebung zur C/C++-Entwicklung eingebunden wird. Das Tool analysiert Code für softwaredefinierte Fahrzeuge unter Berücksichtigung der MISRA-C:2004-Richtlinien und gibt bei Verstößen Warnmeldungen aus, die Entwicklern dabei helfen, ihren Quellcode im Sinne der Security-Vorgaben zu korrigieren..
Clang-misracpp2008: Bei diesem Projekt handelt es sich um einen Open-Source-Checker, der Code innerhalb der LLVM/Clang-Infrastruktur auf Einhaltung der MISRA C++:2008-Regeln scannt. Das Projekt wurde inzwischen archiviert und ist nicht mehr aktiv. Seine Entwickler legen jedoch nahe, als Alternative auf
clang-tidy-misra
zurückzugreifen.clang-misracpp2008
wurde als Plug-in für LLVM/Clang umgesetzt, das anhand von Custom-Logik und vom Compiler generierten Flags bei der Erfüllung der MISRA C++-Regeln helfen soll.
Zu eruieren ist bei diesen Tools natürlich, ob sie Ihren Standards entsprechend und ihre Security-Tests umfassenden Qualitätsvorgaben standhalten können. Snyk ist daher womöglich eine bessere Option für sie.
Mit Snyk Code bietet unsere Plattform Echtzeit-SAST mit Developer-Fokus. Dies bedeutet, dass Ihre Entwickler die Sicherheit ihres Codes in einer UX optimieren können, die exakt auf ihre Workflows zugeschnitten ist. Denn Snyk ergänzt seine Scan-Ergebnisse auch um Lernressourcen und bietet Empfehlungen zur Behebung in Form konkreter Fixing-Beispiele. Hinzu kommt mit Snyk Agent Fix ein Feature, mit dem sich einige Schwachstellen auf Anhieb automatisch beheben lassen.
Zudem ist Snyk zum Einstieg kostenlos nutzbar und stellt verschiedene Methoden zum Scannen von C/C++-Code zur Auswahl. Dazu gehört die Snyk Erweiterung zur Installation in der IDE, der Import von Git-Repositories aus Bitbucket oder GitHub sowie die Snyk CLI.
Zu bedenken gilt außerdem, dass C- und C++-Programme über den von Entwicklern selbst geschriebenen Code hinaus auch Open-Source-Bibliotheken mit potenziellen Schwachstellen beinhalten können. Mit Snyk lassen sich auch diese Elemente der Codebase effektiv adressieren.
Unbedingt zu empfehlen sind zudem unsere Onlinekurse im Rahmen von Snyk Learn, in denen wir detailliertes Know-how zur Prävention von Schwachstellen in C auf leicht verständliche und interaktive Weise vermitteln. Behandelt werden darin diverse Schwachstellen in C und C++ wie Nullwert-Dereferenzierungen oder etwa auch Qualitätsmängel im Coding-Stil wie Double-Free-Fehler.
Starke Code-Sicherheit mit wegweisender Security Intelligence
Machen Sie die Probe aufs Exempel und erleben Sie das gesamte Potenzial von SAST-Scans mit Snyk Code.