
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 | https://github.com/usbarmory/tamago
Copyright (c) Les Auteurs de TamaGo. Tous droits réservés.
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 cible tamago, permettant une exécution sur métal nu via un overlay runtime/goos défini par GOOSPKG.
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.
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 :
La documentation principale se trouve sur le wiki du projet.
La documentation de l'API des paquets se trouve sur pkg.go.dev.
Le tableau suivant résume les cibles x86-64 actuellement supportées (GOOS=tamago GOARCH=amd64).
Le tableau suivant résume les SoC et cartes ARM actuellement supportés (GOOS=tamago GOARCH=arm).
Le tableau suivant résume les SoC et cartes ARM64 actuellement supportés (GOOS=tamago GOARCH=arm64).
Le tableau suivant résume les SoC et cartes RISC-V actuellement supportés (GOOS=tamago GOARCH=riscv64).
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 :
Le tableau suivant résume le support espace utilisateur actuellement disponible :
¹ Utilisé pour exécuter les tests de distribution standard et go test -tags user_linux
GOOS=tamagoLa 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
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.
Les tags de construction suivants permettent aux applications de remplacer la définition propre du paquet pour l'overlay runtime/goos :
linkramstart: override ramStartlinkramsize: override ramSizelinkprintk: override printklinkcpuinit: override cpuinittiny : réduire les besoins d'allocation du heapConsultez 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
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
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.
| 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 |
| 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 |
| SoC | Carte | Paquet SoC | Paquet carte |
|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
| 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 |
| Système d'exploitation | GOARCH | Paquets runtime |
|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |