Wer Embedded-Geräte entwickelt, zum Beispiel als Teil des Internets der Dinge, hat die Wahl, welche Funktion er in Hardware und welche in Software implementiert. Dabei muss der Designer von Anfang an die Datensicherheit (Security) der Geräte beachten: Bereits bei der Partitionierung zwischen Hard- und Software-Implementierung gilt es, verschiedene Arten böswilliger Attacken zu berücksichtigen. Typischerweise sorgt ein Angreifer dafür, dass das Gerät Schadsoftware während des Boot-Vorgangs oder zur normalen Laufzeit ausführt. Eine Manipulation zur Laufzeit verändert den Ablauf eines Programms mit dem Ziel, fremden Code einzuschleusen. Nach einem Reboot sollte sich das System aber wieder in einem sauberen Zustand befinden.

Die Vertrauensbasis beruht in diesem Szenario darauf, dass das Gerät einwandfreie Software aus dem eingebetteten Flash-Speicher ausführt. Allerdings müssen Entwicker sicherstellen, dass diese Software wirklich nicht infiziert ist. Das beginnt damit, dass das System bei der Neu- und Umprogrammierung des Flash-Speichers eine sichere Authentifizierung nutzt, um nur authentischen Code abzulegen und keine manipulierten Varianten. Bei vielen Herstellern von Embedded-Systemen ist dies bereits gängige Praxis.

Bild 1: In diesem Beispiel für sichere Flash-Programmierung berechnet der Hersteller einen Hashwert des Software-Images und signiert den Hash. Das Embedded-Gerät kann dann jede nachträgliche Manipulation erkennen.

Bild 1: In diesem Beispiel für sichere Flash-Programmierung berechnet der Hersteller einen Hashwert des Software-Images und signiert den Hash. Das Embedded-Gerät kann dann jede nachträgliche Manipulation erkennen.Freescale

Manipulation beim Flashen erkennen

Bild 1 zeigt als Beispiel ein Protokoll für die Flash-Programmierung, das einen Kanal zwischen einem externen (Offline-)Programmiertool und dem Mikrocontroller freischaltet. Dieses Beispiel nutzt ein RSA-Schlüsselpaar (Kryptosystem nach Rivest, Shamir und Adleman) mit privatem und öffentlichem Schlüssel, um die Authentizität des Codes zu verifizieren und sicherzustellen, dass dieser nicht durch einen Angriff während des Programmiervorgangs modifiziert worden ist. In einer sicheren Offline-Umgebung berechnet der Hersteller vorab einen Hashwert für das Software-Image, beispielsweise mit SHA-256 (Secure Hash Algorithm mit 256 Bit). Den Hashwert, der das Software-Image unverwechselbar repräsentiert, signiert der Hersteller dann mit einem privaten Schlüssel, der den Eigentümer der Software eindeutig identifiziert. Die so erhaltene Signatur wird dann zusammen mit dem Software-Image an den Speicher des Embedded-Systems übertragen. Das Embedded-System berechnet nun seinerseits den Hashwert des Software-Images und vergleicht diesen Ist-Wert mit dem Soll-Wert.

Auf einen Blick

Um die Sicherheit einer Embedded-Applikation zu gewährleisten, muss ein Entwickler zunächst dafür sorgen, dass sein Gerät den Originalcode ausführt und keinesfalls eine manipulierte Fassung. Dabei sind etliche Randbedingungen zu beachten. Freescale fasst hier die krytografischen Mittel zusammen und ergänzt, wie man sie auf einem Qorivva-Baustein umsetzt, den auch Automobilhersteller einsetzen.

Das Embedded-System authentifiziert darüber hinaus die von der Offline-Umgebung empfangene Signatur mit Hilfe des öffentlichen Schlüssels, also dem Pendant zum privaten Schlüssel, mit der Absender die Signatur erstellt hat. Der Authentifizierungsvorgang berechnet einen Hashwert, der dem Hashwert des Software-Images entsprechen muss. Stimmen beide Werte überein, dann wurde das Software-Image nicht verändert und stammt von einer Gegenstelle, die den zugehörigen privaten Schlüssel benutzt hat. Das bestätigt, woher die Software kommt und dass sie in Ordnung ist.

Sicherer Klartext

Dieses Verfahren überträgt die Software für das Embedded-Gerät unverschlüsselt, auch die Signatur und der öffentliche Schlüssel müssen nicht versteckt werden. Stattdessen muss der private Schlüssel (der ja offline abgelegt ist) geheim bleiben, da dieser die Identität des Erstellers des Software-Images bestätigt. Außerdem muss das Embedded-Gerät den öffentlichen Schlüssel des Absenders kennen, wobei die eigene Kopie manipulationssicher vorliegen muss. Der Vorteil des Authentifizierungsverfahrens mit einem Paar aus privatem und öffentlichem Schlüssel liegt darin, dass der Hersteller lediglich einen privaten Schlüssel benötigt und diesen im Endgerät nicht abspeichern muss. Der private Schlüssel bietet daher nur wenig Angriffsfläche, sein Besitzer kann umfangreiche Maßnahmen für dessen Geheimhaltung treffen und ihn nur im Offline-Speicher vorhalten.

Den zugehörigen öffentlichen Schlüssel kann der Hersteller an alle Embedded-Geräte übergeben, ohne ihn zu verstecken oder zu verschlüsseln. Wichtig ist nur, dass niemand diese Kopie ohne Autorisierung verändern kann, daher ist ein sicheres Verfahren für eine eventuell notwendige Änderung erforderlich. Dieser Fall kann eintreten, wenn der private Schlüssel gestohlen wurde. Beispielsweise könnte man eine Authentifizierung oder ein passwortgeschütztes Protokoll nutzen, um den vorhandenen Schlüssel durch einen neuen, von einer zertifizierten Gegenstelle übermittelten Schlüssel zu ersetzen. Alternativ könnte man den vorhandenen öffentlichen Schlüssel widerrufen und ihn durch einen anderen Schlüssel aus einer Liste vorprogrammierter Schlüssel oder einer Schlüsselkette ersetzen.

Schneller mit symmetrischen Verfahren

Signaturen lassen sich auch sehr gut mit Hilfe symmetrischer Verschlüsselung erstellen und verifizieren. Dabei dient der selbe Schlüssel zum Erstellen und Verifizieren der Signatur. Im Gegensatz zu asymmetrischen Schlüsseln stützt sich das symmetrische Protokoll darauf, dass das Embedded-System und die externe Gegenstelle beide den gleichen Schlüssel geheim abspeichern können. Ein erfolgreicher Angriff auf den Mikrocontroller oder die externe Gegenstelle würde die Sicherheit des Systems kompromittieren.

Die SHE-Spezifikation definiert ein Protokoll für die sichere Änderung geheimer Schlüssel. Das Protokoll verwendet einen symmetrischen AES-128-CMAC (Advanced Encryption Standard mit 128-Bit-Schlüssel, Cipher-basierender Message Authentication Code) für Signaturerstellung und Authentifizierung und einen AES-128-CBC (AES 128 mit Cipher Block Chaining) für die Ver- und Entschlüsselung der zu den Schlüsselupdates gehörigen Nachrichten. Angreifer, die den Updateprozess ausspähen, gelangen somit nicht an den neuen Schlüssel und können ihn auch nicht unbemerkt verändern. AES-128-basierende Verschlüsselungs- und Authentifizierungsalgorithmen laufen typischerweise sehr viel schneller als mit öffentlichen/privaten Schlüsselpaaren arbeitende RSA-Algorithmen.

Sichere Flash-Inhalte

Die authentifizierte Flash-Programmierung sorgt für ein vertrauenswürdiges Code-Image noch vor dem Einsetzen der MCU in das Zielsystem. Ist der Mikrocontroller installiert, dann sind weitere Maßnahmen gefordert. Wenn die Applikation läuft, muss die Integrität des Codes garantiert bleiben, zum Beispiel darf Schadsoftware wie ein trojanisches Pferd den Code nicht manipulieren können. Eine sichere Boot-Technik kann vor dem Start der Applikation die Integrität des Codes prüfen. Entscheidend dabei ist, dass diese Prüfung aus einer sicheren Quelle heraus beginnt und dann lückenlos arbeitet. Dadurch können Hersteller ausschließen, dass ein Gerät ein Programm mit korrumpiertem Code startet.

Gibt es keine Möglichkeit, eine vertrauenswürdige Basis in Software zu implementieren, dann können Entwickler eine Laufzeit-Integritätsprüfung in Hardware konfigurieren und aktivieren, die vor dem Start des eigentlichen Applikationscodes abläuft. Dieses Verfahren vermeidet obendrein, dass die Integritätsprüfung mit dem Applikationsprozess um Speicherbus-Bandbreite konkurriert. Wenn das die Boot-Phase zu sehr in die Länge zieht, könnte man auch eine Laufzeit-Integritätsprüfung implementieren, die parallel zum Applikationscode abläuft und sich die Speicherbus-Bandbreite mit der Applikation teilt.

Bild 2: Ein sicherer Boot-Vorgang läuft in mehreren Schritten, bei denen das Security-Modul jeden neuen Code-Block überprüft, bevor der Prozessor ihn ausführt.

Bild 2: Ein sicherer Boot-Vorgang läuft in mehreren Schritten, bei denen das Security-Modul jeden neuen Code-Block überprüft, bevor der Prozessor ihn ausführt.Freescale

