Sicherung Ihres eingebetteten Speichers

Eingebetteter Speicher muss gesichert werden, um Daten vor unbefugtem Zugriff zu schützen, z. B. von Hackern, die Daten stehlen oder beschädigen wollen. 

Im Bereich der Industrieelektronik könnte ein Angriff beispielsweise erfolgen, um einen Prozess zu unterbrechen und Sicherheitsmaßnahmen zu untergraben. Hacks von vernetzten Geräten werden häufig unternommen, um auf Passwörter zuzugreifen, die Zugriff auf andere Systeme gewähren.

Was ist eingebetteter Speicher?

Bevor wir darüber sprechen, warum Sicherheitsmaßnahmen für eingebetteten Speicher so wichtig sind (und einige Anleitungen dazu geben), müssen wir uns kurz mit den verschiedenen Arten von Speicher befassen und betrachten, wozu diese verwendet werden. Diese Vorbemerkungen sind wichtig, denn sonst entsprächen diese Ausführungen dem Versuch, eine Alarmanlage zu spezifizieren, ohne Informationen über das betreffende Haus oder dessen Inhalt zu haben.

Techopedia definiert ein eingebettetes System wie folgt:

Ein eingebettetes System ist ein dediziertes Computersystem, das für eine oder zwei spezifische Funktionen entwickelt wurde. Dieses System ist in ein kompletten Gerätesystem integriert, das Hardware wie elektrische und mechanische Komponenten umfasst. Das eingebettete System unterscheidet sich insofern von einem normalen Computer, als dieser für eine Vielzahl von Verarbeitungsaufgaben entwickelt wurde. Da ein eingebettetes System nur für bestimmte Aufgaben konzipiert ist, können Konstrukteure Faktoren wie Größe, Kosten, Stromverbrauch, Zuverlässigkeit und Leistung optimieren. Eingebettete Systeme werden in der Regel auf breiter Ebene produziert und sie bieten ähnliche Funktionalität für eine Vielzahl von Umgebungen und Anwendungen.“

Diese Definition ist sehr treffend, besonders die zweite Hälfte. Die Wahl des Speichers wird für Entwickler normalerweise durch die allgemeinen Optimierungsziele eingeschränkt, wobei die Prioritäten je nach Anwendung und Produktvolumen unterschiedlich sein können. Die Umsetzung von Sicherheitsmaßnahmen wird zum Teil dadurch beschränkt, dass diese Optimierungsziele erreicht werden müssen.

Eingebettete Systemen verwenden in der Regel einen Solid-State-Speicher (SSM). Im Rahmen dieses Leitfadens werden wir außerdem eigenständige Speicher-ICs, Karten, Module und Solid-State-Laufwerke (SSDs) besprechen, da Speicher beispielsweise auch in Mikrocontroller und System-on-Chip-Geräte (SoC) integriert ist.

