Blog

Eingebettete Geräte und Entwicklung eingebetteter Systeme - ein Überblick

Secure Code Warrior
Veröffentlicht Aug 11, 2021

Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten. 

Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.

Was ist ein eingebettetes Gerät und System?

Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein. 

Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten. 

Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.

Beispiele für eingebettete Geräte

Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:

  • Ein Thermostat in einem Klimagerät. 
  • Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
  • Digitale Klimakontrollsysteme.
  • Navigationssysteme in Flugzeugen.
  • Digitale Uhren.
  • GPS-Geräte.
  • Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
  • Blutdruck- und Herzschlagmessgeräte.
  • Vernetzungskomponente in einem MRT-Gerät, die Daten an die Cloud sendet.

Ist ein Laptop ein eingebettetes Gerät?

Kurze Antwort: Nein. Lange Antwort:

Per Definition umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.

Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.

Eingebettete Geräte im Internet der Dinge

Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.

Lebenszyklus der Entwicklung eingebetteter Software

Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:

Schritt 1: Zweck und Anforderungen

Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:

  • Welche Funktionen wird das Gerät erfüllen?
  • Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
  • Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
  • Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
  • Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?

Schritt 2: Systemarchitektur

Sobald wir die einzigartigen Systemanforderungen ermittelt haben, können wir die Systemarchitektur entwerfen. Beantworten Sie Fragen wie:

  • Welche Hardwarekomponenten werden für die Entwicklung des Geräts benötigt? Dazu gehört die Identifizierung der Schaltkreise, Prozessorchips und Mikrocontroller sowie aller erforderlichen internen und externen Peripheriegeräte. 
  • Wie viel Strom werden die Komponenten benötigen? 
  • Wird das Gerät mit dem Internet verbunden sein?
  • Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
  • Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
  • Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?

Schritt 3: Auswahl des Betriebssystems

Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen. 

Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten. 

Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?

Schritt 4: Die Entwicklungswerkzeuge

Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen. 

Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.

Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren

Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.

Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.

Schritt 6: Wartung und Unterstützung

Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.

Die wichtigsten eingebetteten Programmiersprachen

Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.

Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.

Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?

Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist. 

Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.

Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.

Insgesamt sollten Sie C wählen, wenn:

  • Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
  • Sie wollen die bestmögliche Leistung.
  • Ihre Entwickler sind in C/C++ bewandert.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Verwenden Sie Python, wenn:

  • Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
  • Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
  • Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
  • Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
  • Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.

Verwenden Sie Java, wenn:

  • Sie erstellen Webanwendungen.
  • Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?

Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung. 

Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.

Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.

Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.

Warum sichere Kodierung in C/C++ wichtig ist

Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen. 

Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.

Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:

  • Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
  • Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
  • Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
  • Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.

Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.

Erfahren Sie, wie wir die Automobil- und Transportbranche unterstützen. Oder probieren Sie noch heute eine Embed-Focus-Coding-Challenge aus, um zu erfahren, wie wir Entwickler in die Lage versetzen, sichere Embedded-Anwendungen zu schreiben!

Ressource anzeigen
Ressource anzeigen

In diesem Beitrag erhalten Sie einen Überblick über eingebettete Geräte und die Entwicklung eingebetteter Systeme.

Interessiert an mehr?

Secure Code Warrior macht sicheres Programmieren zu einer positiven und fesselnden Erfahrung für Entwickler, die ihre Fähigkeiten ausbauen. Wir leiten jeden Programmierer auf seinem bevorzugten Lernpfad an, damit sicherheitskompetente Entwickler zu den täglichen Superhelden unserer vernetzten Welt werden.

Secure Code Warrior ist für Ihr Unternehmen da, um Sie dabei zu unterstützen, Ihren Code über den gesamten Lebenszyklus der Softwareentwicklung hinweg zu sichern und eine Kultur zu schaffen, in der Cybersicherheit an erster Stelle steht. Ganz gleich, ob Sie AppSec-Manager, Entwickler, CISO oder ein anderer Sicherheitsverantwortlicher sind, wir können Ihrem Unternehmen helfen, die mit unsicherem Code verbundenen Risiken zu reduzieren.

Demo buchen
Weitergeben:
Autor
Secure Code Warrior
Veröffentlicht Aug 11, 2021

