Skip to content

security(release/P0): anchor Tauri tag verification to trusted code and exact event SHA before v1.29.3 #1206

Open

Description

@qnbs

Release-blocking finding (P0)

The current .github/workflows/tauri-build.yml verify-release-tag job checks out the tagged source and runs node scripts/signing/verify-github-signatures.mjs from that same checkout, before authorizing the signed desktop release. This means the revision under verification supplies its own verifier. The shared verifier also resolves a mutable tag name through GitHub's API without an independent required equality check against the original push-event github.sha. These are trust-boundary/provenance gaps, not proof that a malicious release occurred.

Release decision: BLOCKS v1.29.3 tag creation and desktop publication until the controls and required exact-ref evidence below are proved. Do not merge a GHCR-only correction and mistake it for Tauri release authorization.

Proven scope and ownership

Required remediation

  1. Trusted verifier origin: load/run verifier code from a separately trusted, reviewed immutable pin, not from the untrusted target tag. Preserve read-only, exact-source, pinned third-party actions, least-privilege permissions, and avoid arbitrary untrusted execution before verification. Assess whether pin rotation is secure and reproducible after merges.
  2. Exact event-to-artifact binding: verify actual push-event type, refs/tags/v* ref, annotated tag signature and target commit signature; require verified target commit SHA to equal github.sha from the immutable event context. Reject missing/deleted/retargeted tag, mismatched ref, lightweight/unsigned/unverified tag, wrong-commit signature and API failures. Preserve exact-SHA OSV audit of all three lockfiles and strict gated release job needs.
  3. Ref protection evidence: in authenticated read-only inspection enumerate active repository/parent tag rulesets and evaluate how they match refs/tags/v1.29.3; capture enforcement, rules (creation, updates, deletions), bypass actors/modes and the authenticated tag-push actor. Confirm GH Actions github.ref_protected semantics with this protection configuration. Do not create a v* test tag to probe behavior.
  4. Policy & execution integrity: reject if, continue-on-error, unsafe environment shadowing such as NODE_OPTIONS, writable/verifier-controlled execution roots, extra publish branches and unchecked writer jobs. Negative tests must demonstrate failed gates for each relevant mutation.
  5. Tauri publishing parity: desktop release must depend on trusted signature proof, exact tag/ref, audited event SHA and complete all-platform signed updater payload. Preserve the all-or-nothing staging/verification path from merged PR ci(release): require complete, verified desktop assets before publishing #1202; do not weaken it or change secrets/keys without authorization.
  6. No-release regression evidence: run targeted tests, signature proof negatives, full workflow/security-policy checks, CodeAnt, CodeScene, CodeQL, normal protected PR CI. Before the real versioned tag, capture a safe nonpublishing proof with no registry/release writes. All commits signed and review threads resolved with evidence.

Acceptance criteria

  • Trust-root diagram and concrete immutable verifier pin documented and enforced.
  • Tag signature + exact github.sha equivalence, fail-closed behavior, real v* tag-protection evidence demonstrated.
  • Negative tests: tag retarget/delete/lightweight/unsigned/mismatch; verifier substitution; step skip/failure continuation; environment injection; untrusted checkout.
  • Tauri publish job cannot run unless all trusted prerequisites succeeded; zero weaker alternative paths.
  • PR within repo governance and commit budget, no PII in authored content, all required hosted checks terminal green.
  • release(v1.29.3): publish signed interim maintenance release with refreshed desktop assets, updater and credential preflight #1201 explicitly references this blocker and its satisfying merge SHA; release remains HOLD until signed final exact-main, native upgrade/data-preservation and all 3-OS updater/signature/asset checks complete.

Execution constraints

One local Codex CLI writer in Ubuntu/VS Code; protected main, no direct push, normally signed commits, reviewable PR, batch pushes, no security suppression/waiver. Create a small successor PR after GHCR PR #1205, keeping the two pipelines' acceptance criteria distinct. No tag, GitHub Release, GHCR package push or Vercel destructive mutation is authorized by this issue.

Activity

  1. qnbs commented on Nov 8, 2026

    @qnbs
    OwnerAuthor

    Update 2026-11-08: shared verifier precursor PR #1207 is open and Ready for Review, current head 3d381860. It corrects the GitHub Compare API ancestry fields, binds the signed tag target to the event SHA, and rejects a changed/unprotected main snapshot across the comparison request. Focused tests passed (20 tag-verifier cases; 72 signing cases), and local ci:prepush passed. Hosted exact-head checks are still running after the latest push. Scope is only the shared verifier bootstrap: this does not fix the Tauri workflow trust boundary, authorize publication, or close this issue. v1.29.3 remains HOLD; no tag or publishing action was performed.

  2. qnbs commented on Nov 8, 2026

    @qnbs
    OwnerAuthor

    Update 2026-11-08: shared verifier bootstrap PR #1207 merged. Resulting protected main is 147470682b62d5bfe196bba803353d9f25cab8a7; push CI/CD #42530633914 and CodeQL #42530633917 are still running. This fixes the shared Compare API ancestry check and stable-main revalidation only. The Tauri workflow trust-boundary remediation in this issue remains OPEN and release-blocking. No tag or artifact publication was attempted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions