mirror of
https://github.com/block/buzz.git
synced 2026-10-27 04:30:52 +00:00
feat(desktop): store nsec private keys in the OS keyring (#1172)
Signed-off-by: Will Pfleger <pfleger.will@gmail.com> Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
This commit is contained in:
27
SECURITY.md
27
SECURITY.md
@@ -67,9 +67,30 @@ unless the subscriber is a member.
|
||||
### Append-Only Audit Log
|
||||
|
||||
All events are written to a tamper-evident audit log (`buzz-audit`). Each
|
||||
log entry is chained to the previous one via an HMAC, making retroactive
|
||||
modification detectable. The audit log is designed for SOX-grade compliance
|
||||
and eDiscovery.
|
||||
log entry is chained to the previous one via a SHA-256 hash chain. Because the
|
||||
chain is keyless, it is tamper-evident but not tamper-resistant: it detects
|
||||
accidental corruption or single-row edits, but an attacker with database write
|
||||
access can recompute the entire chain after editing. The audit log is designed
|
||||
for SOX-grade compliance and eDiscovery.
|
||||
|
||||
### Desktop Secret Storage — OS Keyring
|
||||
|
||||
The Buzz desktop app stores nsec private keys in the operating system keyring
|
||||
rather than in plaintext files: macOS Keychain, Windows Credential Manager, or
|
||||
the Linux Secret Service (`gnome-keyring` / `kwallet` via D-Bus). This covers
|
||||
both the human identity key and every managed-agent key.
|
||||
|
||||
On first launch after upgrading, existing plaintext keys are migrated into the
|
||||
keyring: the key is imported, read back to verify the round-trip, and only then
|
||||
is the plaintext deleted. Migration runs only when the keyring is reachable —
|
||||
if the backend is unavailable that session, the app keeps reading from the
|
||||
plaintext file and does **not** migrate, so a transient outage cannot resurrect
|
||||
a rotated key from a leftover file.
|
||||
|
||||
When no keyring backend is available (headless Linux with no Secret Service, for
|
||||
example), keys fall back to a `0o600` owner-only file. The `BUZZ_PRIVATE_KEY`
|
||||
environment variable, when set, always takes precedence over both stores — this
|
||||
is how harnessed agents and CI receive their identity.
|
||||
|
||||
### Input Validation
|
||||
|
||||
|
||||
Reference in New Issue
Block a user