Skip to content

[D][Security] Unify Biscuit cold-lineage hash domain #309

Description

@gnanirahulnutakki

Part of #170 (Epic D, Phase 2). This is the remaining cold-verification lineage gap documented by ADR-018. It is separate from #295 / PR #298, which rejects holder-authored authority widening.

Goal

Make a Biscuit-derived A→B→C delegation chain independently verifiable across proxy process boundaries using one cryptographically verified ancestor hash domain. A holder-authored hash declaration must never become trusted ancestry merely because it is signed by the holder-controlled append key.

Verified current gap

Biscuit's official format is an append-only signature chain and carries the last private key for offline attenuation. Therefore a fact added by the holder cannot be accepted as proof of its own parent bytes without verifier recomputation.

What to build

  • Select and document one canonical ancestor hash domain that a cold verifier can recompute from the received credential and trusted state.
  • Prefer whole-credential/verified-accumulator bytes. If the current Biscuit library cannot expose an authenticated prefix serialization, document the limitation and use a fail-closed sidecar/index design rather than trusting a declared fact.
  • Bind each immediate parent edge and every ancestor used for revocation/cascade checks.
  • Define legacy-token behavior explicitly. Unsupported legacy cold verification must fail closed with a stable reason, not silently fall back to live-session assumptions.
  • Accept ADR-018 and synchronize the decision index/source-backed documentation.

Acceptance criteria

  • Cross-process root→child→grandchild verification succeeds without live in-memory parent sessions.
  • The verifier rejects forged declared parent hashes, re-parenting/splicing, block reordering/truncation, missing ancestors, and hash-domain confusion.
  • Revoking any verified ancestor denies the descendant in cold verification.
  • Valid live-session JWT and Biscuit paths remain compatible; the proof boundary is documented.
  • Focused adversarial/property tests plus the full relevant Python suite pass.
  • ADR-018 is Accepted with the actual implemented construction and alternatives.
  • Public fixtures contain no credential private material, raw tokens, secrets, or host paths.
  • PR targets dev from an isolated EXTENDED worktree with signed DCO commits and green CI.

Dependencies and non-goals

Primary sources

Metadata

Metadata

Assignees

No one assigned

    Labels

    delegationDelegation narrowing, capability attenuation, cost/blast-radius gatessecuritySecurity hardeningstandardsStandards alignment & interoperability (DRP, SCITT, OWASP, NIST)taskTask belonging to an epicverificationVerification and reproducibility

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions