yubiOS
FIDO2-first immutable OS โ YubiKey is the root of trust
๐ฆด ๐ง Work In Progress ๐ง Work In Progress ๐ง Work In Progress ๐ง
No TPM. No OEM. No trust anchors you don't control.
What it is
yubiOS fuses four lineages:
| Layer | Inspiration | What it gives us |
|---|---|---|
| particleos ethos | systemd/particleos | Immutable rootfs, UKI, dm-verity, composefs, systemd-boot |
| bootc design | bootc-dev/bootc | OCI image as OS delivery unit, day-2 upgrades via registry pull |
| Amutable vision | Lennart Poettering + systemd team | "Integrity should be built into every critical infrastructure project" โ image-based OS, verifiable integrity, determinism as a default |
| YubiKey root of trust | FIDO2 / PIV / OATH | Hardware-bound trust replacing TPM at every boundary |
Ecosystem alignment
In January 2026 the core systemd team and the engineers behind composefs, runc, Flatcar, ParticleOS, and Ubuntu Core founded Amutable with the mission:
"Deliver determinism and verifiable integrity to Linux workloads everywhere."
yubiOS is independently building toward the same architecture, with one additional constraint: the YubiKey replaces the TPM as the hardware root of trust at every layer. The "Fitting Everything Together" essay at 0pointer.net is the primary design reference for yubiOS โ hermetic /usr, DPS partitions, systemd-repart first-boot, A/B sysupdate, systemd-homed per-user encryption, and UKI + dm-verity trust chain.
Trust chain
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ YubiKey 5 โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ PIV slot 9c (CCID) Secure Boot signing โ
โ FIDO2 HMAC-secret Disk unlock (hidraw) โ
โ FIDO2 ed25519-sk SSH keys (hidraw) โ
โ FIDO2 U2F sudo/login (hidraw) โ
โ OATH TOTP App 2FA (hidraw) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ADR-002 note: Secure Boot signing uses PIV/CCID (via
systemd-sbsign+ PKCS#11), not hidraw. All other operations run on FIDO2 via/dev/hidraw*. Full rationale: ADR.md
Get yubiOS
yubiOS ships as a multi-arch bootc OCI image on Docker Hub โ this is the primary download.
Pull (auto-selects amd64 / arm64):
docker pull 0mniteck/yubios:latest
Pin by digest (reproducible โ recommended for installs):
docker pull 0mniteck/yubios@sha256:c965a816b9173cf6f227e6b5b09e321e841ab5f8a49075c112657a0a40b5e761
Install / upgrade with bootc:
sudo bootc install to-disk --source-imgref docker://0mniteck/yubios:latest /dev/nvme0n1
sudo bootc switch 0mniteck/yubios:latest && sudo bootc upgrade
| Registry | docker.io/0mniteck/yubios |
| Tags | :latest + immutable :<commit-sha> per build |
| Platforms | linux/amd64, linux/arm64 |
| Supply chain | SLSA build provenance + SBOM attestations attached |
| Published by | yubiOS-ci.yml merge-manifest job (current: run #113, bfbc38f) |
Building from source instead? See Quick start below.
Quick start
# Build the OCI image (per ADR-014: Docker Buildx, not Podman)
docker buildx build --policy reset=true,strict=true,filename=yubiOS.rego -t yubiOS .
# Install to disk (disable Secure Boot in UEFI first)
docker run --rm --privileged --pid=host \
-v /dev:/dev -v /var/lib/containers:/var/lib/containers \
yubiOS bootc install to-disk /dev/nvme0n1
# First boot: the enrollment wizard runs automatically
# Or launch it manually:
yubiOS-enroll
Enrollment wizard
On first boot yubiOS-enroll.service fires on tty1 and walks through:
โโโ Step 1/4: Secure Boot Signing โโโ
โโโ Step 2/4: Disk Encryption (FIDO2 hidraw) โโโ
โโโ Step 3/4: SSH Key (ed25519-sk resident) โโโ
โโโ Step 4/4: sudo / Login Auth (U2F pam-u2f) โโโ
Each step is skippable. Each script is independently re-runnable. See ONBOARDING.md.
Repo layout
yubiOS/
โโโ .github/workflows/ # CI: main build, ARM64 fTPM integration lanes, dhi manifest fetch
โ โโโ yubiOS-ci.yml # primary build+test+publish pipeline (merge-manifest -> Docker Hub)
โ โโโ ci_test-vm.yml # bcvk VM test suite (swtpm, swu2f)
โ โโโ ci_test-int.yml # ARM64 secure-world integration orchestrator
โ โโโ ci_int_stmm.yml # StandaloneMM (F1) lane
โ โโโ ci_int_optee_fip.yml # OP-TEE + TF-A FIP fold (F2) lane
โ โโโ ci_int_qemu.yml # QEMU e2e (F4) lane
โ โโโ fetch-dhi-manifest.yml # resolves dhi.io/debian-base INDEX digest
โโโ assets/
โ โโโ logo.png # you're looking at it
โ โโโ ci/vm-swtpm.conf # swtpm drop-in for bcvk CI VMs
โโโ mkosi.conf # mkosi build (particleos-style UKI + verity)
โโโ mkosi.conf.d/
โ โโโ desktop/mkosi.conf # GNOME desktop profile
โ โโโ minimal/mkosi.conf # minimal profile
โ โโโ surface-x86/mkosi.conf # Surface x86 profile
โ โโโ surface-arm64/mkosi.conf # Surface ARM64 profile
โ โโโ test/ # TEST-only profile: swu2f in-guest CTAP2 authenticator
โ โโโ mkosi.conf
โ โโโ install-swu2f-authenticator.sh
โโโ Containerfile # OCI image (bootc, Fedora base)
โโโ yubiOS.rego # OPA/Rego supply-chain Build Policy
โโโ renovate.json # digest-tracking automation (ADR-015)
โโโ refs/ # per-PR test/implementation specs
โ โโโ v261-base-image.md
โ โโโ sbsign-pkcs11-validate.md
โ โโโ luks-fido2-e2e-test.md
โ โโโ bcvk-swtpm-ci.md
โ โโโ arm64-ftpm-phase-f0.md
โโโ tests/
โ โโโ unit/ # bats unit tests (enroll-*, pam-u2f stack, lib)
โ โโโ fixtures/ # lsblk fixtures for LUKS detection tests
โ โโโ vm/ # bcvk VM test scripts (LUKS2 e2e, TPM PCR verify, ARM64 fTPM QEMU)
โ โโโ validate-pkcs11-uri.sh # PKCS#11 URI validation for PIV slot 9c
โ โโโ verify-uki-signature.sh # UKI signature verification
โโโ usr/lib/
โ โโโ bootc/install/ # bootc install config (systemd-boot, DPS)
โ โโโ bootc/kargs.d/ # persistent kernel args
โ โโโ dracut.conf.d/ # fido2 + composefs dracut modules for boot-time unlock
โ โโโ udev/rules.d/ # YubiKey hidraw + CCID uaccess rules
โ โโโ pam.d/ # PAM U2F sudo + system-auth config
โ โโโ repart/ # systemd-repart first-boot partition definitions
โ โโโ systemd/system/ # enrollment service unit
โ โโโ systemd/system-preset/ # enrollment service preset
โ โโโ systemd/homed.conf.d/ # homed FIDO2 defaults
โ โโโ yubiOS/ # enrollment scripts (sb, luks, homed, ssh, pam, totp, gpg, largeblob, backup) + lib.sh
โโโ ADR.md # architecture decision records
โโโ ARCHITECTURE.md # trust chain + build pipeline diagrams
โโโ SPEC.md # consolidated architecture + use-case specification
โโโ MISSION.md # project mission
โโโ MITIGATE.md # attack-surface -> control mapping (Faux Phy threat model)
โโโ FUTURE.md # post-launch ARM64-owned root of trust plan
โโโ ONBOARDING.md # step-by-step onboarding guide
โโโ PINNED.md # single source of truth for pinned digests/SHAs
โโโ BLOCKERS.md # open issue dependency map
โโโ TODO.md # known gaps + future work
โโโ AGENTS.md # guidance for AI coding agents working on this org
โโโ MAINTAINER.md # maintainer contact
โโโ CITATION.md # citation + primary-source references
Requirements
| Minimum | |
|---|---|
| YubiKey firmware | 5.2.3 (ed25519-sk) |
| systemd | 261 (systemd-sbsign, systemd-cryptenroll FIDO2; v261 adds ConditionSecurity=measured-os, RestrictFileSystems=) |
| OpenSSH | 8.2 (FIDO2 key types) |
| pam-u2f | 1.3.1 (CVE-2025-23013 fix) |
| Platform | x86-64 (primary); arm64/aarch64 (in development โ see ADR-017) |
Design decisions
quay.io/fedora/fedora-bootc:45 @sha256 (pinned base โ ADR-015; digest in PINNED.md)
|
+--------+---------------------+
v Containerfile v mkosi --profile yubios
rootless docker buildx UKI + dm-verity, signed via
--policy yubiOS.rego YubiKey PIV slot 9c (PKCS#11)
(supply-chain gate) |
+--------+---------------------+
v multi-arch OCI image (linux/amd64 + linux/arm64)
yubiOS-ci.yml . merge-manifest . SLSA provenance + SBOM attested
| docker push
v
+-------------------------------------------------+
| docker.io/0mniteck/yubios:latest | <== PRIMARY DOWNLOAD
| (+ immutable :<commit-sha> per build) |
+-------------------------------------------------+
| pull
+-------------+------------------+---------------------------------+
v bootc install v bootc switch + upgrade v bcvk
to-disk (bare metal) day-2 atomic update ephemeral VM / native-to-disk
| (test loop, USB YubiKey passthrough)
v first boot -> yubiOS-enroll.service -> YubiKey tap
+-------------+----------------------+------------------------------+
v PIV slot 9c (CCID) v FIDO2 (hidraw) v systemd-homed
Secure Boot signing LUKS2 disk unlock LUKS2 /home
(systemd-sbsign / PKCS#11) SSH ed25519-sk, pam-u2f +- SLOT 0 FIDO2 unlock
+- SLOT 1 recovery key
All decisions are recorded in ADR.md with sources.
The short version: TPM replaced by YubiKey everywhere it can be.
Main repository ยท SPEC.md ยท MISSION.md ยท ARCHITECTURE.md ยท MITIGATE.md