Vergleichsanalyse Programmiersprachen für Cybersecurity im Automotive-Kontext

Von Dr. Frank van den Beuken 8 min Lesedauer

Anbieter zum Thema

Moderne Fahrzeuge sind komplexe, Software-gesteuerte Systeme. Mit der Komplexität steigt jedoch auch die Angriffsfläche durch schädliche Akteure. Den verwendeten Programmiersprachen kommt daher eine besondere Bedeutung zu.

Bei der Entwicklung von Software für den Automotive-Bereich wird eine große Zahl unterschiedlicher Programmiersprachen eingesetzt. Aber welche Sprache ist am besten geeignet, um den strengen Anforderungen an Cybersecurity zu entsprechen?(Bild:  frei lizenziert /  Pixabay)
Bei der Entwicklung von Software für den Automotive-Bereich wird eine große Zahl unterschiedlicher Programmiersprachen eingesetzt. Aber welche Sprache ist am besten geeignet, um den strengen Anforderungen an Cybersecurity zu entsprechen?
(Bild: frei lizenziert / Pixabay)

Cybersecurity ist in der Automotive-Branche ein zentraler Faktor geworden. Laut dem diesjährigen Branchen-Report von Perforce nannten 24 Prozent der befragten Fachkräfte für Automotive-Software die Tatsache als ihre größte Herausforderung, nicht über die benötigten Fähigkeiten zum Kampf gegen Security-Bedrohungen zu verfügen. 22 Prozent wiederum führen das Erfüllen von Security-Requirements als größte Herausforderung an.

Sicherheit durch Standards

Standards wie ISO/SAE 21434 sind entscheidend, um für ein bestmögliches Cybersicherheitsniveau in Fahrzeugen zu sorgen. Aber auch allgemeine Qualitätseigenschaften von Software, wie sie im Qualitätsmodell ISO 25010 definiert sind, sind relevant für die Entwicklung von Automotive-Software, selbst wenn diese nicht explizit gefordert werden.

Programmiersprachen spielen eine entscheidende Rolle, um diesen Standards gerecht zu werden. Denn sie beeinflussen alles: vom Grad der Modularität und Abstraktion bis hin zur Resilienz gegen Sicherheitslücken.

ISO/SAE 21434: Cybersecurity Engineering

Bei ISO/SAE 21434 handelt es sich um einen Automotive-Standard für das auf Cybersicherheit bezogene Risikomanagement in elektronischen Fahrzeugsystemen. Obwohl der Standard noch relativ neu ist, muss ihn bereits heute ein Großteil der Befragten (65 Prozent) einhalten.

Der Standard enthält detaillierte Anforderungen an die Softwareentwicklung. Dazu zählen unter anderem die Prüfung des Software-Codes auf inhärente Sicherheitsrisiken sowie Konsistenz, Korrektheit und Vollständigkeit. Daneben müssen bestimmte Kriterien bei der Auswahl der Programmiersprache beachtet werden wie sicheres Design und sichere Coding-Techniken oder eindeutige Syntax und Semantik.

ISO 25010: Modell für Softwarequalität

Bild 1: Hauptmerkmale von Softwarequalität nach ISO 25010.(Bild:  Perforce)
Bild 1: Hauptmerkmale von Softwarequalität nach ISO 25010.
(Bild: Perforce)

Daneben definiert ISO 25010 ein allgemeineres Modell für Softwarequalität anhand von acht Haupt- und 31 Nebenmerkmalen. Auch hier müssen die verwendeten Programmiersprachen folglich Eigenschaften aufweisen, mit deren Hilfe Entwickler Software schreiben können, die diese Kriterien erfüllt. Cybersicherheit ist eines davon. Für Unternehmen gilt es jedoch, zu ermitteln, wie gut die Eigenschaften der gewählten Programmiersprache dieses und auch alle anderen geforderten Qualitätsmerkmale erfüllen. Für Echtzeitanwendungen sind die funktionale Passgenauigkeit und Leistungseffizienz mindestens ebenso wichtig.

AUTOSAR-Plattformen

AUTOSAR (kurz für „Automotive Open System Architecture“) zielt darauf ab, grundlegende Softwareelemente, Schnittstellen und Bus-Systeme zu standardisieren und zukunftsfest zu machen. Dies soll Fahrzeugbauern dabei helfen, die wachsende Systemkomplexität zu beherrschen und gleichzeitig die Kosten niedrig zu halten.

Die „Classic Platform API” ist für Fahrzeugfunktionen mit strengen Echtzeit-Anforderungen und hoher Bedeutung für die funktionale Sicherheit gedacht. Spezifiziert wurde die Schnittstelle in der Programmiersprache C. Die neue „Adaptive Platform API” hingegen wurde unter Nutzung von C++ spezifiziert, unterstützt dabei jedoch ausdrücklich Bindings zu anderen Sprachen.

Insbesondere für beliebte Programmiersprachen wie Python, Java, C#, JavaScript, Go und Rust gilt es daher, deren Qualitätseigenschaften zu diskutieren.

Die gängigsten Sprachen im Überblick

Generell lassen sich die im Fahrzeugbau verwendeten Programmiersprachen in drei Kategorien unterteilen: Native, Plattform- und interpretierte Sprachen. Sie alle weisen jeweils spezifische Stärken und Schwächen auf, die sie für unterschiedliche Einsatzzwecke empfehlen.

Native Sprachen

Native Sprachen werden zu Objektcode kompiliert, der sich direkt auf der Zielmaschine ausführen lässt. Zu diesen Sprachen zählen – geordnet nach ihrem Veröffentlichungsdatum – C, C++, Rust und Go.

Native Sprachen auszuführen, weckt Bedenken hinsichtlich funktionaler und digitaler Sicherheit. Programmfehler können zu Abstürzen führen und Sicherheitslücken lassen sich zu schädlichen Zwecken ausnutzen. Für C und C++ unterhält ISO Sprachstandards, die problematisches Verhalten spezifizieren. C und C++ können verschiedenste Formen von undefiniertem Verhalten zeigen, zum Beispiel die Verwendung nicht-initialisierter Daten, Zugriffsversuche auf Null-Speicheradressen sowie Pufferüberläufe.

Jetzt Newsletter abonnieren

Verpassen Sie nicht unsere besten Inhalte

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung. Die Einwilligungserklärung bezieht sich u. a. auf die Zusendung von redaktionellen Newslettern per E-Mail und auf den Datenabgleich zu Marketingzwecken mit ausgewählten Werbepartnern (z. B. LinkedIn, Google, Meta).

Aufklappen für Details zu Ihrer Einwilligung

Glücklicherweise sind Probleme wie diese weitgehend bekannt und Coding-Standards wie MISRA C und MISRA C++ zielen darauf ab, das Risiko eines solchen undefinierten Verhaltens so weit wie möglich zu senken. Der Einsatz von Tools zur statischen Analyse kann zudem dabei unterstützen, Coding-Standards zuverlässig einzuhalten.

Native Sprachen sind inhärent leistungseffizient. C und C++ ermöglichen eine optimale Laufzeit- sowie Arbeitsspeicherleistung und bieten deshalb den höchsten Grad an Ausführungskontrolle. Damit einher geht jedoch das Risiko fehlerhafter Speicherzugriffe wie zum Beispiel Speicherverwendung nach Freigabe („user after free”). Coding-Standards stellen Leitlinien in diesem Bereich bereit. MISRA C beinhaltet eine verbindliche Regel, die es untersagt, dynamische Speicher zu verwenden. In C++ stellt „Scope Bound Resource Management” (SBRM) eine Möglichkeit dar, das Speichermanagement zu automatisieren.

Die Sprache Go wurde 2009 von Google vorgestellt. Vom Design hier liegt ihr Schwerpunkt auf paralleler Code-Ausführung. Wie C erlaubt sie ein manuelles Speichermanagement mit allen damit verbundenen Risiken. Für automatisches Speichermanagement nutzt sie einen Garbage Collector, der Nichtdeterminismus mit sich bringt, so dass sie für Echtzeit-Anwendungen nicht geeignet ist.

