Skip to content

Runtime-owned approval surface for every approval, with the passkey bound to what is shown #178

Open

Description

@andersalm

Part of #173 (isolation plan). Depends on the design in #172.

Inbox approvals for capability grants, service, room and contact requests need only an Inbox launch token, which Home can mint (api/gateway_inbox.rs:204-236). Passkey step-up covers only wallet approve/send/delete, recovery-key export and import, full-recovery export and Inspector approve, and Home chooses the operation and request that the step-up covers (api/gateway_passkey_step_up.rs:203-224). Admin changes such as passkey promotion and guest registration need no step-up.

Design proposal: #172 note. Irzhy and Sasha acceptance gates implementation.

Done means

  • Every approval kind (capability grants, service, room and contact requests, wallet, recovery import and export, admin changes, hosted egress, Runtime updates from UP-04: Add the System update flow #110) is shown by the Runtime-owned approval surface. Test: each approval kind, triggered from Home or an app, opens only on the host surface.
  • The approval surface is a top-level Runtime-origin document with no Home frame in its ancestry; a test proves Home and app frames cannot script, read, cover or resize it.
  • The host document renders the approval surface. Inbox is its name, and the Inbox capsule keeps the history. A test shows the approval is drawn by the host, not by the Inbox capsule.
  • A cue that only the host can show appears at sign-in and on every approval. It is a phrase the user chose at sign-in, never sent to the Home GUI or apps, so look-alike dialogs drawn by Home or an app are recognisable. A test proves the phrase never reaches a Home or app frame.
  • Recovery Kit import on a new machine, where no passkey exists yet, follows a defined host-only flow that registers a new passkey before any secret is entered. An end-to-end test runs this flow on a fresh profile.
  • The host renders one immutable request. The WebAuthn challenge is derived from the request's digest, nonce, expiry and operation. Verification is one-shot. A request expires at its stated expiry, and cancelling it ends it with no grant. Test: a changed amount or target after the prompt, a replayed assertion and an expired request are all refused.
  • Denials and expiries are visible in Inbox and leave no partial grant. Test: a denied and an expired request each show in Inbox history, and the capability is not usable.
  • Sasha accepts the approval screens; Irzhy reviews the binding. Proof: their sign-off is linked in this issue.
  • The shared Hacked-Home regression suite in CI #180 suite enumerates every gateway/Runtime route and capability at test time; this issue supplies operation-specific attacks from hacked Home, hacked app frames and a foreign origin, with a permitted control for each allowed scope.

Browser plan reconciliation — 2026-10-08

#87 retains Wallet/chain and actual transaction acceptance. #290/#291 consume the same Runtime-owned trusted approval for delegated operator and remote/Wallet effects: exact principal/page/action binding, explicit handoff/takeback and replay/refusal tests. Ordinary website/app content projects a request; the trusted surface owns approval. Human review and existing design gates remain here.

Activity

  1. added this to the 0.8.0 milestone on Oct 1, 2026
  2. self-assigned this
    on Oct 7, 2026
  3. andersalm commented on Oct 13, 2026

    @andersalm
    ContributorAuthor

    Postponed to 0.8.1: isolation S1/S2 is not a 0.8.0 blocker (Anders, 12 Oct); #170 states the real isolation.

  4. modified the milestones: 0.8.0, After 0.8.0 on Oct 13, 2026
  5. andersalm commented on Oct 19, 2026

    @andersalm
    ContributorAuthor

    Inbox Pending, Active and Archive (Anders, 22 Sep and 19 Oct). Anders asked for an Inbox history of approved and denied requests, with a way to end an approval later. This extends the history criteria above instead of opening a second issue.

    • Today (rc10 train):
      • Only two kinds stay visible after a decision: active model-service grants ("X may use your model", Revoke access) and hosted-AI routes (approved, denied, ended or expired; End on approved; admins only, Unix only).
      • Both are mixed into the list under the "Pending" filter (inbox.js:326-387).
      • Every other decision vanishes once it is made: app capability grants, other service kinds, contacts, wallet and inspect.
    • For 0.8.0, labels only (devil's advocate MODIFY, no new tabs): the filter becomes "All", and its count is labelled as pending requests. Branch fix/080-inbox-all-label. It ships only if it passes review before the freeze.
    • Added to this issue's Done means (0.8.1):
      • Records: the Runtime keeps a record of every decision kind listed above.
      • Active: lists every grant still in force, with End, and the Runtime stops using a grant once it is ended. Test: End on each kind; the next use is refused.
      • Archive: keeps denied, ended and expired items. Completed one-time decisions (a wallet signature, an inspect approval) appear only in Archive, marked as done, with no End, because ending can't undo them.
      • Shared rule: grant retirement uses the same rule as Keep capability admission bounded and grant retirement consistent #412 (Sasha, open).
  6. andersalm commented on Oct 19, 2026

    @andersalm
    ContributorAuthor

    Inbox 159457375088f348db2309f048ff5a749cb056b0 has Codex source-review PASS and an exact Linux source-gate PASS (2004s, 4553 Rust passed, 26 ignored). The review covers All labels, the pending-request count and accessible names; card selection, actions and pending-count events retain their behavior.
    The saved before/after source fixture shows All with 1 pending request and the same cards. Installed Home/phone acceptance and the combined train gate remain open.
    The full Runtime history, Active/Archive views and revocation journey remain After 0.8 work in this issue; the label change does not complete them.

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions