Um Risiken bei Firmware-Updates zu verstehen, sind Mikrocontroller-Grundlagen sowie die Themen Integritätscheck und Verschlüsselung wichtig.

Um Risiken bei Firmware-Updates zu verstehen, sind Mikrocontroller-Grundlagen sowie die Themen Integritätscheck und Verschlüsselung wichtig. (Bild: AdobeStock 224320364, Devenorr)

Ob Fehlerbeseitigung oder Funktionserweiterungen – Embedded-Systeme müssen in immer kürzeren Zyklen upgedatet werden. Firmware-Aktualisierungen sind jedoch häufig kritische Arbeitsschritte und für den Entwickler meist mit großem Zeitaufwand verbunden. Viele Mikrocontroller-Hersteller liefern Pakete für den Firmware Updateprozess mit. Diese sind in der Regel funktional.

Eck-Daten

Beim Firmware-Update ist besonders darauf zu achten, dass regelmäßige Updates möglich sind, der Hersteller vor Hackerangriffen geschützt ist und sämtliche Nutzerdaten sicher sind und bleiben. Mit dem Bootloader-System Semf steht dem Embedded Engineer ein Toolset für die Umsetzung eines sichern und fehlerfreien Firmware-Updateprozesses zur Verfügung. Das Update erfolgt in drei Schritten: Download des Binary, Check von Größe, Authentifizierung und Integrität und Boot-Prozess.

Sobald jedoch Anforderungen wie „Failsave bei Stromausfall während des Updateprozesses“ oder „Schutz gegen Hackerangriffe“ bestehen, muss die Software hohen Standards genügen. Um die Funktionsweise eines Mikrocontrollers und die damit verbundenen Risiken bei Firmware-Updates zu verstehen, sind Mikrocontroller-Grundlagen sowie die Themen Integritätscheck und Verschlüsselung wichtig.

Aufteilung der Speicherbereiche eines Mikrocontrollers

Ein grundlegender Aspekt ist die Aufteilung der Speicherbereiche innerhalb von Flash-Speichern im Allgemeinen und der Mikrocontroller-internen Speicherbänken im Speziellen. Dabei muss besonders beachtet werden, dass Flash-Speicher in Sektoren (Sector) und Seiten (Pages) unterteilt sind. Ein Sektor, der kleinste löschbare Speicherbereich, beinhaltet in der Regel mehrere Seiten. Üblicherweise ist es nicht möglich in einem Schreibbefehl über die Grenzen einer Seite hinaus zu schreiben, weshalb es sich empfiehlt, dies in zwei Schreibbefehle zu trennen (einer pro Seite). Je nach Flash-Technologie kann der Speicherbereich zwar byteweise (acht Bit) gelesen, aber gegebenenfalls nur Half-Word (16 Bit) oder wordweise (32 Bit) geschrieben werden. Dies führt unter Umständen zu sehr schwer nachvollziehbaren Fehlerbildern.

Im vorliegenden Beispiel sind alle Seiten des internen Flashs des Mikrocontrollers 128 Byte groß. In der Regel liegt der Bootloader am Anfang des Speichers (Bild 1).

Bild 1: Aufteilung der Speicherbereiche eines Mikrocontrollers.
Bild 1: Aufteilung der Speicherbereiche eines Mikrocontrollers. (Bild: Querdenker Engeneering)

Hier schließt daran ein Shared Memory an, in welchem Bootloader und Applikation relevante Informationen austauschen können, beispielsweise ob das Flashen der neuen Informationen nötig ist. An dritter Stelle liegt die Applikation, die in diesem Fall das Firmware-Update anstößt, welches im Laufe des Prozesses überschrieben wird.

Speichermanagement bei Semf

Im Rahmen des Speichermanagements bietet das Bootloader-System Semf einige Vorteile. Es abstrahiert die verwendeten Speichertechnologien und bietet Lösungen für konkrete Problemstellungen. So bietet es Basisklassen für Flash- und EEPROM-Speicher, Implementierungen für interne Flashbereiche von Mikrocontrollern sowie externe Flashs via I2C, beziehungsweise SPI angebundene Speicherbausteine. Die offene Architektur erlaubt die Anpassung in Spezialfällen. Eine intuitive API des Sourcecodes sorgt für eine gute Lesbarkeit.

Einsatz von Linker-Skripten für korrekte Adressierung

Der Linker schreibt die jeweiligen Binärdaten an die korrekte Stelle im Speicher. Im Rahmen eines Firmware-Updates ist es in der Regel nötig, für Bootloader und Applikation ein eigenständiges Projekt zu definieren und an die jeweils korrekte Stelle im Flash zu adressieren. In den jeweiligen Linker-Skripten kann die Startadresse definiert sein, an die die Firmware geschrieben wird.

