v0.3.0 — Security hardening
Security review follow-up: seven findings fixed (see per-commit detail).
Fixes
- GPG signing oracle — the approval prompt/notification/UI now derive the displayed author/committer/message from the exact commit bytes being signed (WYSIWYS); client display fields are discarded.
- Login token amplification — the session cookie is now an independent, revocable server-side session ID (never the master token), and the login link is single-use.
- Batch
GetSecrets— every item in a batch is authorized, not just the first; deny fires on any in-scope item, approve/auto-approve only when all items are covered. - Ephemeral auto-approve — keyed on the non-spoofable invoker
/proc/exe, not the spoofable comm. trusted_signerssilent path — gated on the request arriving through our own gpg-sign thin client, so forged repo/file fields can't obtain a silent signature. Any-ancestorexe_pathmatching (e.g. an editor) is preserved.process.unitmatcher — now matches the caller's real systemd unit (viaGetUnitByPID);namedocumented as advisory (spoofable comm).- Notification markup injection — all client-controlled fields are HTML-escaped in the notification body.
Breaking / behavior changes
- API wire rename:
sender_info.unit_name→sender_info.invoker_name, plus a newsystemd_unitfield. Affects only custom clients of the local API; the bundled web UI is updated. - A daemon restart now invalidates existing browser sessions (in-memory sessions) — re-login required.
unit:trust rules now match the real systemd unit rather than the process comm.