Secure Code Warrior macht sicheres Programmieren zu einer positiven und fesselnden Erfahrung für Entwickler, die ihre Fähigkeiten ausbauen. Wir leiten jeden Programmierer auf seinem bevorzugten Lernpfad an, damit sicherheitskompetente Entwickler zu den täglichen Superhelden unserer vernetzten Welt werden.

Secure Code Warrior baut eine Kultur von sicherheitsorientierten Entwicklern auf, indem es ihnen die Fähigkeiten vermittelt, sicher zu programmieren. Unser Flaggschiff Agile Learning Platform bietet relevante fähigkeitsbasierte Pfade, praktische Übungen missions und kontextbezogene Tools, mit denen Entwickler ihre Fähigkeiten zum Schreiben von sicherem Code schnell erlernen, aufbauen und anwenden können.

Weitergeben:

Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten. 

Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.

Was ist ein eingebettetes Gerät und System?

Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein. 

Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten. 

Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.

Beispiele für eingebettete Geräte

Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:

  • Ein Thermostat in einem Klimagerät. 
  • Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
  • Digitale Klimakontrollsysteme.
  • Navigationssysteme in Flugzeugen.
  • Digitale Uhren.
  • GPS-Geräte.
  • Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
  • Blutdruck- und Herzschlagmessgeräte.
  • Vernetzungskomponente in einem MRT-Gerät, die Daten an die Cloud sendet.

Ist ein Laptop ein eingebettetes Gerät?

Kurze Antwort: Nein. Lange Antwort:

Per Definition umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.

Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.

Eingebettete Geräte im Internet der Dinge

Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.

Lebenszyklus der Entwicklung eingebetteter Software

Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:

Schritt 1: Zweck und Anforderungen

Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:

  • Welche Funktionen wird das Gerät erfüllen?
  • Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
  • Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
  • Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
  • Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?

Schritt 2: Systemarchitektur

Sobald wir die einzigartigen Systemanforderungen ermittelt haben, können wir die Systemarchitektur entwerfen. Beantworten Sie Fragen wie:

  • Welche Hardwarekomponenten werden für die Entwicklung des Geräts benötigt? Dazu gehört die Identifizierung der Schaltkreise, Prozessorchips und Mikrocontroller sowie aller erforderlichen internen und externen Peripheriegeräte. 
  • Wie viel Strom werden die Komponenten benötigen? 
  • Wird das Gerät mit dem Internet verbunden sein?
  • Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
  • Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
  • Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?

Schritt 3: Auswahl des Betriebssystems

Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen. 

Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten. 

Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?

Schritt 4: Die Entwicklungswerkzeuge

Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen. 

Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.

Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren

Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.

Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.

Schritt 6: Wartung und Unterstützung

Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.

Die wichtigsten eingebetteten Programmiersprachen

Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.

Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.

Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?

Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist. 

Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.

Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.

Insgesamt sollten Sie C wählen, wenn:

  • Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
  • Sie wollen die bestmögliche Leistung.
  • Ihre Entwickler sind in C/C++ bewandert.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Verwenden Sie Python, wenn:

  • Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
  • Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
  • Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
  • Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
  • Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.

Verwenden Sie Java, wenn:

  • Sie erstellen Webanwendungen.
  • Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?

Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung. 

Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.

Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.

Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.

Warum sichere Kodierung in C/C++ wichtig ist

Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen. 

Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.

Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:

  • Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
  • Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
  • Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
  • Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.

Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.

Erfahren Sie, wie wir die Automobil- und Transportbranche unterstützen. Oder probieren Sie noch heute eine Embed-Focus-Coding-Challenge aus, um zu erfahren, wie wir Entwickler in die Lage versetzen, sichere Embedded-Anwendungen zu schreiben!

Ressource anzeigen
Ressource anzeigen

Füllen Sie das folgende Formular aus, um den Bericht herunterzuladen

Wir bitten Sie um Ihre Erlaubnis, Ihnen Informationen über unsere Produkte und/oder verwandte Themen der sicheren Codierung zuzusenden. Wir werden Ihre persönlichen Daten immer mit äußerster Sorgfalt behandeln und sie niemals zu Marketingzwecken an andere Unternehmen verkaufen.

Senden
Um das Formular abzuschicken, aktivieren Sie bitte "Analytics"-Cookies. Sie können die Cookies wieder deaktivieren, sobald Sie fertig sind.

Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten. 

Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.

