- Status: Accepted (signature verification deferred — see "Revisiting")
- Date: 2026-05
- Deciders: Camera Node maintainers
A Camera Node binary reaches an operator's machine one of two ways:
- Pre-built download. The installer (
backend/scripts/install.shin the Command Center repo, served athttps://<cc>/install.shand run viacurl -fsSL … | bash) fetches the release asset fromhttps://github.com/SourceBox-LLC/Sentinel-CameraNode/releases/..., extracts it,chmod +x, and the operator runs it — often as a systemd service with camera + LAN access. - Source build. On platforms with no pre-built asset (Pi / aarch64
today), the installer
git clones the repo over HTTPS andcargo builds.
Integrity model today: transport is HTTPS end-to-end (GitHub API, release
asset, git clone, and the rustup bootstrap all use TLS), and trust rests on
(a) GitHub's release infrastructure and our release account, and (b) the
CC-served install.sh itself. There is no offline signature verification
of the downloaded binary.
Residual risk: an attacker who compromises the GitHub release / our
release account (or who can tamper with the CC-served install.sh) could ship
a malicious binary that runs with the node's privileges. HTTPS does not defend
against this — it protects the channel, not the artifact's provenance.
A checksum published alongside the binary does not close this gap: it travels over the same channel from the same release, so an attacker who can replace the binary can replace its checksum too. Only an offline signature (a key not present in the release pipeline's blast radius) provides real artifact provenance.
Ship with the HTTPS + GitHub-trust model for now; defer offline signature verification.
Rationale:
- At current scale (pre-PMF, payment processor in test mode, no paying customers, a tiny release/download surface) the likelihood of a compromised release is low and the blast radius is small.
- Real verification needs a maintainer-held signing keypair and the private key stored as a CI secret — neither of which can be created or held by anything other than the maintainer. It then requires changes across two repos (release signing + installer verification). That is disproportionate to the current risk and falls in the production-hardening bucket deliberately deferred until there's a real user base (see the project's pre-PMF stance).
Positive:
- No signing-key generation or secret management to operate today.
- The release pipeline and installer stay simple; source-build users are covered by git-over-HTTPS provenance already.
Negative:
- No protection against a compromised GitHub release or release account — the documented residual risk above. Accepted at current scale.
Neutral:
- Source builds inherit their provenance from the cloned git repo; only the pre-built-download path is affected by the missing signature.
Implement signature verification before any of:
- Leaving payment test mode / onboarding the first paying customers.
- Listing the HACS Home-Assistant component or the binary in any broad-distribution channel (HACS default store, a package manager).
- Any sign of release-account / supply-chain risk.
Implementation plan when revisited (ready to execute):
- Maintainer generates a signing keypair (e.g.
minisignorcosign) and stores the private key as a GitHub Actions secret in theSentinel-CameraNoderepo. release.yml: after building each binary, sign it and upload the detached signature (.minisig/.sig) as a release asset.install.sh(Command Center repo): embed the public key; after the download, fetch the signature and verify it beforechmod +x/ extract; abort loudly on verification failure. Source-build path unchanged.
backend/scripts/install.sh(Command Center repo) — the installer; downloads- extracts the release binary or builds from source.
release.yml— the Camera Node release workflow that would gain the signing step.- ADR 0002 (
0002-machine-id-encryption-key.md) — at-rest secret handling, the other half of the node's security posture.