Context
PR #66 added minisign signing/verification for updater artifacts and, on the
client, wrapped the update source in RequiredSignedSource
(crates/openlogi-gui/src/platform/updater.rs) to make update checks fail closed
— a workaround for gpui-updater verifying only on a best-effort, opt-in basis.
A review of gpui-updater (the pinned v0.0.3 dependency) surfaced several
hardening gaps that must be fixed upstream. They are tracked there in
AprilNEA/gpui-updater#1. This issue tracks the OpenLogi-side follow-ups.
Follow-ups here (once upstream lands)
- High — Verification is fail-open; no way to require it.
- High — Manifest version↔artifact binding is unauthenticated → rollback /
substitution attack (a genuine, signed older build can be served as "new").
- Medium — Unbounded manifest/signature/artifact reads → DoS.
- Medium — HTTPS not enforced.
- Low — TOCTOU between verify and install.
- Low —
install() re-accepts unverified artifacts.
Related: #66
Context
PR #66 added minisign signing/verification for updater artifacts and, on the
client, wrapped the update source in
RequiredSignedSource(
crates/openlogi-gui/src/platform/updater.rs) to make update checks fail closed— a workaround for
gpui-updaterverifying only on a best-effort, opt-in basis.A review of
gpui-updater(the pinnedv0.0.3dependency) surfaced severalhardening gaps that must be fixed upstream. They are tracked there in
AprilNEA/gpui-updater#1. This issue tracks the OpenLogi-side follow-ups.
Follow-ups here (once upstream lands)
gpui-updaterpast the require-verification release and replace theRequiredSignedSourcewrapper withEngineConfig::verification(Verification::SignatureAndSha256)incrates/openlogi-gui/src/platform/updater.rs.comment, update the
Sign updater artifactsstep in.github/workflows/release.ymlto sign with
minisign -S -t "version=<v>;file=<name>"(it currently signswith
-Wand no-t, so the trusted comment is just a timestamp).without
OPENLOGI_UPDATE_MINISIGN_PUBLIC_KEYembedded, the updater now failsclosed by design, so those builds must surface "updates not available for this
build" rather than an update error.
Upstream gaps (summary — full detail in AprilNEA/gpui-updater#1)
substitution attack (a genuine, signed older build can be served as "new").
install()re-accepts unverified artifacts.Related: #66