Documentation · Markdown source · Edit on GitHub · CC0 1.0

Incident Response — Compromised Host Key or JWKS

What to do when a VRP node's private signing key leaks (or its JWKS is suspected to have served the wrong keys), while the host domain itself is still under the operator's control. This is the case VRP's key controls are designed for.

Because VRP has no central gatekeeper, there is no incident authority to call: the operator who controls the host domain both detects and resolves the incident by editing what the domain serves. The steps below are host-domain-centred by design.

If the domain itself is compromised (DNS, TLS, or hosting takeover), key rotation cannot help — the attacker controls the source of truth. That is a domain-security incident, out of scope for the protocol; regain control of the domain first, then rotate keys.

The core fact

An attacker holding the leaked private key can mint fresh, well-formed offers with a future valid_until. Offer freshness does not contain them. The only thing that de-trusts them is removing the key from the JWKS — a key is valid exactly while it is present there (spec §3.1).

Removing the key also invalidates the operator's *own* legitimate offers signed with it. That is intentional and unavoidable: a verifier cannot tell the attacker's signatures from the host's, because they share the same key.

Steps: detection → rotation → revocation signal → communication

1. Detection

Treat as a possible key compromise any of:

When in doubt, treat it as a compromise and rotate — the cost of rotating is low.

2. Rotation (revoke the bad key, stand up a new one)

  1. Generate a new Ed25519 key with a new kid.
  2. Remove the compromised key from the JWKS immediately and publish the new key. Unlike routine rotation, there is no overlap for the compromised key — it goes now, even though this breaks offers legitimately signed with it.
  3. Re-sign current legitimate stays with the new key so guests and agents can re-fetch valid offers.
  4. Keep the cache window tight. Serve jwks.json with Cache-Control: max-age=300 or less — the reference node already does. This is the revocation latency: a conforming verifier fully de-trusts the removed key within the cache window (≤ 5 minutes) of it leaving the JWKS (spec §3.1). Publishing the updated jwks.json is a normal deploy of the host domain's static well-known files; see KEY_ROTATION.md.

3. Revocation signal

The revocation signal in VRP is simply the key's absence from the JWKS — there is no separate revocation list or endpoint to update. Strengthen and preserve that signal:

4. Communication

What VRP can and cannot promise