Spaß mit Firmware-Dateiformaten und Fingerabdrücken

Home Foren Trezor Wallet Spaß mit Firmware-Dateiformaten und Fingerabdrücken

Ansicht von 0 Antwort-Themen
  • Autor
    Beiträge
    • #2905
      admin
      Mitglied
      Up
      0
      Down
      ::

      Seitdem ich mit verschiedenen Dateiformaten herumgespielt habe [file formats](https://new.reddit.com/r/Bitcoin/comments/rnxt4u/made_a_stupid_wallet_backup_script_for/) herumstöbere, beschloss ich, mich mit dem Trezor-Firmware-Dateiformat zu beschäftigen. Meine Neugierde wurde vor allem durch die Einführung des neuen Befehls `trezorctl firmware verify` geweckt. Dieser Befehl prüft die Signaturen und Hashes der Firmware-Datei.

      Toll… aber ich wollte wissen, was unter der Haube passiert. Glücklicherweise gibt es einige großartige Dokumentationen auf der [Trezor-One Firmware Layout](https://github.com/trezor/trezor-firmware/blob/core/v2.4.3/docs/hardware/model-one/firmware-format.md#v2-header), und die [Trezor-T Firmware Layout](https://github.com/trezor/trezor-firmware/blob/core/v2.4.3/docs/hardware/model-t/boot.md#firmware-header). Einige gute Hinweise finden sich auch in dem Dokument über [Verifying Builds](https://github.com/trezor/trezor-firmware/blob/core/v2.4.3/docs/common/reproducible-build.md#verifying).

      Für den Fall, dass Sie neugierig geworden sind, hier die Grundlagen, wie ich sie verstehe. Grundsätzlich besteht die Firmware aus zwei Headern und einem Body. Der Body ist in Chunks unterteilt und jeder Chunk wird mit einer Prüfsumme versehen, wobei die Hashes im zweiten Header (auch bekannt als „Firmware Header“) abgelegt werden. Dieser Header wird mit Schlüsseln signiert, die aus dem ersten Header extrahiert wurden. Und der erste Header ist mit dem offiziellen Zertifikat von Satoshi Labs signiert.

      Der erste Header ist also von Satoshi signiert und enthält einige Schlüssel. Diese Schlüssel signieren den zweiten Header, der einige Hashes enthält. Diese Hashes verifizieren die Dateiintegrität der Firmware.

      Nun zu den Fingerabdrücken. Die gesamte Logik der Firmware-Aktualisierung wird von einer Datei namens [releases.json](https://github.com/trezor/webwallet-data/blob/d4aaa1b/firmware/2/releases.json) (trezor-one [version](https://github.com/trezor/webwallet-data/blob/d4aaa1b/firmware/1/releases.json)). Diese Datei wurde zuletzt aktualisiert in [commit #d4aaa1b](https://github.com/trezor/webwallet-data/commit/d4aaa1b9a95a682d2a7230dfea8362c2e1792ff0) signiert mit dem GPG-Schlüssel `4AEE18F83AFDEB23`, der zu [@vdovhanych](https://github.com/vdovhanych). Diese Datei enthält eine 256-Bit-Prüfsumme namens „Fingerprint“. Anhand der GPG-Signatur von git können wir nun die Echtheit dieser Datei überprüfen, und anhand des Fingerabdrucks können wir die Echtheit der Firmware überprüfen.

      Also, nun zur manuellen Erstellung des Fingerabdrucks (zum Spaß).

      ### Trezor-One Fingerabdruck-Erstellung

      Um den Trezor-One-Fingerabdruck zu erstellen, ist das Verfahren einfach. Man entfernt einfach den 256-Byte-Header (plus eins) und führt dann eine SHA256-Prüfsumme über den Rest aus. Der Header, den wir entfernen, ist bereits von Satoshi Labs signiert, so dass es keinen Grund zur Beunruhigung gibt, ihn zu verwerfen. Das Ergebnis ist das folgende Shell-Skript

      # Firmware herunterladen
      curl -O https://data.trezor.io/firmware/1/trezor-1.10.3.bin

      # Header (plus eins) entfernen | Prüfsummenergebnis
      tail -c +257 trezor-1.10.3.bin | sha256sum

      ### Trezor-T Fingerabdruck-Erholung

      Der Trezor-T ist ein bisschen komplizierter. Der TT-Fingerabdruck ist nichts anderes als der Hash (blake2s) des Firmware-Headers selbst. Dies ist ausreichend, da der Firmware-Header alle Hashes des Körpers enthält. Aber dies manuell zu tun (zum Spaß) erfordert etwas mehr Arbeit. Wir müssen jeden 128K Chunk hashen, während wir die Header entfernen. Dann können wir unsere manuellen Chunk-Hashes mit dem vergleichen, was physisch im Header steht. Wenn wir damit zufrieden sind, hacken wir einfach den Header (ohne Signaturen), um sicherzustellen, dass er mit dem Fingerabdruck übereinstimmt. Da beide Header ebenfalls signiert sind, brauchen wir uns nicht darum zu kümmern, sie beim Hashing der Chunks zu verwerfen.

      # Firmware herunterladen
      curl -O https://data.trezor.io/firmware/2/trezor-2.4.2.bin

      # Checksumme erster Chunk
      dd bs=512 skip=11 count=245 if=trezor-2.4.2.bin status=none | openssl blake2s256

      # Prüfsumme nächste 15 Chunks
      for i in {1..15}; do (dd bs=128K count=1 skip=$i if=trezor-2.4.2.bin status=none | openssl blake2s256); done

      # Dump der Blockprüfsummen im Firmware-Header
      xxd -ps -c 32 -s 4640 -l 512 trezor-2.4.2.bin

      # Prüfsumme Firmware-Header (sollte mit Fingerprint übereinstimmen)
      (dd if=trezor-2.4.2.bin bs=1 skip=4608 count=959; dd if=/dev/zero bs=1 count=65) 2> /dev/null | openssl blake2s256

      Anmerkung: `69217…0eef9` ist die Prüfsumme für `/dev/zero`. Null-Prüfsummen werden im Header weggelassen (offensichtlich).

      Mit Hilfe von `curl`, `tail`, `dd`, `sha256sum`, `openssl` und `xxd` sollten wir nun froh sein, dass bei der Verifizierung der Firmware nichts Verdächtiges passiert. Wenn wir weniger skeptisch sind, wird der Befehl `trezorctl firmware verify` all dies für uns erledigen. Und wenn Sie noch mehr Ausführlichkeit wollen, können Sie den [headertool.py](https://github.com/trezor/trezor-firmware/blob/v2.4.3/core/tools/headertool.py) Skript all dies und noch einiges mehr. Eine wirklich nette Funktion ist das „critical bugfix“-Flag, um zu wissen, wann Aktualisierungen wirklich notwendig sind.

      Aber wie ich schon sagte, ist das alles überflüssig und in keiner Weise erforderlich. Manchmal möchte ich einfach nur sehen, wie die Dinge zusammengesetzt sind.

Ansicht von 0 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.
Zur Werkzeugleiste springen