Epic: Security pathway hardening (S0–S7) #8
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
2026-05-26 — upstream pivot + sequencing decision
aiolabs/lnbits#9was reframed 2026-05-25 andaiolabs/lnbits#18was filed the same day. Two load-bearing changes:nsecbunkerd. Per-event handler logic gets simpler, not more complex.nsecbunkerdis the chosen sidecar. S7 in this repo therefore shrinks from 4–6 weeks to ~1 week of consumer-side wiring.Sub-issues updated:
signed_delegation_tokentobunker://connection URL; hard-blocked on lnbits#18.Sequencing decision (2026-05-26): wait for the bunker. No transitional S0 shim. lnbits#18 is expected soon; the standing rule about backwards-compat / pre-launch direction changes argues against throwing away seed-URL wiring we'd rewrite in two weeks. Sprint 1 starts with the unblocked work.
Context
v2-bitspireships a working ATM↔LNbits pathway, but the security model leans on one Nostr primitive (NIP-44 v2 transport encryption) and one stopgap: the operator's ownnseclives on the ATM disk. Money flows on the Lightning rail (cryptographically sound), but attribution flows onPayment.extra— mutable, unauthenticated metadata.Two real incidents on the branch surfaced this:
sintramachine with placeholder npubnpub1111…accepted a real cash-in because routing is purelywallet_id-keyed, not signed./var/lib/bitspire/.env. Physical ATM compromise = full operator-account compromise.Full state-of-the-union + design is in
docs/security-pathway-v1.md(in-repo, generated from~/.claude/plans/snug-gliding-shamir.md). Note: the design doc still references NIP-26; the §5/§6 references in the sub-issues are accurate for everything except S0/S2/S7 — those three need a follow-up doc edit reflecting the 2026-05-26 pivot.Trust model we want (one sentence)
Phases (revised)
bunker://URL)["expiration", now+5m]on all kind-21000 (NIP-40)sender_pubkeypersisted + HMAC over Payment.extra key fieldsGap IDs (G1–G10) map to the audit findings table in
docs/security-pathway-v1.md§4.2.Sequencing
Sprint 1 (everything unblocked, ship while waiting for lnbits#18): S1 + S5 + S3 + S4.
Sprint 2 (once lnbits#18 lands): S0 + S2 + S7 together — that's the full operator-IdP cutover and the cleanest security story.
Sprint 3: S6 + S8.
Sub-issues
LNbits-side trackers:
aiolabs/lnbits#14covers the LNbits primitives needed for S5/S6 (+ S1's expiration filter as defence in depth).aiolabs/lnbits#9— operator-IdP framing (the why behind S2/S7).aiolabs/lnbits#18— sidecar bunker integration (the how; S0/S2/S7 all depend on it).Audit-friendliness checklist
Tracked in §8 of the design doc. Today: 7/14 ✓. After S0–S7: 14/14 ✓.
Cross-references
aiolabs/lnbits#14andaiolabs/lnbits#9/aiolabs/lnbits#18.aiolabs/lamassu-next#44(Payment.extra split).Why this isn't just "add TLS pinning"
The Lamassu era answered "is this ATM real?" with a TLS cert fingerprint. We have Nostr — and so far we've used one knob of it. NIP-46 scoped tokens + NIP-57 receipts + NIP-78 fleet rosters give us delegated identity, signed settlement receipts, and operator-published fleet rosters — three independent cryptographic anchors instead of one shared-secret-style pin. Open-source‑auditable end to end.
Status 2026-06-16 — Sprint 2 unblocked
The
lnbits#18token-issuance primitive (NsecBunkerAdminClient.create_new_token+ policies) shipped onlnbitsdev, verified againstaiolabs/nsecbunkerd@fb1c239(see lnbits#18 status 2026-06-16). That was the hard blocker on S0 (#9) and S7 (#12).Starting S0 seed-URL pairing + the ATM-side bunker consumer (bitspire#52) now. Naming: this repo is
aiolabs/spirekeeper(split from satmachineadmin 2026-06-13).