Beide Verfahren bringen Vor- und Nachteile bezüglich der Boot-Zeit und der gemeinsamen Nutzung der Speicherbus-Bandbreite mit sich, aber beide Effekte lassen sich auch durch geeignete Mittel abschwächen. Die Zeit für ein sicheres Booten ließe sich mit Hilfe einer Vertrauenskette verkürzen. Hier wird der Speicher in mehrere Partitionen aufgeteilt, die dann jede für sich mit dem Ablauf der Applikationssoftware nach und nach geprüft werden. Bild 2 zeigt ein Beispiel für diese Strategie. Um die Auswirkungen der Integritätsprüfung auf die Bandbreiten-Auslastung zu minimieren, kann man eine rudimentäre DMA-Funktion (Direct Memory Access) mit Burst-Mode-Zugriff auf Multiport-Speicher im System sowie ein lokales Daten-Caching implementieren.

Hintergründe der Kryptografie

Kryptografische Algorithmen sind im Wesentlichen mathematische Berechnungen zum Ver- und Entschlüsseln einer Nachricht, man berechnet mit ihnen aber auch digitale Signaturen und nutzt sie zur Authentifizierung. Es gibt zwei Hauptkategorien: symmetrische und asymmetrische Algorithmen. Symmetrische Kryptografie nutzt den gleichen Schlüssel für Ver- und Entschlüsselung. Der Schlüssel muss daher von allen beteiligten Stellen, die den Schlüssel für die sichere Kommunikation nutzen, geheim gehalten werden. Der Hauptvorteil symmetrischer Algorithmen liegt in deren Effizienz und Ausführungsgeschwindigkeit. So zeichnet sich zum Beispiel der AES-128-Hardwarebeschleuniger in Freescales 32-Bit-MCU Qorivva MPC5646C durch einen Durchsatz von 70 MByte/s aus.

Als kryptografische Authentifizierung bezeichnet man das Verfahren, mit dem man die Identität des Absenders der Daten sicher verifiziert. In einer Embedded-Applikation kann eine Authentifizierung Code und Daten verifizieren, die über externe Schnittstellen kommen. Sie kann auch die Vertrauenswürdigkeit eines Software-Images verifizieren, bevor man dieses zur Laufzeit ausführt, oder während des Downloads aus einer externen Quelle, bevor das Image in den integrierten Flash-Speicher programmiert wird.

Nutzen der Authentifizierung

Die Authentifizierung gewährleistet normalerweise auch Datenintegrität, wenn die gesamten Daten oder das Software-Image für die Erstellung des Authentifizierungscodes (auch besser bekannt als digitale Signatur) herangezogen wurden. Jede Modifikation der Daten oder des Software-Images wird den Authentifizierungsprozesses scheitern lassen.

Sowohl symmetrische als auch asymmetrische Kryptografie unterstützen Authentifizierungsalgorithmen. Authentifizierung mit symmetrischer Kryptografie nutzt einen gemeinsamen geheimen Schlüssel. Der Absender erzeugt einen so genannten Message Authentication Code (MAC) mit dem geheimen Schlüssel als Startwert (Seed). Es gibt eine ganze Reihe unterschiedlicher symmetrischer MAC-Funktionen, die üblicherweise auf Blockchiffre-Algorithmen basieren. Einige Beispiele dafür sind CBC-MAC, CMAC und PMAC. Mit der Cryptographic Security Engine (CSE) und dem Hardware Security Module (HSM) von Freescale steht eine CMAC-Funktion zur Verfügung, die in der Vorgängerversion CBC-MAC vorhandene Angriffspunkte behebt.

Cryptographic Security Engine im Qorivva

Die Bausteine der 32-Bit-Mikrocontrollerfamilie Qorivva MPC56xx von Freescale Semiconductor gewährleisten eine sichere und zuverlässige Datenübertragung, zum Beispiel zwischen Steuergeräten im Auto. Die für zentrale Karosseriesteuergeräte (BCM), Highend-Gateways und intelligente Verteilerboxen konzipierten MPC564xB/C-Bausteine warten mit einer Rechenleistung bis zu 300 DMIPS auf und verarbeiten auch große Mengen von Code in BCM- und Gateway-Anwendungen. Die integrierte CSE (Cryptographic Services Engine) verlagert die Verwaltung der Kryptoschlüssel von der Software auf die Hardware.

Die MPC560xD-Bausteine der Einstiegsklasse sind kostenoptimierte Lösungen für einzelne CAN-Knoten, die sich durch geringe Stromaufnahme, kompakte Layoutfläche und umfangreiche Kommunikationsschnittstellen wie LIN, SPI und CAN auszeichnen. Sie eignen sich für Endknoten in der Karosseriesteuerung wie Tür- und Sitzmodule. Der moderne, gleichzeitig aber kosteneffiziente Hostprozessorkern reizt die Stärken der Power-Architecture-Technologie aus, von der Rechenleistung über den auf dem Chip integrierten Speicher bis hin zu Analogfunktionen, Timer-Systemen und anderen Funktionen, die für komplexe Steuerungs- und Diagnosesysteme erforderlich sind.