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…