Was ist ein eingebettetes Gerät und System?

Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein. 

Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten. 

Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.

Beispiele für eingebettete Geräte

Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:

  • Ein Thermostat in einem Klimagerät. 
  • Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
  • Digitale Klimakontrollsysteme.
  • Navigationssysteme in Flugzeugen.
  • Digitale Uhren.
  • GPS-Geräte.
  • Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
  • Blutdruck- und Herzschlagmessgeräte.
  • Vernetzungskomponente in einem MRT-Gerät, die Daten an die Cloud sendet.

Ist ein Laptop ein eingebettetes Gerät?

Kurze Antwort: Nein. Lange Antwort:

Per Definition umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.

Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.

Eingebettete Geräte im Internet der Dinge

Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.

Lebenszyklus der Entwicklung eingebetteter Software

Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:

Schritt 1: Zweck und Anforderungen

Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:

  • Welche Funktionen wird das Gerät erfüllen?
  • Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
  • Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
  • Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
  • Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?

Schritt 2: Systemarchitektur

Sobald wir die einzigartigen Systemanforderungen ermittelt haben, können wir die Systemarchitektur entwerfen. Beantworten Sie Fragen wie:

  • Welche Hardwarekomponenten werden für die Entwicklung des Geräts benötigt? Dazu gehört die Identifizierung der Schaltkreise, Prozessorchips und Mikrocontroller sowie aller erforderlichen internen und externen Peripheriegeräte. 
  • Wie viel Strom werden die Komponenten benötigen? 
  • Wird das Gerät mit dem Internet verbunden sein?
  • Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
  • Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
  • Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?

Schritt 3: Auswahl des Betriebssystems

Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen. 

Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten. 

Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?

Schritt 4: Die Entwicklungswerkzeuge

Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen. 

Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.

Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren

Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.

Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.

Schritt 6: Wartung und Unterstützung

Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.

Die wichtigsten eingebetteten Programmiersprachen

Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.

Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.

Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?

Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist. 

Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.

Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.

Insgesamt sollten Sie C wählen, wenn:

  • Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
  • Sie wollen die bestmögliche Leistung.
  • Ihre Entwickler sind in C/C++ bewandert.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Verwenden Sie Python, wenn:

  • Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
  • Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
  • Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
  • Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
  • Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.

Verwenden Sie Java, wenn:

  • Sie erstellen Webanwendungen.
  • Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?

Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung. 

Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.

Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.

Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.

Warum sichere Kodierung in C/C++ wichtig ist

Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen. 

Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.

Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:

  • Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
  • Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
  • Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
  • Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.

Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.

Erfahren Sie, wie wir die Automobil- und Transportbranche unterstützen. Oder probieren Sie noch heute eine Embed-Focus-Coding-Challenge aus, um zu erfahren, wie wir Entwickler in die Lage versetzen, sichere Embedded-Anwendungen zu schreiben!

Auf Ressource zugreifen

Klicken Sie auf den unten stehenden Link und laden Sie die PDF-Datei dieser Ressource herunter.

Secure Code Warrior ist für Ihr Unternehmen da, um Sie dabei zu unterstützen, Ihren Code über den gesamten Lebenszyklus der Softwareentwicklung hinweg zu sichern und eine Kultur zu schaffen, in der Cybersicherheit an erster Stelle steht. Ganz gleich, ob Sie AppSec-Manager, Entwickler, CISO oder ein anderer Sicherheitsverantwortlicher sind, wir können Ihrem Unternehmen helfen, die mit unsicherem Code verbundenen Risiken zu reduzieren.

Bericht ansehenDemo buchen
PDF herunterladen
Ressource anzeigen
Weitergeben:
Interessiert an mehr?

Weitergeben:
Autor
Secure Code Warrior
Veröffentlicht Aug 11, 2021

Secure Code Warrior macht sicheres Programmieren zu einer positiven und fesselnden Erfahrung für Entwickler, die ihre Fähigkeiten ausbauen. Wir leiten jeden Programmierer auf seinem bevorzugten Lernpfad an, damit sicherheitskompetente Entwickler zu den täglichen Superhelden unserer vernetzten Welt werden.

Secure Code Warrior baut eine Kultur von sicherheitsorientierten Entwicklern auf, indem es ihnen die Fähigkeiten vermittelt, sicher zu programmieren. Unser Flaggschiff Agile Learning Platform bietet relevante fähigkeitsbasierte Pfade, praktische Übungen missions und kontextbezogene Tools, mit denen Entwickler ihre Fähigkeiten zum Schreiben von sicherem Code schnell erlernen, aufbauen und anwenden können.

