Skip to the content.
yubiOS logo

yubiOS

FIDO2-first immutable OS โ€” YubiKey is the root of trust

๐Ÿฆด ๐Ÿšง Work In Progress ๐Ÿšง Work In Progress ๐Ÿšง Work In Progress ๐Ÿšง

License: LGPL-2.1 Status: Groundwork YubiKey 5 FIDO2

No TPM. No OEM. No trust anchors you don't control.


What it is

yubiOS fuses four lineages:

LayerInspirationWhat it gives us
particleos ethossystemd/particleosImmutable rootfs, UKI, dm-verity, composefs, systemd-boot
bootc designbootc-dev/bootcOCI image as OS delivery unit, day-2 upgrades via registry pull
Amutable visionLennart Poettering + systemd team"Integrity should be built into every critical infrastructure project" โ€” image-based OS, verifiable integrity, determinism as a default
YubiKey root of trustFIDO2 / PIV / OATHHardware-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
Registrydocker.io/0mniteck/yubios
Tags:latest + immutable :<commit-sha> per build
Platformslinux/amd64, linux/arm64
Supply chainSLSA build provenance + SBOM attestations attached
Published byyubiOS-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 firmware5.2.3 (ed25519-sk)
systemd261 (systemd-sbsign, systemd-cryptenroll FIDO2; v261 adds ConditionSecurity=measured-os, RestrictFileSystems=)
OpenSSH8.2 (FIDO2 key types)
pam-u2f1.3.1 (CVE-2025-23013 fix)
Platformx86-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