Sicherer Start in i.MX6

Sicherer Start in i.MX6


Bei der Entwicklung eines Projekts für eingebettete Systeme muss der Entwickler zwei zusätzliche Probleme lösen:

  • So schützen Sie die Firmware vor Spoofing im Produkt;
  • So schützen Sie Software vor dem Kopieren.

In diesem Artikel wird beschrieben, wie Sie den i.MX6-Prozessor vor dem Ändern des Bootloaders im Produkt schützen und das Kopieren der Firmware erschweren können.



Einführung


Zum Schutz des geistigen Eigentums für den Fall, dass das Bare-Metal-Projekt [1] hauptsächlich dem Hardwarekomplex hilft, der sowohl im Mikrocontroller als auch extern vorhanden ist. Beispiele finden Sie auf einer seriösen Website [2] . Zusätzliche Softwaremethoden wie [3] werden verwendet, sie basieren jedoch auf dem unbekannten Schutzmechanismus. Dies ist auf die geringe Rechenleistung der Geräte und die Unannehmlichkeiten bei der Implementierung der dynamischen Firmware-Generierung zurückzuführen.

Wenn SoC mit Betriebssystemen wie Linux ins Spiel kommt, muss der Schutz gleichzeitig auf mehreren Ebenen organisiert werden:

  • Anwendungsebene beenden
  • Betriebssystemebene
  • Bootloader-Level

Im Falle eines Zugriffs auf einer der Ebenen ist es einfach genug, die Software weiterer Ebenen zu beeinflussen und Änderungen an Interaktionen zwischen Ebenen vorzunehmen.
Die einfachsten Beispiele: Ihre unter Linux installierte Software kommuniziert über das UART-Protokoll (z. B. über / dev / ttyACM0) mit einem Mikrocontroller. Ein Angreifer, der Zugriff auf das System erhält, verwendet dieselbe UART-Ressource und wiederholt zufällig gesendete Pakete. Wenn beispielsweise ein Treiber in den Kernel integriert ist, kompiliert ein Angreifer den Kernel neu, indem er den UART-Treibercode auf andere Weise neu schreibt. Die endgültige Anwendung weiß nicht, was passiert.

Was ist ein sicherer Start und warum wird er benötigt?


Die erste Schutzstufe für Ihre Software auf dem Zielsystem ist der sichere Start. Im Folgenden wird der sichere Start für Prozessoren der i.MX6-Familie erläutert.

Der sichere Start in i.MX6 wird über den High Assurance Boot (HAB) implementiert und kann zwei Funktionen ausführen:

  • Sicherer Startvorgang
  • verschlüsselter Download.

In diesem Artikel werde ich den Prozess zur Gewährleistung eines sicheren Prozessorladens beschreiben. I.MX6 implementiert auch einen Algorithmus, der die Bootloader-Verschlüsselung bereitstellt. Die Verwendung erfordert jedoch die Generierung eines eindeutigen Bootloaders für jedes Produkt, da für jeden Prozessor eine eindeutige Verschlüsselungsfunktion verwendet wird. Dies ist eine unpraktische Prozedur in der Serie, daher habe ich sie nicht beschrieben. Wenn Sie zu diesem Thema etwas zu sagen haben, würde ich mich freuen, es zu hören.
Sichere Start versucht, sicherzustellen , dass der Bootloader auf Ihrem Produkt beginnt, mit dem Kernel Sie hinein geladen.

Über die Definition, die ich sicheren Boot gegeben habe. Durch den sicheren Start können Sie das Produkt nicht kopieren. Ja, das macht das Verfahren schwieriger, aber nicht viel. Der Bootloader kann nicht den gesamten FS signieren, bietet also keinen Schutz auf Betriebssystemebene und auf Ebene der endgültigen Anwendung. Alles funktioniert klassisch: durch asymmetrische Verschlüsselung. Ich werde den Vorgang an den Fingern beschreiben, er kann in [4] genauer gelesen werden. Der Bootloader gibt das Skript für den HAB an, in dem die signierten Speicherbereiche angegeben sind und in dem die digitale Signatur liegt. Der öffentliche Schlüssel befindet sich im Speicher des einmal programmierbaren Prozessors (OTP). Beim Laden überprüft das Skript den angegebenen Speicherbereich mithilfe der angehängten digitalen Signatur und eines Kabelschlüssels. Wenn der Test fehlschlägt, startet der Prozessor den Download nicht. Der HAB-Betrieb muss auch durch Setzen eines Bits im OTP-Speicherbereich aktiviert werden.

