Wichtige Info

Die Inhalte, die du hier siehst stelle ich dir ohne Werbeanzeigen und ohne Tracking deiner Daten zur Verfügung. Trotzdem muss ich die Server bezahlen sowie Zeit in Recherche, Umsetzung sowie Mail Support stecken.
Um dies leisten zu können, verlinke ich in einigen Artikeln auf die Plattform Amazon. Alle diese Links nennen sich Afiliate Links. Wenn du dir mit diesem Link etwas kaufst, dann erhalte ich eine kleine Provision. Dies ändert jedoch NICHT den Preis, den du bezahlst!
Falls du mich also unterstützen möchtest, kannst du auf den Link zum Produkt klicken und hilfst mir dabei, dieses Hobby weiter zu betreiben.
Da ich Keine Werbung schalte und keine Spenden sammle, ist dies die einzige Möglichkeit, meine Systeme und mich zu finanzieren. Ich hoffe du kannst das verstehen :)



ESP32 - Invalid Header nach Flash Verschlüsselung


Einleitung

Um zu sehen, was denn möglich ist und um meine Projekte sicherer zu machen, habe ich angefangen bei meinen DEV Systemen die Flash encryption zu aktivieren. Dadurch können Personen mit physikalischem Zugriff auf meine Geräte nicht mehr die Daten auslesen (z.B. WiFi Passwort), gerade für meine Geräte, die nicht in meinen eigenen vier Wänden stehen, ist das ein großer Sprung in Richtung Sicherheit.

Leider ist das Thema Verschlüsselung auch manchmal ein leidiges Thema, bei dem man durchaus ein wenig schauen muss. Dieser Beitrag zeigt meinen Fehler, als ich Flash Encryption gerade aktiviert hatte und auf einmal nichts mehr ging.

Hauptteil

Zuerst möchte ich kurz noch darauf eingehen, wie man denn überhaupt die Flash Verschlüsselung aktiviert.
Die Aktivierung erfolgt über die sog. Menuconfig innerhalb von esp-idf. Dafür wird der folgende Befehl eingegeben:

start idf.py menuconfig

Sobald im Menü angekommen, findet sich unter dem Punkt Security Features die Einstellung "Enable flash encryption on boot (READ DOCS FIRST)" - letzteres steht da wirklich und ist auch dringend zu empfehlen, auch wenn dieser Beitrag einen großteil der Warnungen direkt zusammenfasst.

Hier ist wichtig , dass der "Useage Mode" (direkt darunter) auf "Development (Not Secure)" gesetzt ist. Das trifft nur dann zu, wenn das board denn für die Entwicklung bestimmt ist. Sollte es für ein Production Gerät gedacht sein, dann natürlich auf "Release" setzen. Hier ist wichtig zu wissen, dass die Encryption nur im Development Mode zurückgesetzt werden kann! - Und das auch nur 3x pro Gerät, denn um die Verschlüsselung zu deaktivieren muss eine E-Fuse bearbeitet werden, nach 3 maliger Rücksetzung, wird der Zugriff auf diese gesperrt und ein deaktivieren der Verschlüsselung ist nicht mehr möglich (genausowenig das ändern der Encryption Keys).

Das Problem

Nun möchte ich auch schon zum Punkt kommen, denn das folgende hat mich mehrere Stunden beschäftigt, bevor ich bemerkt hatte, dass am Ende mein VSCode an den Problemen schuld war.

Sobald die Verschlüsselung aktiviert ist, nimmt der ESP32 keine nicht verschlüsselten Images mehr an, das heißt es muss bereits verschlüsselt geflasht werden. Hier kam bei mir das Problem zum tragen, denn wenn man den normalen GUI Knopf in VS Code betätigt, dann wird ohne jegliche Verschlüsselung das Projekt gebaut bzw. sofort geflasht, was bei dem Mikrocontroller dann zu einem ungültigen Image führt. Sobald der Mikrocontroller dann booten möchte und die Daten mithilfe des Schlüssels entschlüsseln will, kann er dies natürlich nicht machen (ist ja nicht verschlüsselt) und dementsprechend kann er auch die header des image nicht lesen und es kommt zu der Fehlermeldung wie bei mir zum Beispiel invalid header: 0xb7da73fc.

Lösungsansätze

Um nun wieder entweder ein nutzbares unvertschlüsseltes Image zu bekommen oder eine verschlüsselte Binary zu flashen, gibt es mehrere Möglichkeiten.

1. Möglichkeit - Versuchen ein verschlüsseltes Image zu flashen

Wenn du die Verschlüsselung gerade erst aktiviert hast, solltest du versuchen mithilfe von idf.py das Projekt als verschlüsseltes Binary zu flashen. Bei mir hat dies mein Problem gelöst, da auf dem Flash Button nur unverschlüsselt geflaht werden kann (obwohl man den Befehl natürlich anpassen kann).
Um verschlüsselt zu flashen, muss folgender Befehl verwendet werden - dieser geht nur, wenn Flash Encryption im Dev Mode aktiviert ist. Im Release Mode ist ein Update nur per OTA möglich.

idf.py encrypted-flash

2. Möglichkeit - Deaktivieren der Flash Encryption mithilfe der E-Fuse

Wie oben bereits geschrieben, gibt es im Dev Mode die Möglichkeit die Flash Encryption bis zu drei mal pro Gerät zu deaktivieren. Dies kann man mit dem efusetool machen. Der folgende Befehl deaktiviert die Encryption wieder:

espefuse.py burnefuse FLASHCRYPT_CNT

Wichtig ist hier natürlich, dass vorher der Encryption mode in der Menu Config deaktiviert wird! - Sonst wird dieser direkt wieder reaktiviert beim nächsten Bootvorgang.

3. Möglichkeit - Löschen des Flash Speichers (falls das Build nur fehlerhaft ist)

Um den Flash Speicher des ESP zu löschen kann der folgende Befehl verwendet werden:

idf.py erase-flash


Back…