Speicher kann in zwei Kategorien aufgeteilt werden: flüchtiger und nichtflüchtiger Speicher.

 

    Memory types - Volatile vs Non-Volatile

     

    • Flüchtiger Speicher. Diese Art von Speicher dient zum temporären Speichern von Daten und sie erfordert, dass das System mit Strom versorgt wird. In eingebetteten Systemen werden zwei Arten von flüchtigem Speicher verwendet: statischer Random-Access-Speicher (SRAM) und dynamischer Random-Access-Speicher (DRAM). Dabei müssen Abwägungen nach Kosten und Geschwindigkeit gemacht werden, da SRAM zwar schneller, aber auch teurer ist. Außerdem muss DRAM mehrmals pro Sekunde aktualisiert werden (selbst bei eingeschaltetem Gerät)
    • Nichtflüchtiger Speicher. Bei dieser Art von Speicher bleiben die Daten erhalten, nachdem die Stromversorgung getrennt wurde. Diese Kategorie hat zwei Unterkategorien:
      • Einmalig programmierbar (OTP). Beispiele sind maskierter schreibgeschützter Speicher (ROM – am Herstellungsort beschrieben), programmierbarer ROM (PROM – leer hergestellt und vom Benutzer einmalig beschrieben) sowie löschbarer PROM (EPROM – kann erneut beschrieben werden, nachdem sein Inhalt mit UV-Licht gelöscht wurde).
      • Lesen/Schreiben. Beispiele sind elektrisch löschbarer PROM (EEPROM oder auch E2PROM) und Flash-Speicher, der technisch gesehen eine Form von EEPROM ist, aber eine andere Architektur aufweist.

    Ihre Sicherheitsüberlegungen beginnen bereits hier. Wenn es bei nichtflüchtigem Speicher z. B. nicht erforderlich sein sollte, Daten vor Ort zu überarbeiten, können Sie OTP-Speicher verwenden. Ihre Daten werden physisch über einen Kommunikationsanschluss oder drahtlos zugänglich sein, sie können aber nicht geändert werden.

    Was den Formfaktor von eingebettetem Speicher betrifft, so gibt es viele verschiedene Typen. Die häufigsten sind Chips/ICs.

    ICs mit geringerer Speicherkapazität sind in den Formfaktoren PDIP (Plastic Dual In-Line Package) und SOIC (Small Outline Integrated Circuit) erhältlich und werden fest auf die Leiterplatte gelötet. Für Speicher-ICs mit größerer Kapazität wie z. B. DRAM werden die Formfaktoren TSOP (Thin Small Outline Package), CSP (Chip-Scale Packaging), LQFP (Low-Profile Quad Flat Pack) und BGA (Ball Grid Array) angeboten. Auch diese werden fest auf eine Leiterplatte gelötet.

    Wenn die Wahrscheinlichkeit besteht, dass der Speicher geändert/aktualisiert werden muss, stehen Karten und Module zur Verfügung, und die Platine wird entsprechend mit einem Kartensteckplatz oder Anschluss versehen.

    Zu den austauschbaren Speicherformaten gehören auch USB-Geräte (wie z. B. Speichersticks) und SD-/microSD-Karten. Obwohl die Kapazitäten relativ beschränkt sind, reichen sie für die meisten eingebetteten Systeme aus.

    Wozu wird eingebetteter Speicher verwendet?

    Eingebettete Systeme verwenden unterschiedliche Speichertypen für verschiedene Zwecke und dabei ist die Art des eingebetteten Systems ein maßgebender Faktor. Bei dem eingebetteten System könnte es sich beispielsweise um ein vernetztes Verbrauchsgerät handeln. Verbrauchsgeräte umfassen intelligente Weißwaren und Infotainment-Geräte – die alle in das Internet der Dinge (IoT) integriert sind. Gleichermaßen sind Industriegeräte zur Überwachung und Steuerung von Prozessen häufig in das industrielle IoT (IIoT) eingebunden.

    Nachfolgend sehen Sie eine Beispielarchitektur aus einer Anwendung in der Industrieelektronik, die zeigt, wo sich der Speicher in einem eingebetteten System befindet:
    Memory types - Volatile vs Non-Volatile

    Software-hardware stack diagram

    Speicher ist ein wesentlicher Bestandteil der Hardwaregrundlage eines eingebetteten Systems.

    Speicher ist ein wesentlicher Bestandteil eines eingebetteten Systems und kann als „Subsystem“ angesehen werden’.

    Wir können uns die Position von Speicher in einem eingebetteten System auch bildlich machen, indem wir die Interaktion zwischen Software und Hardware betrachten.

    Obwohl dies im obigen Diagramm nicht dargestellt ist, wird das Betriebssystem einen Kernel, Bibliotheken, ein Dateisystem, Kommunikationssoftware und einen Geräte-Manager enthalten. Auf diese Weise können Betriebssysteme die Speicherverwaltung übernehmen – dies ist praktisch, aber es stellt auch eine Sicherheitslücke dar. Außerdem ist hier nicht abgebildet, dass eingebettete Systeme manchmal über so genannte „Middleware“ verfügen, welche zusätzliche Dienste bereitstellt, die über die Funktionen des Betriebssystems hinausgehen.

    Speicherverwaltung

    In einem eingebetteten System muss der Speicher verwaltet werden. Dabei werden mehrere Aufgaben und Prozesse wahrscheinlich über Lese- und/oder Schreibzugriff auf denselben Speicherplatz verfügen. Wenn die gemeinsame Nutzung des Speichers nicht ordnungsgemäß koordiniert wird, wird das System nicht wie vorgesehen funktionieren und es kann sogar abstürzen.

    Die Speicherverwaltung muss effizient (d. h. reaktionsschnell und ohne Mehraufwand) und sicher sein.

    Die Verwaltung erfolgt in der Regel durch das Betriebssystem (oder, genauer gesagt, in einem Kernel im Herzen des Betriebssystems), aber Konstrukteure von eingebetteten Systemen entwickeln auch gerne ihre eigenen Lösungen.

    Wenn das System kein Betriebssystem hat, muss die Speicherverwaltung speziell im Code festgeschrieben werden. Alternativ können Sie auch einen dedizierten Speicherverwaltungs-IC verwenden.

    Die Speicherverwaltung umfasst die folgenden Aufgaben:

    • Zuweisen und Freigeben von Speicher zur Verwendung
    • Schutz bestimmter Speicherbereiche
    • Verwalten der Zuordnung zwischen logischem (physischem) Speicher und Aufgabenreferenzen im Speicher
    • Festlegen, welche Prozesse in den verfügbaren Speicherplatz geladen werden sollen
    • Unterstützen der Speicherzuweisung und -freigabe für Codeanfragen (innerhalb eines Prozesses), wie die Funktionen „alloc“ und „dealloc“ aus der Programmiersprache C, oder spezifische Routinen für die Pufferzuweisung- und -freigabe
    • Verfolgen der Speicherauslastung von Systemkomponenten
    • Gewährleisten der Cache-Kohärenz (für Systeme mit Cache)
    • Schutz des Prozessspeichers

    Wie kann eingebetteter Speicher angegriffen werden?

    Man könnte anstelle dessen auch fragen: „Wie kann ein eingebettetes System angegriffen werden?“, da Speicher für den Betrieb des Systems von so entscheidender Bedeutung ist.

    How might embedded memory be attacked?

    Bei den meisten eingebetteten Systemen, die gehackt werden, handelt es sich um relativ große „intelligente“ Konsumgüter (z. B. IoT-Geräte), Spielekonsolen und (in geringerem Umfang) Industriegeräte wie speicherprogrammierbare Steuerungen (SPS, die oft IIoT-fähig sind). Sie werden angegriffen, um dem Hacker Zugriff auf sensible/wertvolle Daten auf diesem System zu geben, um lokale Störungen zu verursachen und/oder sich Zugang zu Netzwerken und anderen Systemen zu verschaffen.

    Angriffe dieser Art sind in der Regel softwarebasiert und erfolgen über eine Kommunikation von einem Remotestandort, der nicht leicht zu identifizieren ist. Die Kommunikation wird vom Zielsystem dabei nicht als ungewöhnlich erkannt. Es scheint sich um ein normales Gerät bzw. einen normalen Benutzer zu handeln, das/der über seine IP-Adresse Zugriff anfordert.

    Hacker können sich Zugang verschaffen, weil die Systemsoftware Schwachstellen aufweist. Beispielsweise enthält sie möglicherweise keinen Mechanismus, um einem „Brute Force“-Angriff entgegenzuwirken, bei dem ein Passwort mechanisch erraten wird. Der Hacker erlangt dabei nicht nur Zugriff auf das System, sondern legitime Benutzer werden darüber hinaus während des Angriffs ausgesperrt, ähnlich wie bei einem DDoS (Distributed Denial of Service)-Angriff auf einen Server.

    Angriffe können auch über USB-Anschlüsse erfolgen. Nachrichten über Malware, die über infizierte USB-Sticks in Computer eingeführt wird, gehen häufig durch die Presse, und viele Unternehmen haben den Besitz solcher Geräte daher zu einem Verstoß gemacht, der zur Entlassung führen kann.

    Viele eingebettete Systeme wie z. B. industrielle Prozessüberwachungs- und Steuerungssysteme, verfügen über USB-Anschlüsse für die Verbindung mit Laptops oder USB-Sticks, sodass Daten wie Leistungskennzahlen oder Fehlercodes heruntergeladen werden können. Die Anschlüsse werden auch zum Hochladen von Programmsoftware und Konfigurationseinstellungen verwendet.

    Ein weiteres Problem ist, dass praktisch jedes eingebettete System rückkompiliert werden kann. Wenn es sich um ein kommerziell erhältliches Produkt handelt, können Hacker kaum daran gehindert werden, ein Exemplar zu kaufen und mithilfe von einfach zugänglichen Test- und Messgeräten die inneren Funktionen des Geräts aufzudecken und zu ermitteln, welche Art von Daten dort gespeichert werden.

    Nachdem ein Hacker weiß, wie Ihr Gerät funktioniert und wie der Speicher partitioniert wird – und wie Ihr System Daten verwaltet (einschließlich Software-/Firmware-Updates) – muss er nur noch den bösartigen Code in das System einführen. Wie bereits erwähnt, kann dies über das Netzwerk, drahtlos oder per USB erfolgen.

    Eine der häufigsten Angriffsformen ist der „Speicherpufferüberlauf“ bzw. ‘memory buffer overflow’.

    Speicherpufferüberlauf-Angriff

    Speicherpufferüberläufe treten oft zufällig auf, meistens als Folge schlechter Codierung. Wenn Daten in den Speicher geschrieben werden, werden sie an eine bestimmte Adresse gesendet, der in der Speichertabelle Speicherplatz zugewiesen wurde. Wenn das Datenvolumen, das an den Speicherort geschrieben werden soll, den zugewiesenen Speicherplatz überschreitet, geht der Überschuss an den nächsten verfügbaren Speicherort und überschreibt dort alle bereits vorhandenen Daten.

    Dies kann das Verhalten des Systems beeinträchtigen (oder sogar zu einem Absturz führen), was natürlich bemerkt werden würde. Die meisten Pufferüberlaufangriffe sind jedoch strategisch und zielen darauf ab, die Ausführung der Software so zu ändern, dass es vertrauliche Daten offenlegt oder den Zugriff auf andere Systeme gewährt, ohne abzustürzen oder Anzeichen eines Sicherheitsverstoßes aufzuzeigen.

    Obwohl man die Ansicht vertreten könnte, dass der eingebettete Code (oder besser gesagt das Codierungs-Tool / der Compiler) erkennen sollte, wenn es versucht wird, mehr Daten zu schreiben, als Platz verfügbar ist, sind viele Speicheradressierungsfunktionen in C und C++ unbegrenzt. So liest die Funktion get(s) in C beispielsweise Daten in einen Puffer (im Speicher), aber die Größe dieser Daten ist unbegrenzt. Ohne zusätzlichen Code zur Validierung oder zum automatischen Abschneiden von Daten vor dem Senden an den Puffer gibt es keinen Schutz gegen einen Pufferüberlauf.

    Sicherheitsanforderungen für eingebetteten Speicher

    Die Entwicklung eines eingebetteten Systems bringt immer Herausforderungen mit sich. Dabei geht es nicht nur das Erfüllen der funktionalen Anforderungen (wie Geschwindigkeit, Leistung, Robustheit und Zuverlässigkeit), sondern auch um die Tatsache, dass Konstrukteure viele Einschränkungen berücksichtigen müssen. Dazu gehören Stromverbrauch (besonders bei batteriebetriebenen Systemen), Volumen, Gewicht und natürlich Kosten.

    Obwohl die Systeme, die letztendlich auf den Markt kommen, oft ausgeklügelt und vielseitig sind, werden sie gleichzeitig auch das Ergebnis vieler Kompromisse sein, die bei der Konstruktion, der Fertigung und den Produkttests gemacht werden mussten.

    Solche Systeme sind oft nicht einfach zu skalieren, sodass das Hinzufügen von zusätzlichen Sicherheitsmaßnahmen, die zum Zeitpunkt der Entwicklung nicht vorgesehen waren (aber nach einem Angriff oder einer erkannten Schwachstelle als erforderlich erkannt wurden), keine leichte Aufgabe ist.

    Dazu kommt auch, dass die Software- und Hardware-Entwickler von eingebetteten Systemen oft langjährige Erfahrung im Einhalten der oben angeführten Einschränkungen haben. Sie sind daher stark auf „ihr System“ fokussiert, dessen beabsichtigtes Verhalten und die legitimen Schnittstellen zu Netzwerken und einem breiteren System. In den wenigsten Fällen werden sie jedoch Sicherheitsexperten sein, so dass es oft schwierig für sie ist, sich vorzustellen, wie Angriffe durchgeführt werden könnten.

    How to secure embedded memory

    So sichern Sie den eingebetteten Speicher

    Die erste Verteidigungslinie ist, Hacker am Zugriff auf den Speicher zu hindern. Schwachstellen in der Netzwerkkonnektivität und der Zugangskontrolle müssen erkannt, verstanden und behoben werden. Wenn Sie zum Beispiel meinen, dass ein Brute-Force-Angriff möglich ist, sollten Sie längere Passwörter verwenden und/oder eine Funktion implementieren, bei der das System nach einer bestimmten Anzahl falscher Versuche weitere Kommunikationen von dieser Quelle ignoriert.

    Wir haben weiter oben bereits erwähnt, dass Pufferspeicherangriffe verbreitet sind. Eine effektive Gegenmaßnahme für diese Bedrohung ist, eine sicherere Programmiersprache (wie z. B. C# oder Java) zu verwenden.

    Auch Betriebssysteme verfügen über Schutzmechanismen. Dazu gehören das Deklarieren bestimmter Speicherbereiche als „nicht ausführbar“ und das zufallsbedingte Zuweisen von Speicherorten bei der Ausführung / zur Laufzeit. Die letzte Maßnahme ist besonders effektiv, weil ein Hacker, der einen Pufferspeicherüberlauf-Angriff plant (um das Verhalten des Systems auf eine bestimmte Weise zu verändern), genaue Adressen kennen muss. Bei dieser Maßnahme ändern sie sich jedoch jedes Mal, wenn Ihr System ausgeführt wird.

    Eine strikte, von der Hardware erzwungene Partitionierung ist ebenfalls nützlich. Dies bedeutet, dass der Software-Stack keinen uneingeschränkten Zugriff auf den physischen Speicher hat.

    Weiter oben haben wir auch die Schwachstellen besprochen, die im Zusammenhang mit USB entstehen können. Kabel und Geräte sind weit verbreitet erhältlich. Eine Lösung kann hier der Einsatz von Geräten mit industriellem Formfaktor sein. Handelsübliche USB-Kabel und -Laufwerke können nicht physisch an eine industrielle Buchse angeschlossen werden und gleichermaßen kann ein austauschbares industrielles Speichergerät nicht mit einem kommerziellen Empfänger verbunden werden.

    Darüber hinaus sind industrielle Laufwerke verfügbar, die hochsicheren Speicher mit Krypto-Authentifizierung bieten.

    Manipulationssicherer Speicher

    Zusätzlich zu den grundlegenden Speichertypen, die wir in Was ist eingebetteter Speicher? besprochen haben, gibt es Varianten, die über eine interne Speicherverwaltung verfügen, mit Daten nach dem Schreiben schreibgeschützt gemacht werden können.

    Der so genannte WORM-Speicher (Write Once Read Many) gewährleistet den Schutz der Daten. Nachdem sie geschrieben wurden, können Daten nicht mehr gelöscht, geändert oder überschrieben werden.

    In WORM-Geräten kann die integrierte Speicherverwaltung unzulässiges Verhalten erkennen. Wenn eine Aktion (z. B. der Versuch, Daten zu ändern) erkannt wird, wechselt der Speicher in den schreibgeschützten Modus. Hinweis: Bei einigen Speicherlösungen ist dies der Standardmodus.

    WORM-basierte USB-Laufwerke und SD/microSD-Karten werden im Rechtswesen und von Strafverfolgungsbehörden verwendet, wo die permanente, unveränderliche digitale Aufzeichnung bestimmter Informationen erforderlich ist. Sie ersetzen das Brennen einer CD-R oder DVD-R, das heutzutage oft schwierig ist, da moderne Laptops keine entsprechenden Laufwerke mehr aufweisen.

    Bei einem WORM-Gerät kann natürlich so lange geschrieben werden, bis das Laufwerk voll ist, sodass diese Technologie heute auch im Sektor für eingebettete Systeme Verwendung findet. So erfordern viele sicherheitskritische Prozesse beispielsweise eine strenge Datenprotokollierung/-überwachung – und die Gültigkeit dieser Daten muss außer Frage stehen. Eine permanente, unveränderliche Aufzeichnung ist die sicherste Methode dafür.

    Common criteria evaluation assurance level (CC EAL)

    Wie andere IT-Produkte auch, können eingebettete Systeme in Bezug auf ihre Sicherheit eingestuft werden. Die EAL (Evaluation Assurance Level)-Einstufung in Bezug auf die CC (Common Criteria)-Sicherheitskriterien ist ein international anerkannten Standard.

    Die EAL-Bewertung zeigt, wie gründlich die Sicherheitsfunktionen eines Systems, Subsystems oder Chipsatzes verifiziert wurden, und Produkte werden entsprechend auf der CC EAL-Stufe 1 bis 7 eingestuft.

    Die Stufen sind nachfolgend zusammengefasst:

    Stufe Beschreibung
    CC EAL 1 Funktionell getestet
    CC EAL 2 Strukturell getestet
    CC EAL 3 Methodisch getestet und geprüft
    CC EAL 4 Methodisch entwickelt, getestet und geprüft
    CC EAL 5 Semi-formell entwickelt und getestet
    CC EAL 6 Semi-formell verifizierte Entwicklung und Tests
    CC EAL 7 Formell verifizierte Entwicklung und Tests

    Darüber hinaus kann eine Stufe ein „+“ erhalten, was anzeigt, dass die Tests die Anforderungen der aktuellen Stufe übertrafen, während sie die Anforderungen der nächsten Stufe noch nicht erfüllt haben.

    Beispielsweise brachte Samsung Electronics im Mai 2020 eine eigenständige Sicherheitslösung auf den Markt, die einen von erweiterter Sicherheitssoftware verwalteten SE (Secure Element)-Chip umfasst. Nach Angaben von Samsung stellt der Chip einen „dedizierten manipulationssichere Tresor“ dar, der vom Standardspeicher des Smartphones getrennt ist. Das bedeutet, dass PINs, Passwörter und Kreditkartendaten sicherer sind. Dieser Chip mit dem Namen S3FV9RR hat die Zertifizierung CC EAL 6+ erreicht, die höchste Stufe, mit der eine Mobiltelefonkomponente je ausgezeichnet wurde.

    Wie bereits erwähnt, spiegelt die Stufe wider, wie gründlich die Sicherheitsfunktionen getestet wurden. Dies bedeutet also, dass ein eingebettetes System mit einer höheren EAL nicht unbedingt sicherer ist, als ein System mit einer niedrigeren EAL. Es ist möglich, dass das erste System nur über einige wenige Sicherheitsfunktionen verfügt, die gründlich getestet wurden, während das zweite System mehr und bessere Sicherheitsfunktionen aufweist, die jedoch nicht so gründlich getestet wurden.