diff --git a/CHANGELOG.md b/CHANGELOG.md index ecd2405..6f3e928 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +## v0.158.1 — security review of v0.158.0: the mkfs wrapper trusts no sibling claim; the internal-place helper fails closed (2026-10-16) + +**v0.158.0 is superseded — do not vouch it.** A security review of `912f7c1` found two defects; both fixed here, each test +seen failing against the 0.158.0 script: +- **`felhom-mkfs-guarded`**: 0.158.0 let a format through when a SIBLING part was mounted at /mnt/ AND under + /mnt/felhom-drives („Felhom's own drive"). That corroboration is a mount the agent can make itself, so a compromised agent + could unlock a host owner's disk — the exact case this root wrapper exists for. Removed: any mount of any node outside + /mnt/felhom-drives refuses again (now read from the kernel's mount table for every node; an unlistable disk refuses). + Consequence: the free part next to an in-use Felhom drive cannot be formatted — `CandidatePartition.Formattable` is false + for every part of a disk with a mounted node, and the controller does not offer it (a part with a filesystem can still be + USED). Pinned by configs/test_felhom_mkfs_guarded.py + partitions_test.go. +- **`felhom-internal-place`**: a failed `lvs` listing read as „nothing promised" (a too-large place) and a `blkid` error read + as „no signature" (the only gate before mkfs). Now: a failed listing, a listing without the pool, or any blkid exit other + than 0/2 REFUSES. Three new tests, all failing against 0.158.0. +- Released: tag `v0.158.1` (code `98f3cdd`), sha256 `20264df6…84b76a1`, bundle `c23c3d35…cb1c41b`. **Not vouched.** + ## v0.158.0 — the internal data place; partitions as places; add_internal_place (2026-10-16) Design: felhom.eu `architecture/16-storage-physical-identity.md` §5, §6, §7, §9 (operator rulings D3–D5; the D3 sizes @@ -17,12 +33,12 @@ ruled 2026-10-16 after the space check, felhom.eu `audits/storage-identity-build - **Partitions as places** (`internal/storage/partitions.go`): `GET /disks/candidates` lists each partition of a free disk as empty / filesystem / in_use. A data-bearing part's wipe id binds disk id + part number + fs-UUID (`byid:<…-partN>+fsuuid:`); both must name the same device at format time. -- **`felhom-mkfs-guarded`**: a SIBLING part that is Felhom's own drive (mounted raw at /mnt/ AND under - /mnt/felhom-drives) no longer blocks formatting the free part next to it; every other mount still refuses; an - unlistable disk now refuses (it passed before). First tests of the wrapper: `configs/test_felhom_mkfs_guarded.py`. +- **`felhom-mkfs-guarded`** (REVERTED in v0.158.1): a SIBLING part that is Felhom's own drive no longer blocked formatting + the free part next to it. First tests of the wrapper: `configs/test_felhom_mkfs_guarded.py`. - `configs/` changed (sudoers `FELHOM_INTERNALPLACE`, the helper, the wrapper, the bundle list) — **a config-bundle job is needed** with the agent update. **Not vouched** (the operator's act). -- Released: tag `v0.158.0` (code `912f7c1`), sha256 `a3589d1d…2caba`, bundle `17066273…fb5c76`. +- Released: tag `v0.158.0` (code `912f7c1`), sha256 `a3589d1d…2caba`, bundle `17066273…fb5c76`. **Superseded by v0.158.1 — + do not vouch** (its mkfs wrapper trusted a sibling claim the agent can fake; its helper failed open). ## v0.157.0 — every storage place knows its physical disk(s); POST /disks/same-disk (2026-10-15)