Nachteile des sicheren Starts:

  • Wenn der HAB nicht aktiviert ist, wird die Firmware weiterhin gestartet. Dies bedeutet, dass ohne hinzufügen. Schutzmethoden Ihre Firmware wird auf einer Kopie des Produkts ausgeführt. Um dies zu verhindern, muss der Bootloader den HAB beim Start unabhängig aktivieren. Wenn Sie dann ein USB-Flash-Laufwerk in ein anderes Produkt einstecken und vergessen, den öffentlichen Schlüssel zu flashen, können Sie den Prozessor herauswerfen.
  • Wenn Sie auf den Prozessorspeicher zugreifen, können Sie den öffentlichen Schlüssel kopieren. Dies reicht aus, um das Produkt zu kopieren.

Implementierung


Im Allgemeinen gibt es im Internet eine ganze Reihe englischsprachiger Artikel [5] [6] zum Implementierungsthema, aber nicht eine einzige vorgeschlagene Methode wurde sofort gestartet, und die Links zur Software begannen zu sterben. Deshalb habe ich beschlossen, dies als Artikel in erster Linie für mich selbst zu speichern Ich werde in Zukunft auf dieses Thema zurückkommen.

Zuerst müssen Sie die folgende Software herunterladen: Code Signing Tool [7] und die erforderlichen Skripte zum Generieren von Schlüsseln und Signieren. Im angegebenen Archiv habe ich alle unnötigen Dienstprogramme und Bibliotheken entfernt, da für unsere Aufgabe ziemlich viele nicht verwendet werden.

Als nächstes müssen Sie die Schlüssel generieren:

cd ${CST_PATH}/release/keys
echo ${serial} > serial //8 ,     
echo ${password} >  key_pass.txt //   ,     
echo ${password} >>  key_pass.txt //
./hab4_pki_tree.sh //     
Do you want to use an existing CA key (y/n)?: n 
Do you want to use Elliptic Curve Cryptography (y/n)?: n
Enter key length in bits for PKI tree: 4096
Enter PKI tree duration (years): 10
How many Super Root Keys should be generated? 4
Do you want the SRK certificates to have the CA flag set? (y/n)?: y
 ../linux64/bin/srktool -h 4 -t SRK_1_2_3_4_table.bin -e SRK_1_2_3_4_fuse.bin \
 -d sha256 -c ./SRK1_sha256_4096_65537_v3_ca_crt.pem,\
./SRK2_sha256_4096_65537_v3_ca_crt.pem,./SRK3_sha256_4096_65537_v3_ca_crt.pem,\
./SRK4_sha256_4096_65537_v3_ca_crt.pem -f 1

Das Schlüsselgenerierungsskript wirft die obigen Fragen auf. Ich habe ein Beispiel für Standardoptionen gegeben. Die Antwort darauf bestimmt, wie die generierten Schlüssel und Parameter der generierten Schlüssel aufgerufen werden. Betrachten Sie mit weiteren Befehlen. Als nächstes lesen wir den öffentlichen Schlüssel, der zum Schreiben in den Prozessor erforderlich ist. Wir werden dafür ein praktisches Skript aus [5] verwenden .

cd ${CST_PATH}/release/linux64/bin
./var-u-boot_fuse_commands.sh 
fuse prog 3 0 0xFFFFFFFF //   uboot.
fuse prog 3 1 0xFFFFFFFF //     
fuse prog 3 2 0xFFFFFFFF //       .
fuse prog 3 3 0xFFFFFFFF //  -   .
fuse prog 3 4 0xFFFFFFFF //      .
fuse prog 3 5 0xFFFFFFFF //
fuse prog 3 6 0xFFFFFFFF  //
fuse prog 3 7 0xFFFFFFFF //

Diese Aufgabe kann auf Uboot mit integriertem SPL oder mit separatem SPL und Uboot (z. B. Rocko Release) angewendet werden. Ich schreibe eine Veröffentlichung, damit Sie wissen, wo sie standardmäßig verwendet werden. Wenn Sie uboot selbst kompilieren, wird Ihre SPL höchstwahrscheinlich in uboot integriert. Ein wichtiger Punkt im defconfig-Bootloader ist das Hinzufügen der folgenden Optionen:

CONFIG_SECURE_BOOT=y
CONFIG_SYS_FSL_HAS_SEC=y 
#define CONFIG_SYS_FSL_SEC_COMPAT    4 /* HAB version */
#define CONFIG_FSL_CAAM
#define CONFIG_CMD_DEKBLOB
#define CONFIG_SYS_FSL_SEC_LE
#define CONFIG_FAT_WRITE

Diese Optionen aktivieren Treiber für die Arbeit mit Hardwaremodulen. Alles ist wie in menuconfig für Linux. Verwenden Sie beim Kompilieren des Bootloaders den ausführlichen Modus (entfernen Sie V = 1. Die Assembly mit diesem Parameter ist in der Anleitung beschrieben. Ich habe sie jedoch selbst bereinigt). In diesem Fall werden den Kompilierungsprotokollen Informationen über die Adresse des Einstiegspunkts und andere für die Aufzeichnung einer digitalen Signatur erforderliche Dinge hinzugefügt. Nach der Kompilierung benötigen wir folgende Ausgabedateien:

  • u-boot-ivt.img
  • u-boot-ivt.img.log
  • SPL
  • SPL.log

Kopieren Sie sie nach $ {CST_PATH} / release / linux64 / bin. Als nächstes müssen Sie ein ziemlich einfaches Skript ausführen.

Detaillierte Beschreibung der Skriptprozedur
(*.csf). , :

  • .

. , ( ).

:

Image Name:   U-Boot 2019 //  U-boot
Created:      XXXXXX
Image Type:   ARM U-Boot Firmware with HABv4 IVT (uncompressed)
Data Size:    339904 Bytes = 331.94 KiB = 0.32 MiB
Load Address: 17800000
Entry Point:  00000000
HAB Blocks:   0x177fffc0   0x0000   0x00051020

Image Type:   Freescale IMX Boot Image //  SPL
Image Ver:    2 (i.MX53/6/7 compatible)
Mode:         DCD
Data Size:    61440 Bytes = 60.00 KiB = 0.06 MiB
Load Address: 00907420
Entry Point:  00908000
HAB Blocks:   00907400 00000000 0000cc00
DCD Blocks:   00910000 0000002c 00000004

«HAB Blocks». ,

cd ${CST_PATH}/release/linux64/bin
./cst --o u-boot_csf.bin --i u-boot.csf
cat u-boot-ivt.img u-boot_csf.bin > u-boot_signed.img


Soweit ich mich erinnere, wird im Fall von integriertem SPL höchstwahrscheinlich alles auf die gleiche Weise funktionieren, aber es lohnt sich, es sich anzusehen. Ich erinnere mich jetzt nicht und habe beim Schreiben dieses Artikels nicht mit dem Kompilieren begonnen.

cd ${CST_PATH}/release/linux64/bin
SOC=mx6 ./var-som_sign_image.sh SPL u-boot-ivt.img

Entsprechend den Ergebnissen des Skripts erhalten Sie zwei Dateien: SPL_signed, u-boot-ivt.img_signed, die auf die Festplatte des Zielsystems geschrieben werden müssen. Ich wende ein Beispiel eines Aufzeichnungsskripts auf das Zielsystem an. Ohne Sudo, um Sie nicht versehentlich ins Bein zu schießen.

dd if=SPL_signed of=${DEVICE(/dev/sd*)} bs=1K seek=1; sync
dd if=u-boot-ivt.img_signed of=${DEVICE(/dev/sd*)} bs=1K seek=69; sync

Nachdem Sie auf ein leeres Medium geschrieben haben, sollten Sie einen Bootloader ohne Kernel erhalten, der in die Konsole stürzt, da er dtb und den Kernel nicht findet. In der Konsole können Sie überprüfen, ob das, was Sie getan haben oder nicht, wirklich funktioniert. In Gegenwart eines Ereignisses ging etwas schief. Wichtig: Wenn der Bootloader ohne HAB-Unterstützung kompiliert wird, treten auch keine Fehler auf.

hab_status
HAB Configuration: 0xf0, HAB State: 0x66
No HAB Events Found!

Der letzte Schritt ist das Aktivieren des HAB. Die Aufmerksamkeit ist ein einmaliger Befehl. Sie kann nicht behoben werden. Seien Sie also vorsichtig

fuse prog 0 6 0x2

Fazit


Ich habe nicht begonnen, den Prozess der Integration all dessen in yocto zu beschreiben, aber ich muss Geheimnisse bewahren. Dies ist jedoch machbar und erfordert nicht viel Zeit.

Referenz


[1] Bare-Metal-Embedded-Software, die direkt auf Hardware ohne Abstraktion in Form von Betriebssystemen ausgeführt wird.
[2] we.easyelectronics.ru/Soft/zaschita-ustroystva-ot-vzloma-i-kopirovaniya.html
[3 ] habr.com/en/post/350602
[4] HAB4_API.pdf bei github.com/BMValeev/CST_TOOL
[5] variwiki.com/index.php?title=High_Assurance_Boot
[6] boundarydevices.com/high-assurance-boot -hab-dummies
[7] github.com/BMValeev/CST_TOOL

All Articles