--- _class: lead paginate: true backgroundColor: #fff --- ![bg left:38% 80%](img/stagex-logo.png) # Easier supply chain security A container-native, full-source-bootstrapped, reproducible, and multi-signed toolchain to build all the things. --- # Do you know who built your base image? ```dockerfile FROM trusted/distro RUN pkg install openssl ENTRYPOINT ["/usr/bin/openssl"] CMD ["rand", "-hex", "12"] ```
```sh > docker build -t local/randtest -f Containerfile . > docker run local/randtest 2a2a2a2a2a2a2a2a2a2a2a2a > docker run local/randtest 2a2a2a2a2a2a2a2a2a2a2a2a ``` Woops, someone included libfakerand!
![width: auto](img/demo-auto.gif)
--- # Problem Statement ## Build software without expecting users to trust any single human or computer.





We really didn't want to make yet another Linux distro. Sadly, nothing we evaluated fit our threat model. --- Let's first break down the buzzword bingo:

## Stagex is a container-native, full-source-bootstrapped, reproducible, and multi-signed toolchain to build all the things. --- # Container-native - Most sysadmins today do everything in containers - Most release engineers today build everything in containers - OCI container spec solves the problems of most linux package managers - OCI syntax allows for very succinct and simple package definitions - OCI has many competing implementations, and this is a good thing! - OCI has official support for multiple signatures, and signing policies - Every stagex package is just an OCI layer, which can be hash locked --- ### Our actual BC "package" is just OCI layers all the way down ```dockerfile FROM scratch AS build ARG VERSION COPY --from=stagex/core-busybox . / COPY --from=stagex/core-gcc . / COPY --from=stagex/core-binutils . / COPY --from=stagex/core-make . / COPY --from=stagex/core-musl . / COPY --from=fetch . . RUN tar -xf sed-${VERSION}.tar.xz WORKDIR /sed-${VERSION} RUN --network=none <<-EOF set -eux ./configure --prefix=/usr make -j "$(nproc)" make DESTDIR=/rootfs install EOF FROM stagex/core-filesystem AS package COPY --from=build /rootfs/ / ``` --- # Full source bootstrapped TL;DR: Solve Ken Thompsan's Trusting Trust problem: - Stage 0: Bootstrap primitive binaries from 256 bytes of hex0 - Stage 1: Bootstrap all the way up to x86 GCC - Stage 2: Build GCC cross compiler toolchain - Stage 3: Building a native hosted GCC toolchain - Stage X: Build whatever you want Only possible because of heroic work by the Bootstrappable Builds team! --- ### Stage0: Build bootstrap seeds with self hosting hex0 "compiler" ```hex 0000000 457f 464c 0101 0301 0000 0000 0000 0000 0000010 0002 0003 0001 0000 804c 0804 002c 0000 0000020 0000 0000 0000 0000 0034 0020 0001 0000 0000030 0000 0000 8000 0804 8000 0804 00b5 0000 0000040 00b5 0000 0001 0000 0001 0000 5b58 315b 0000050 6ac9 5805 cd99 5b80 6650 41b9 6602 c0ba 0000060 6a01 5805 80cd 4299 3197 89ed 4ed6 895b 0000070 6ae1 5803 80cd 8553 75c0 4005 db31 80cd 0000080 018a 0a3c e574 f685 e475 233c df74 3b3c 0000090 db74 302c 0a2c 0872 072c df24 073c ce73 00000a0 e5c1 0404 010a f7c5 7cdf 89c3 8929 b0fb 00000b0 cd04 eb80 00b4 00000b5 ``` It makes more sense with comments: https://github.com/oriansj/stage0-posix-x86/blob/master/hex0_x86.hex0 --- ### Stage1: Bootstrap up to x86 gcc toolchain from bootstrap seeds It is basically building up from the 1970s all over again - Step 1: hex0 - Step 9: M0 C (cc_x86) - Step 19: scheme (GNU Mes) - Step 20: ~C99 C (Tinycc) - Step 56: perl 5x - Step 83: gcc 4x - Step 148: python 2x - Step 158: gcc 13x (still x86) Full steps: https://github.com/fosslinux/live-bootstrap/blob/master/parts.rst --- ### Stage2: Pivot from x86 -> $TARGET cross toolchain It is not that exciting. - Step 1: Build cross binutils - Step 2: Build minimal cross gcc (without libgcc) - Step 3: Build libgcc against musl headers - Step 4: Build musl - Step 5: Build rest of gcc --- ### Stage3: Build native $TARGET toolchain Also not that exciting. - Step 1: Build musl - Step 2: Build binutils - Step 3: Build make - Step 4: Build gcc - Step 5: Build busybox This covers "full source bootstrapped" Now we can talk about what we mean by reproducible. --- # Reproducible - 100% reproducible with no compromises - Must be easy and doable at any time: Clone our repo and run "make" - We disagree with the metrics most distros use for reproducibility - Requiring a non-reproducible binary to acheive reproduction, is cheating - We build -everything- from 0. Rust, random firmware blobs in qemu. Everything.

