
tamago v1.26.5
Фреймворк для компиляции и выполнения Go-приложений на голых металлических процессорах, обеспечивающий безопасную разработку прошивок с уменьшенной поверхностью атаки за счет удаления зависимостей от ОС и C.
TamaGo - bare metal Go
tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.
Введение
TamaGo — это фреймворк, который позволяет компилировать и выполнять Go-приложения без внешних зависимостей на голом железе (AMD64, ARM, ARM64, RISCV64).
Проект возник из желания уменьшить поверхность атаки встроенного ПО, устранив любые зависимости времени выполнения от кода на C и операционных систем.
Фреймворк TamaGo состоит из следующих компонентов:
-
Модифицированная дистрибуция Go, расширяющая поддержку
GOOSдо целиtamago, позволяющая выполнение на голом железе через наложение runtime/goos, устанавливаемое с помощьюGOOSPKG. -
Пакеты Go для поддержки процессоров/SoC.
-
Пакеты Go для поддержки плат.
Модификации минимальны по сравнению с оригинальным компилятором Go, средой выполнения и целевым приложением (требуется один импорт), с четким отделением от других архитектур.
Большое внимание уделяется повторному использованию кода из существующих архитектур, уже включенных в стандартную среду выполнения Go, см. Внутреннее устройство.
Модификации обеспечивают полную поддержку стандартной библиотеки.
Такие аспекты продиктованы желанием предоставить фреймворк, позволяющий разрабатывать безопасные Go-прошивки для встроенных систем.
Текущие релизы
Следующие ссылки ведут к последним релизам
модифицированной дистрибуции Go TamaGo, добавляющей поддержку GOOS=tamago к соответствующей версии Go, и
библиотеки TamaGo:
Документация
Основная документация находится в вики проекта.
Документация API пакетов доступна на pkg.go.dev.
Поддерживаемые цели AMD64
В следующей таблице приведены поддерживаемые в настоящее время цели x86-64
(GOOS=tamago GOARCH=amd64).
| ЦП | Платформа | Пакет ЦП | Пакет платформы |
|---|---|---|---|
| AMD/Intel 64-bit | Cloud Hypervisor | amd64 | cloud_hypervisor/vm |
| AMD/Intel 64-bit | Firecracker microvm | amd64 | firecracker/microvm |
| AMD/Intel 64-bit | QEMU microvm | amd64 | qemu/microvm |
| AMD/Intel 64-bit | UEFI | amd64 | uefi/x64 |
| AMD/Intel 64-bit | Google Compute Engine | amd64 | google/gcp, uefi/x64 |
Поддерживаемые цели ARM
В следующей таблице приведены поддерживаемые в настоящее время SoC и платы ARM
(GOOS=tamago GOARCH=arm).
| SoC | Плата | Пакет SoC | Пакет платы |
|---|---|---|---|
| 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 |
Поддерживаемые цели ARM64
В следующей таблице приведены поддерживаемые в настоящее время SoC и платы ARM64
(GOOS=tamago GOARCH=arm64).
| SoC | Плата | Пакет SoC | Пакет платы |
|---|---|---|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
Поддерживаемые цели RISC-V
В следующей таблице приведены поддерживаемые в настоящее время SoC и платы RISC-V
(GOOS=tamago GOARCH=riscv64).
| SoC | Плата | Пакет SoC | Пакет платы |
|---|---|---|---|
| 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 |
Цели пользовательского пространства
Выполнение программ, скомпилированных с GOOS=tamago, также может происходить в пользовательском пространстве путем импорта любого пакета, который реализует необходимое наложение runtime/goos с контролем ОС вместо драйверов голого железа.
Компиляция и запуск Go-программ в пользовательском пространстве с GOOS=tamago дает преимущество изоляции системных вызовов, так как исполняемый файл не может использовать среду выполнения Go для прямого доступа к ресурсам ОС, что приводит к:
- изоляция от файловой системы ОС через эмулируемый в памяти диск
- изоляция от сетевых возможностей ОС, см. net.SocketFunc
- API для пользовательских обработчиков сети, ГСЧ и времени
В следующей таблице приведены поддерживаемые в настоящее время цели пользовательского пространства:
| Операционная система | GOARCH | Пакеты среды выполнения |
|---|---|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |
¹ Используется для запуска тестов стандартной дистрибуции и go test -tags user_linux
Компиляция
Дистрибуция Go с поддержкой GOOS=tamago
Команда tamago
загружает, компилирует и запускает команду go из
дистрибуции TamaGo, соответствующей версии модуля tamago из go.mod приложения.
Приложения могут добавить github.com/usbarmory/tamago в go.mod, а затем заменить команду go на:
go run github.com/usbarmory/tamago/cmd/tamago
или добавить следующую строку в go.mod, чтобы использовать go tool tamago в качестве команды go:
tool github.com/usbarmory/tamago/cmd/tamago
В качестве альтернативы последнюю дистрибуцию TamaGo можно собрать вручную или использовать последний бинарный релиз:
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
Сборка приложений
При компиляции необходимо установить переменную окружения Go GOOSPKG, чтобы включить эту библиотеку как наложение для поддержки GOOS=tamago.
export GOOSPKG=github.com/usbarmory/tamago
Go-приложения должны импортировать соответствующий пакет платы, чтобы обеспечить инициализацию оборудования и поддержку времени выполнения:
import (
// Пример для USB armory Mk II
_ "github.com/usbarmory/tamago/board/usbarmory/mk2"
)
Go-приложения могут быть скомпилированы компилятором, собранным на предыдущем шаге, с добавлением нескольких флагов/переменных:
# установите эту библиотеку как наложение `runtime/goos`
export GOOSPKG=github.com/usbarmory/tamago
# Пример для Cloud Hypervisor, QEMU и Firecracker KVM
GOOS=tamago GOARCH=amd64 ${TAMAGO} build -ldflags "-T 0x10010000 -R 0x1000" main.go
# Пример для NXP i.MX6UL
GOOS=tamago GOARM=7 GOARCH=arm ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Пример для NXP 8MPLUSLPD4-EVK
GOOS=tamago GOARCH=arm64 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Пример для SiFive FU540
GOOS=tamago GOARCH=riscv64 ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Пример для AI Foundry Erbium
GOOS=tamago GOARCH=riscv64 GOSOFT=1 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Пример для пользовательского пространства Linux
GOOS=tamago ${TAMAGO} build main.go
Смотрите файл README соответствующего пакета платы для информации о компиляции для каждой конкретной цели.
Теги сборки
Следующие теги сборки позволяют приложениям переопределять собственное определение пакета для наложения runtime/goos:
linkramstart: переопределитьramStartlinkramsize: переопределитьramSizelinkprintk: переопределитьprintklinkcpuinit: переопределитьcpuinittiny: уменьшить требования к выделению кучи
Выполнение и отладка
Смотрите файл README соответствующего пакета платы для информации о выполнении и отладке для каждой конкретной цели (реальной или эмулируемой).
Пример приложения предоставляет образцы использования драйвера и инструкции как для нативного, так и для эмулированного выполнения.
Эмулированный запуск примера приложения можно выполнить следующим образом:
git clone https://github.com/usbarmory/tamago-example
cd tamago-example && make qemu
Приложения, использующие TamaGo
- go-boot — менеджер загрузки UEFI на голом железе Go
- GoKey — смарт-карта на голом железе Go
- GoTEE — доверенная среда выполнения Go
- ArmoredWitness — кросс-экосистемная сеть свидетелей
- armory-drive — зашифрованный USB-накопитель
- armory-ums — прошивка USB Mass Storage
- armory-boot — загрузчик USB armory
- tamago-example — пример приложения TamaGo
- tamago-sev-example — пример конфиденциальной ВМ (AMD SEV-SNP)
- kotama — крошечный демонстратор цели RISC-V
- kanzashi — агент голого железа
Внешние драйверы, использующие TamaGo
- go-net — универсальный сетевой драйвер
- go-net/imx-usb — драйвер i.MX Ethernet через USB
- go-net/virtio — сетевой драйвер VirtIO
- imx-usbserial — драйвер i.MX последовательного порта через USB
Дополнительные ресурсы
- API пакетов
- API среды выполнения
- Совместимость
- Внутреннее устройство
- Часто задаваемые вопросы (FAQ)
- Презентации: TamaGo, ArmoredWitness
Сопровождающие
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
Лицензия
tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.
Этот проект распространяется под лицензией BSD, находящейся в файле LICENSE.
Логотип TamaGo адаптирован из горефера Go, разработанного Renee French и лицензированного под лицензией Creative Commons 3.0 Attributions. Векторная иллюстрация Go Gopher выполнена Hugo Arganda.