Wichtig dabei zu beachten ist, dass die Startadresse des Bootloaders mit der des Reference-Manuals übereinstimmen sollte, beziehungsweise der Standardeinstellung von neu angelegten Projekten entspricht. Desweitern muss die Startadresse der Applikation dieselbe sein, zu der auch vom Bootloader aus gesprungen wird.

Drei Schritte zum sicheren Firmware-Update

Um ein Firmware-Update durchführen zu können, muss der Nutzer das neue Binary zuerst auf das Gerät beziehungsweise einen externen Speicher laden. Dies erfolgt in der Regel mit einem File-Download mittels klassischen Kommunikationsschnittstellen wie CAN, USB oder Ethernet.

Nachdem das Binary komplett ist, erfolgt die Prüfung von Größe, Authentifizierung und Integrität (Bild 2).

Bild 2: Zum sicheren Firmware-Update sind drei Schritt nötig: der Download der Firmware, der Check der Firmware und der Boot Prozess.
Bild 2: Zum sicheren Firmware-Update sind drei Schritt nötig: der Download der Firmware, der Check der Firmware und der Boot Prozess. (Bild: Querdenker Engeneering)

Sofern das Firmware-File über einen Header verfügt, in welchem beispielsweise die Version hinterlegt ist, lassen sich auch auch Downgrades oder andere Funktionen starten oder blockieren. Nach Abschluss der Prüfungen werden alle notwendigen Flags im Shared Memory gesetzt. Damit weiß der Bootloader, dass eine neue Firmwareversion zur Verfügung steht und wo sie im Speicher abgelegt ist. Abschließend wird der Mikrocontroller neu gestartet und landet damit im Bootloader.

Dieser ist einfach aufgebaut. Er prüft im Shared Memory, ob eine neue Firmware verfügbar ist und startet dann den Prozess des Überschreibens der alten Datei. Sobald dieser Prozess abgeschlossen ist, erfolgt ein Neustart der Applikation.

Booten

Im Rahmen des Boot-Prozesses bietet der Bootloader einen internen und externen Speicher sowie ein Fail-Save bei z. B. Spannungsausfall. Während des Updates werden beliebig viele Speicherbausteine geflasht.

Sicherheitsmaßnahmen für den Update-Prozess

Bei der Softwarekonzeption ist der Bereich „Firmware-Update“ in der Regel der anspruchsvollste Teil, denn es soll gewährleistet werden, dass regelmäßige Updates, idealerweise fail-save, möglich sind, der Hersteller vor Hackerangriffen geschützt ist und sämtliche Nutzerdaten sicher und geschützt bleiben.

Durch die Verwendung von Zertifikaten nach z.B. PKCS1 Standard in Verbindung mit einem Private Key, den nur der Hersteller selbst verwendet, wird weitestgehend sichergestellt, dass Dritte die Firmware nicht aufspielen können.

Ein Integritätscheck zeigt, ob die neu zu flashende Firmware funktionssicher ist. Übliche Verfahren sind eine einfache CRC oder ein SHA-2 Hash z. B. im Header der Firmware. Während des Firmwarechecks wird dieser geprüft und nur bei Korrektheit erfolgt die Fortführung des Prozesses.

Durch eine zusätzliche Verschlüsselung der Firmware vor der Auslieferung, ist größtmögliche Sicherheit gewährleistet, weil so der Key für die Authentifizierung nicht aus der Binärdatei auslesbar ist.

Fazit

Die Umsetzung eines sichern und fehlerfreien Firmware-Updateprozesses ist eine anspruchsvolle Aufgabe und verlangt tiefes Detailwissen über die Funktionsweise von Mikrocontroller und Speichertechnologien, der Kryptographie sowie der verwendbaren Toolchain. Bei der Projektkonzeption ist besonderes Augenmerk auf Anforderungen nach Authentifizierung, Integrität und Verschlüsselung zu legen. Das Semf-Bootloader-System eignet sich für den professionellen Einsatz und bietet Einsteigern eine stabile Basis und Profis die notwendige Flexibilität und Offenheit für spezielle Anforderungen und Konfigurationen. Der Entwickler-Support hilft beim Onboarding und steht jederzeit mit Rat und Tat zur Seite. (bs)

Florian Seibold, querdenker

Florian Seibold

Inhaber und Geschäftsführer von Querdenker Engineering

Sie möchten gerne weiterlesen?