counter-sign 0.1.3
Pre-release
Pre-release
counter-sign 0.1.3 — security hardening
Supersedes v0.1.2, which contains an authorization-bypass BLOCKER. Upgrade.
Hardened through two adversarial reviews before going public: a five-front internal red-team, then an independent second-engine pass (OpenAI Codex, adversarial), re-reviewed until it returned approve — "no confirmed material authorization or timeout bypass remains." The cryptographic core held throughout; every fix ships with a regression test (120 total).
Fixed
- BLOCKER — authorization bypass.
verifyResolutiongated its quorum check on the attacker-suppliedresolution.policy; apolicy:"default"approve with a single authority-signed receipt authorized any quorum-N Intent (ran a 3-of-3 deploy with 0 human approvals). Now enforced for every approve; each receipt's decision must match. - Named
approversare enforced — an unlisted channel member's click is ignored (membership is not authority), at bothsettleandverifyResolution. - Timeout correctness — the deadline is enforced in
awaitWithDefault(andsettle), so a late decision after an event-loop stall can't beat the signed Default; the reaper no longer breaks the arbitration. - Webhooks fail closed —
WHATSAPP_APP_SECRETandTELEGRAM_WEBHOOK_SECRETrequired (constant-time); Telegram keys on the stable numeric id; oversized bodies are caught. - DoS —
readBodysize-capped;PendingDecisionsreaps at the deadline; Intent invariants re-validated;quorumOffails closed. - LocalAdapter refuses
quorum > 1(one terminal can't authenticate distinct humans) — like EmailAdapter.
Corrected claims (now accurate)
- ReceiptLog is tamper-evident only against an externally-anchored
head()(the keyless chain can be re-forged by a writer). - Quorum four-eyes is authority-enforced, not cryptographic separation of duty.
Per-approver keys and a keyed self-anchoring log are v0.2.
No wire-format change — v0.1.x receipts still verify. Full detail: docs/security-review.md (CS-01 … CS-19).