
tamago v1.26.6
Framework pour compiler et exécuter des applications Go sur des processeurs bare metal, permettant un développement de firmware sécurisé avec une surface d'attaque réduite grâce à la suppression des dépendances OS et C.
TamaGo - Go sur métal nu
tamago | https://github.com/usbarmory/tamago
Copyright (c) Les Auteurs de TamaGo. Tous droits réservés.
Introduction
TamaGo est un framework qui permet la compilation et l'exécution d'applications Go non entravées sur des processeurs en métal nu (AMD64, ARM, ARM64, RISCV64).
Le projet est né du désir de réduire la surface d'attaque des firmwares de systèmes embarqués en supprimant toute dépendance d'exécution sur du code C et des systèmes d'exploitation.
Le framework TamaGo se compose des composants suivants :
-
Une distribution Go modifiée qui étend le support
GOOSà la cibletamago, permettant une exécution sur métal nu via un overlay runtime/goos défini parGOOSPKG. -
Des paquets Go pour le support des processeurs/SoC.
-
Des paquets Go pour le support des cartes.
Les modifications sont minimes par rapport au compilateur Go original, au runtime et à l'application cible (une importation requise), avec une séparation nette des autres architectures.
Un accent fort est mis sur la réutilisation du code des architectures existantes déjà incluses dans le runtime Go standard, voir Internals.
Les modifications maintiennent un support complet de la bibliothèque standard.
Ces aspects sont motivés par le désir de fournir un framework permettant un développement sécurisé de firmware Go sur des systèmes embarqués.
Versions actuelles
Les liens suivants sont les dernières versions de la distribution Go modifiée TamaGo, qui ajoute le support GOOS=tamago à la version Go correspondante, et de la bibliothèque TamaGo :
Documentation
La documentation principale se trouve sur le wiki du projet.
La documentation de l'API des paquets se trouve sur pkg.go.dev.
Cibles AMD64 supportées
Le tableau suivant résume les cibles x86-64 actuellement supportées (GOOS=tamago GOARCH=amd64).
| CPU | Plateforme | Paquet CPU | Paquet plateforme |
|---|---|---|---|
| AMD/Intel 64 bits | Cloud Hypervisor | amd64 | cloud_hypervisor/vm |
| AMD/Intel 64 bits | Firecracker microvm | amd64 | firecracker/microvm |
| AMD/Intel 64 bits | QEMU microvm | amd64 | qemu/microvm |
| AMD/Intel 64 bits | UEFI | amd64 | uefi/x64 |
| AMD/Intel 64 bits | Google Compute Engine | amd64 | google/gcp, uefi/x64 |
Cibles ARM supportées
Le tableau suivant résume les SoC et cartes ARM actuellement supportés (GOOS=tamago GOARCH=arm).
| SoC | Carte | Paquet SoC | Paquet carte |
|---|---|---|---|
| NXP i.MX6ULZ/i.MX6UL | USB armory Mk II | imx6ul | usbarmory/mk2 |
| NXP i.MX6ULL/i.MX6UL | USB armory Mk II LAN | imx6ul | usbarmory/mk2 |
| NXP i.MX6ULL/i.MX6ULZ | MCIMX6ULL-EVK | imx6ul | mx6ullevk |
| Broadcom BCM2835 | Raspberry Pi Zero | bcm2835 | pi/pizero |
| Broadcom BCM2835 | Raspberry Pi 1 Model A+ | bcm2835 | pi/pi1 |
| Broadcom BCM2835 | Raspberry Pi 1 Model B+ | bcm2835 | pi/pi1 |
| Broadcom BCM2836 | Raspberry Pi 2 Model B | bcm2835 | pi/pi2 |
| Nuvoton NUC980 | NuMaker-IIoT-NUC980G2 | nuc980 | nuc980iiot |
Cibles ARM64 supportées
Le tableau suivant résume les SoC et cartes ARM64 actuellement supportés (GOOS=tamago GOARCH=arm64).
| SoC | Carte | Paquet SoC | Paquet carte |
|---|---|---|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
Cibles RISC-V supportées
Le tableau suivant résume les SoC et cartes RISC-V actuellement supportés (GOOS=tamago GOARCH=riscv64).
| SoC | Carte | Paquet SoC | Paquet carte |
|---|---|---|---|
| SiFive FU540 | QEMU sifive_u | fu540 | qemu/sifive_u |
| AI Foundry Erbium | erbium_emu | erbium | erbium_emu |
| AI Foundry ET-SoC-1 | sys_emu | etsoc1 | sys_emu |
Cibles espace utilisateur
L'exécution de programmes compilés avec GOOS=tamago peut également avoir lieu dans l'espace utilisateur en important tout paquet qui implémente l'overlay runtime/goos requis avec une supervision du système d'exploitation au lieu de pilotes sur métal nu.
La compilation et l'exécution de programmes Go dans l'espace utilisateur en tant que GOOS=tamago offrent l'avantage de l'isolation des appels système, car l'exécutable ne peut pas utiliser le runtime Go pour accéder directement aux ressources du système d'exploitation, ce qui donne :
- isolation du système de fichiers du système d'exploitation, via un disque émulé en mémoire
- isolation du réseau du système d'exploitation, voir net.SocketFunc
- API pour des gestionnaires réseau, rng, temps personnalisés
Le tableau suivant résume le support espace utilisateur actuellement disponible :
| Système d'exploitation | GOARCH | Paquets runtime |
|---|---|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |
¹ Utilisé pour exécuter les tests de distribution standard et go test -tags user_linux
Compilation
Distribution Go supportant GOOS=tamago
La commande tamago télécharge, compile et exécute la commande go de la distribution TamaGo correspondant à la version du module tamago dans le go.mod de l'application.
Les applications peuvent ajouter github.com/usbarmory/tamago à go.mod, puis remplacer la commande go par :
go run github.com/usbarmory/tamago/cmd/tamago
ou ajouter la ligne suivante à go.mod pour utiliser go tool tamago comme commande go :
tool github.com/usbarmory/tamago/cmd/tamago
Alternativement, la dernière distribution TamaGo peut être construite manuellement ou la dernière version binaire peut être utilisée :
wget https://github.com/usbarmory/tamago-go/archive/refs/tags/latest.zip
unzip latest.zip
cd tamago-go-latest/src && ./all.bash
cd ../bin && export TAMAGO=`pwd`/go
Construction d'applications
Lors de la compilation, la variable d'environnement Go GOOSPKG doit être définie pour activer cette bibliothèque comme overlay afin de supporter GOOS=tamago.
export GOOSPKG=github.com/usbarmory/tamago
Les applications Go sont tenues d'importer le paquet de carte approprié pour garantir que l'initialisation matérielle et le support du runtime aient lieu :
import (
// Example for USB armory Mk II
_ "github.com/usbarmory/tamago/board/usbarmory/mk2"
)
Les applications Go peuvent être compilées avec le compilateur construit à l'étape précédente, avec l'ajout de quelques flags/variables :
# set this library as `runtime/goos` overlay
export GOOSPKG=github.com/usbarmory/tamago
# Example for Cloud Hypervisory, QEMU and Firecracker KVMs
GOOS=tamago GOARCH=amd64 ${TAMAGO} build -ldflags "-T 0x10010000 -R 0x1000" main.go
# Example for NXP i.MX6UL
GOOS=tamago GOARM=7 GOARCH=arm ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Example for NXP 8MPLUSLPD4-EVK
GOOS=tamago GOARCH=arm64 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Example for SiFive FU540
GOOS=tamago GOARCH=riscv64 ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Example for AI Foundry Erbium
GOOS=tamago GOARCH=riscv64 GOSOFT=1 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Example for Linux userspace
GOOS=tamago ${TAMAGO} build main.go
Consultez le fichier README du paquet de carte respectif pour les informations de compilation pour chaque cible spécifique.
Tags de construction
Les tags de construction suivants permettent aux applications de remplacer la définition propre du paquet pour l'overlay runtime/goos :
linkramstart: overrideramStartlinkramsize: overrideramSizelinkprintk: overrideprintklinkcpuinit: overridecpuinittiny: réduire les besoins d'allocation du heap
Exécution et débogage
Consultez le fichier README du paquet de carte respectif pour les informations d'exécution et de débogage pour chaque cible spécifique (réelle ou émulée).
L'application exemple fournit un exemple d'utilisation du pilote et des instructions pour l'exécution native et émulée.
Une exécution émulée de l'application exemple peut être lancée comme suit :
git clone https://github.com/usbarmory/tamago-example
cd tamago-example && make qemu
Applications utilisant TamaGo
- go-boot - le gestionnaire de démarrage UEFI Go sur métal nu
- GoKey - la carte à puce Go sur métal nu
- GoTEE - Go Trusted Execution Environment
- ArmoredWitness - réseau de témoin inter-écosystème
- armory-drive - lecteur USB crypté
- armory-ums - firmware de stockage de masse USB
- armory-boot - chargeur de démarrage USB armory
- tamago-example - application exemple TamaGo
- tamago-sev-example - exemple de VM confidentielle (AMD SEV-SNP)
- kotama - démonstrateur de cible RISC-V miniature
- kanzashi - Agent sur métal nu
Pilotes externes utilisant TamaGo
- go-net - Pilote réseau générique
- go-net/imx-usb - Pilote i.MX Ethernet over USB
- go-net/virtio - Pilote réseau VirtIO
- imx-usbserial - Pilote i.MX Serial over USB
Ressources supplémentaires
- API des paquets
- API du runtime
- Compatibilité
- Fonctionnement interne
- FAQ
- Présentations : TamaGo, ArmoredWitness
Mainteneurs
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
Licence
tamago | https://github.com/usbarmory/tamago
Copyright (c) Les Auteurs de TamaGo. Tous droits réservés.
Ce projet est distribué sous la licence de type BSD trouvée dans le fichier LICENSE.
Le logo TamaGo est adapté du gopher Go conçu par Renee French et sous licence Creative Commons 3.0 Attribution. Illustration vectorielle du gopher Go par Hugo Arganda.