Weitergeben:

Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten. 

Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.

Was ist ein eingebettetes Gerät und System?

Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein. 

Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten. 

Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.

Beispiele für eingebettete Geräte

Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:

  • Ein Thermostat in einem Klimagerät. 
  • Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
  • Digitale Klimakontrollsysteme.
  • Navigationssysteme in Flugzeugen.
  • Digitale Uhren.
  • GPS-Geräte.
  • Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
  • Blutdruck- und Herzschlagmessgeräte.
  • Vernetzungskomponente in einem MRT-Gerät, die Daten an die Cloud sendet.

Ist ein Laptop ein eingebettetes Gerät?

Kurze Antwort: Nein. Lange Antwort:

Per Definition umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.

Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.

Eingebettete Geräte im Internet der Dinge

Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.

Lebenszyklus der Entwicklung eingebetteter Software

Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:

Schritt 1: Zweck und Anforderungen

Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:

  • Welche Funktionen wird das Gerät erfüllen?
  • Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
  • Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
  • Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
  • Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?

Schritt 2: Systemarchitektur

Sobald wir die einzigartigen Systemanforderungen ermittelt haben, können wir die Systemarchitektur entwerfen. Beantworten Sie Fragen wie:

  • Welche Hardwarekomponenten werden für die Entwicklung des Geräts benötigt? Dazu gehört die Identifizierung der Schaltkreise, Prozessorchips und Mikrocontroller sowie aller erforderlichen internen und externen Peripheriegeräte. 
  • Wie viel Strom werden die Komponenten benötigen? 
  • Wird das Gerät mit dem Internet verbunden sein?
  • Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
  • Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
  • Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?

Schritt 3: Auswahl des Betriebssystems

Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen. 

Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten. 

Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?

Schritt 4: Die Entwicklungswerkzeuge

Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen. 

Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.

Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren

Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.

Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.

Schritt 6: Wartung und Unterstützung

Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.

Die wichtigsten eingebetteten Programmiersprachen

Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.

Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.

Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?

Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist. 

Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.

Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.

Insgesamt sollten Sie C wählen, wenn:

  • Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
  • Sie wollen die bestmögliche Leistung.
  • Ihre Entwickler sind in C/C++ bewandert.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Verwenden Sie Python, wenn:

  • Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
  • Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
  • Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
  • Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
  • Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.

Verwenden Sie Java, wenn:

  • Sie erstellen Webanwendungen.
  • Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?

Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung. 

Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.

Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.

Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.

Warum sichere Kodierung in C/C++ wichtig ist

Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen. 

Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.

Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:

  • Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
  • Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
  • Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
  • Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.

Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.

Erfahren Sie, wie wir die Automobil- und Transportbranche unterstützen. Oder probieren Sie noch heute eine Embed-Focus-Coding-Challenge aus, um zu erfahren, wie wir Entwickler in die Lage versetzen, sichere Embedded-Anwendungen zu schreiben!

Inhaltsübersicht

PDF herunterladen
Ressource anzeigen
Interessiert an mehr?

Secure Code Warrior macht sicheres Programmieren zu einer positiven und fesselnden Erfahrung für Entwickler, die ihre Fähigkeiten ausbauen. Wir leiten jeden Programmierer auf seinem bevorzugten Lernpfad an, damit sicherheitskompetente Entwickler zu den täglichen Superhelden unserer vernetzten Welt werden.

Secure Code Warrior ist für Ihr Unternehmen da, um Sie dabei zu unterstützen, Ihren Code über den gesamten Lebenszyklus der Softwareentwicklung hinweg zu sichern und eine Kultur zu schaffen, in der Cybersicherheit an erster Stelle steht. Ganz gleich, ob Sie AppSec-Manager, Entwickler, CISO oder ein anderer Sicherheitsverantwortlicher sind, wir können Ihrem Unternehmen helfen, die mit unsicherem Code verbundenen Risiken zu reduzieren.

Demo buchenHerunterladen
Weitergeben:
Ressourcendrehscheibe

Ressourcen für den Einstieg

Mehr Beiträge
Ressourcendrehscheibe

Ressourcen für den Einstieg

Mehr Beiträge