Rust wird im Buch „Rust Reference“ beschrieben, die Toolchain Ferrocene umfasst eine Spezifizierung der Sprache. Rust bietet eine neuartige dynamische Speicherlösung, die auf dem Eigentümerkonzept basiert. Sie enthält Regeln für die Eigentümerschaft von Speicher, die das Programm befolgen muss. Die Regeln dienen der Automatisierung des Speichermanagements, ähnlich dem SBRM in C++. Das erschwert zwar das Schreiben von korrektem Programmcode. Dieser erfordert dann jedoch keine Garbage Collection und eignet sich daher für Echtzeit-Anwendungen.

Das vor kurzem gegründete „Safety-Critical Rust Consortium” arbeitet an zusätzlichen Leitlinien für funktionale Sicherheit. Für MISRA C hat Perforce ein Unterkapitel mit Namen „Iron Carbide“ geschaffen, das sich auf Rust anwenden lässt.

Bezogen auf die Features der einzelnen Sprachen bestehen ebenfalls Unterschiede. C unterstützt lediglich prozedurales Programmieren, alle anderen Sprachen hingegen moderne Programmierparadigmen.

C-Compiler sind für fast jede Hardware erhältlich. Ähnliches gilt für C++-Compiler. Rust wird zu nativem Code kompiliert und nutzt zu diesem Zweck LLVM-Technologie, die eine große Bandbreite an Architekturen unterstützt. Go schließlich wird nur auf Desktop-Plattformen unterstützt.

Plattform-Sprachen

Eine Plattform bietet eine Abstraktion von der Maschine. Sie enthält einen Compiler, der Bytecode für seine virtuellen Maschinen erzeugt. Java und Kotlin laufen auf der Java-Plattform mithilfe der Java Virtual Machine (JVM). C# hingegen stellt die primäre Sprache für die .NET-Plattform mit der Common Language Runtime (CLR) von Microsoft dar.

Die Ausführung der Programme wird vollständig von der Spezifizierung der virtuellen Maschine definiert. Dennoch arbeiten sie mit einem Garbage Collector, was zu Nichtdeterminismus führen kann. Echtzeit-Java-Plattformen nutzen einen deterministischen präventiven Garbage Collector. Dennoch können Programme weiterhin Fehler enthalten und Sicherheitsprobleme verursachen. Entsprechend gibt es einen CERT-Coding-Standard für Java, während CWE Listen mit bekannten Schwächen und OWASP Cheat Sheets für beide Plattformen bereitstellen.

Kotlin ist Googles zentrale Programmiersprache für die Android-Plattform und hat in dieser Eigenschaft Java abgelöst. Android bietet ein „Native Development Kit” mit ausgereifter Unterstützung für C und C++. 2021 wurde zudem Rust als weitere Option hinzugefügt. Kotlin hat eine starke Ähnlichkeit zu Java, allerdings machen Schnittstellenänderungen häufigere Anpassungen am Code notwendig – mit negativen Auswirkungen auf die Wartbarkeit. Kotlin ist zur Verwendung in Web-Applikationen mit JavaScript interoperabel.

Java ist für die gängigen Desktop- und Serverplattformen erhältlich, während .NET nur wirklich gut auf Windows unterstützt wird.

Interpretierte Sprachen

Die beiden verbleibenden Sprachen Python und JavaScript sind interpretierte Sprachen. Interpreter lesen das Programm Zeile für Zeile und führen die Befehle aus. Die Folge davon ist, dass es sich hier um die am wenigsten deterministischen und am wenigsten geeigneten Sprachen für den Einsatz in Echtzeitsystemen handelt.

Python ist eine beliebte Scripting-Sprache, die langsam ausgeführt wird, aber einfach zu schreiben ist. Sie wird häufig als Bindeglied zwischen schnellen Komponenten genutzt, die in nativen Sprachen geschrieben sind. Für Python existieren keine Richtlinien bezüglich funktionaler oder digitaler Sicherheit.

JavaScript dient dazu, das Verhalten von Webseiten zu programmieren. In der Automobilbranche werden damit einige In-Vehicle-Infotainment-Systeme als Web-Applikationen implementiert. ECMA pflegt zwar den ECMAScript-Standard, doch davon existieren viele Varianten und Erweiterungen. Die Vielzahl an Sprachversionen, Frameworks und Umgebungen stellt eine Herausforderung dar. Denn ein vollständiges Verständnis der betriebenen Umgebung ist unabdingbar, damit sich die CWE- und OWASP-Richtlinien anwenden lassen.

Innovate Your Software – for a Smarter Future

Deutschlands Leitkongress der Embedded-Softwarebranche

Embedded Software Engineering Kongress

Das Programm des ESE Kongress umfasst 96 Vorträge, 21 Seminare und 3 Keynotes. Seien Sie dabei, wenn sich die Embedded-Software-Community trifft, und nutzen Sie Diskussionen und Expertengespräche für einen ergiebigen Wissenstransfer und erfolgreiches Networken. Während der vier Kongresstage erwartet Sie zudem eine große Fachausstellung mit den führenden Firmen der Branche. Erfahren Sie alles über die neuesten Trends, Herausforderungen und Lösungen im Embedded Software Engineering, von KI, Safety und Security bis hin zu Management und Innovation.

Vergleichende Analyse

Aus all diesen Beobachtungen ergeben sich die in Bild 2 und Bild 3 folgenden Eignungsmatrizen für ISO/SAE 21434 und ISO 25010.

Bild 2: Eignungsmatrize für Programmiersprachen nach ISO/SAE 21434.(Bild:  Perforce)
Bild 2: Eignungsmatrize für Programmiersprachen nach ISO/SAE 21434.
(Bild: Perforce)

Die Eignung der einzelnen Programmiersprachen hängt vom „Safety Integrity Level” des jeweiligen Projekts ab. Projekte, in denen die funktionale Sicherheit zentral ist, erfordern unter Umständen eine zertifizierte Toolchain, was die Optionen drastisch reduziert.

C bleibt eine gute Wahl für einfache Anwendungen in Umgebungen, die begrenzten Hardware- und strikten Echtzeitanforderungen unterliegen.

C++ eignet sich besser für komplexe Frameworks mit mehreren Schichten. Dazu zählt zum Beispiel die „AUTOSAR Adaptive Platform“, deren Programmierschnittstelle in C++ spezifiziert ist.

Bild 3: Eignungsmatrize für Programmiersprachen nach ISO/SAE 25010.(Bild:  Perforce)
Bild 3: Eignungsmatrize für Programmiersprachen nach ISO/SAE 25010.
(Bild: Perforce)

Java bietet sich als Sprache im Rahmen von Java-Frameworks wie Android an oder in Echtzeit-Umgebungen, in denen eine Echtzeit-JVM genutzt wird.

Kotlin eignet sich ebenfalls für die Verwendung in Android. Allerdings ist die Sprache weniger stabil als Java und ihre Echtzeit-Unterstützung ist eingeschränkter. Andererseits integriert sie sich besser in JavaScript für In-Vehicle-Infotainment-Anwendungen.

C# ist ideal für .NET, allerdings findet diese Plattform in Fahrzeugen keine Verwendung.

Python eignet sich nur für wenige Kontexte; insgesamt gibt es passendere Alternativen. JavaScript hingegen ist aus Web-User-Interfaces nicht wegzudenken, die in In-Vehicle-Infotainment-Systemen eingesetzt werden.

Schließlich bietet Rust bietet die stärksten Eigenschaften für funktionale Sicherheit und erhält immer mehr Zuspruch, zumal sich immer mehr Leitlinien dazu herausbilden und Toolchains zertifiziert werden.

Sprachwahl als strategische Entscheidung

In dem Maße, wie sich die Branche weiterentwickelt, müssen sich auch die genutzten Tools und Praktiken anpassen. Die Auswahl der Programmiersprache ist nicht nur eine Frage der Technik. Vielmehr handelt es sich um eine strategische Entscheidung, die unmittelbare Auswirkungen auf die funktionale und digitale Sicherheit sowie langfristige Wartbarkeit des Programm-Codes hat. Entsprechende Überlegungen gilt es daher, von Anfang an in die Sprachwahl miteinzubeziehen.  (sg)

* Dr. Frank van den Beuken ist Principal Technical Support Engineer bei Perforce Software

(ID:50625497)