( In fairness, ignoring desktop use cases has made these goals a -lot- easier.) --- # Multi-signed * Centralized Trust is dangerous * Distributed Trust is maybe even more dangerous * We went with Decentralized trust: trust a quorum, not any individual. * Sign every commit with a hardware token * Sign every review with a hardware token * Sign every reproductions on diverse systems with a hardware token * Reproduce and submit your own signatures for the whole tree at any time! ![bg right:35% 80%](https://mermaid.ink/svg/pako:eNptUstugzAQ_BVrzyQU0-ZBpR7S9lhVKr2FHIy9gCuDkbFTRYh_ryFVgtL6YO_OjHdk7_bAtUBIoFD6m1fMWPK5yxri185JJaL9dBzIYvFEPrA1WjiO0f4SHmZi-q-Y_hFf60zKVJZNtB_3W55eeDrnpwu_JgpZh1eYzmEIoEZTMyn8A_tRlIGtsMYMEh8qWVY2g2BGPKfpmVsqlqMihTboq77nX8gt6Yk-ohl_KiFH2clc4SMZMsiawVsxZ3V6ajgk1jgMwGhXVpAUTHU-c61gFl8kKw2rb9BXIa02F1BpJtCnPdhTO_amlJ31Blw3hSxH3Bnl4cratkvCcKSXpbSVy5dc12EnxdjI6rhdhSu62jAa42ods4c4FjyPtpuC3keFWN9FlMEwBICT_9t5EKZ5GH4Asmmvxw) --- # Decentralized Trust Multiple maintainers can each sign individual images, so OCI runtime policies can enforce _multiple_ signatures by maintainers to ensure no individual maintainer could have tampered with an image. [![](https://mermaid.ink/svg/pako:eNpdklFrgzAQx79KuGdbV91s62DQpmNPZbDube4hJqdmRFNi7Cjid1-sa7EGAvn_f3c5LpcWuBYIMWRK__KCGUs-d0lF3NpvvvZMVtZtNGTzTWazF_Km_-F2DLcTSMeQTuBmkJReb5poOtFD_EdT27uEkUFvBnhQoimZFK6ltscJ2AJLTCB2RyXzwibgjQA9HAY2VyxFRTJtUObVe_qD3JKW6BOa_m1icpK1TBU-ky6BpOpcKdZYfThXHGJrGvTA6CYvIM6Yqp1qjoJZ3EmWG1ZeQwbzVUirzS1SaSbQyRbs-dgPI5eXVriuMpn3fmOUswtrj3Xs-z2e59IWTTrnuvRrKfrJFad15EdBtGJBiNEyZE9hKHi6WK-y4HGRieXDImDQdR7gpf5-mPzlA3R_HuyhBw)](https://mermaid.ink/svg/pako:eNpdklFrgzAQx79KuGdbV91s62DQpmNPZbDube4hJqdmRFNi7Cjid1-sa7EGAvn_f3c5LpcWuBYIMWRK__KCGUs-d0lF3NpvvvZMVtZtNGTzTWazF_Km_-F2DLcTSMeQTuBmkJReb5poOtFD_EdT27uEkUFvBnhQoimZFK6ltscJ2AJLTCB2RyXzwibgjQA9HAY2VyxFRTJtUObVe_qD3JKW6BOa_m1icpK1TBU-ky6BpOpcKdZYfThXHGJrGvTA6CYvIM6Yqp1qjoJZ3EmWG1ZeQwbzVUirzS1SaSbQyRbs-dgPI5eXVriuMpn3fmOUswtrj3Xs-z2e59IWTTrnuvRrKfrJFad15EdBtGJBiNEyZE9hKHi6WK-y4HGRieXDImDQdR7gpf5-mPzlA3R_HuyhBw) --- | Distro | Trust Model | OCI | Packaging | Bootstrapped | Reproducible | |-----------|---------------|-----------|--------------|--------------|--------------| | Stagex | Decentralized | Native | Declarative | Yes | Yes | | Guix | Distributed | Exported | Declarative | Yes | Mostly | | Debian | Distributed | Published | Imperative | No | Mostly | | Arch | Distributed | Published | Imperative | No | Mostly | | Nix | Centralized | Exported | Declarative | Partial | Mostly | | Yocto | Centralized | Exported | Source Only | No | Mostly | | Buildroot | Centralized | Exported | Source Only | No | Mostly | | Alpine | Centralized | Published | Imperative | No | No | | Fedora | Centralized | Published | Imperative | No | No | --- # TL;DR: Give everyone a shorter path to better supply chain security
### A reproducible full source bootstrapped Containerfile for a rust project:
```dockerfile ARG RUST_VERSION FROM stagex/pallet-rust@${RUST_VERSION} AS build ADD src/ . ENV RUSTFLAGS='-C target-feature=+crt-static' RUN cargo build --release --target-dir . FROM stagex/filesystem AS package COPY --from=build hello /usr/bin/hello CMD ["/usr/bin/hello"] ``` --- # Common toolchain dependencies StageX comes with developer-loved tooling and languages, such as: - `rust` - `go` - `python` - `curl` - `git` If you are interested in additionally software being added feel free to open a PR or let us know what you would like to see added. --- # Key Takeaways * StageX packages the software you're already using, securely. * By leveraging OCI (Docker, podman, etc), we avoid mixing package managers and build contexts. * Your software, at every point in the bootstrapped toolchain, can all be built deterministically. --- # What's Next? * Packaging more software and updating existing software faster * Adding additional container runtimes like Podman and Kaniko * Adding additional chip architecture support such as ARM and RISC-V * Crosschains: Cross compiler packages so you can target any arch from your native arch * Mirrors: Much more maintainable source/mirror management in review * Pallets: sets of deps to be imported/locked with one line * Boxes: Easily output stagex builds as bootable ISO images, firmware, packages for other distros, etc --- # Links **Matrix Chat**: #stagex:matrix.org **Git Repo**: https://codeberg.org/stagex/stagex **Slides**: https://git.distrust.co/public/presentations **ReprOS**: https://codeberg.org/stagex/repros **AirgapOS**: https://git.distrust.co/public/airgap **EnclaveOS**: https://git.distrust.co/public/enclaveos **Keyfork**: https://git.distrust.co/public/keyfork Big thank you to sponsors who have supported the development of this project: **Turnkey, Distrust, Mysten Labs**