Skip to content

Default short-lived attestation TTLs for automatic revocation #170

@bordumb

Description

@bordumb

Problem

With OIDC (Sigstore/Fulcio), signing certificates expire in 10 minutes. If a key is compromised, the damage window is at most 10 minutes — after that, the certificate is useless without a new OIDC login.

With auths, device attestations currently have no default expiry. A compromised device that goes offline before the maintainer publishes a revocation attestation can produce valid signatures indefinitely. The expires_at field exists in attestations but isn't set by default.

This is the most commonly cited advantage of OIDC's ephemeral model over long-lived keys. We need to close this gap.

Proposed: short TTLs as the default

Device attestations

# .auths/config.toml
[attestation]
default_ttl = "24h"    # device attestations expire after 24 hours
auto_renew = true       # agent auto-renews before expiry
  • Every device attestation gets expires_at = now + default_ttl
  • The auths agent (background process) auto-renews attestations before they expire
  • If the agent is stopped (laptop closed, offline), attestations expire naturally
  • A compromised device that goes offline can only sign for default_ttl

CI attestations (already handled)

CI ephemeral attestations already support --expires-in. Make the default 1 hour:

auths artifact sign --ci --commit HEAD  # expires_at = now + 1h (default)

Configurable per-organization

# .auths/policy.toml
[policy.release]
max_ttl = "1h"          # release signing attestations must expire within 1 hour

Organizations with stricter security requirements can enforce shorter TTLs.

Comparison with OIDC

OIDC/Fulcio Auths (proposed)
Default key lifetime 10 minutes (certificate) 24 hours (attestation TTL)
Configurable No (hardcoded by Fulcio) Yes (per-org, per-role)
Renewal mechanism New OIDC login required Agent auto-renewal (no user interaction)
Offline behavior Cannot sign at all Can sign until TTL expires
Compromise window 10 minutes max Configurable (1h to 30d)

The tradeoff: OIDC's 10-minute window is shorter by default, but requires network access for every signing event. Auths' 24-hour default is longer but works offline. Organizations that need tighter windows can set max_ttl = "1h".

What exists today

  • expires_at field in Attestation struct — fully supported
  • --expires-in flag on auths artifact sign --ci
  • Attestation verification checks expires_at against current time
  • Agent infrastructure exists (auths agent start/stop)

What's needed

  1. Default TTL in config (not hardcoded — configurable)
  2. Agent auto-renewal loop: check attestation expiry, re-sign before it expires
  3. CLI warning when signing with an expired or near-expiry attestation
  4. auths doctor check for attestation freshness

Success criteria

  • A compromised device that goes offline has a bounded damage window (default 24h)
  • The agent auto-renews without user interaction
  • Organizations can enforce stricter TTLs via policy
  • Offline signing still works within the TTL window

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions