Skip to content

Required: Isolation as promised #173

Open

Description

@andersalm

ElastOS promises that the Runtime is the only authority and that Home and every app run on top of it in a sandbox. A hacked Home must reach only Home: never the Runtime's internals, localhost or the host. Everything that crosses goes through the Runtime (Carrier for off-box traffic) with explicit approvals and capability tokens. Home's only special power is delegation: launching and stopping capsules on user action and brokering capsule-to-capsule calls. Nothing needs root at run time; if the installer needs root once (for example to install a system service), it says so and asks first.

A code review on 1 October found that the code at that time did not keep this promise (historical baseline). Home and all apps are web pages on the Runtime's origin; Home can mint and use every app's token; untrusted content shares Home's origin; a web terminal starts a host process; providers run unconfined and receive the device key; the Linux Browser engine needs passwordless sudo; the gateway trusts null and any loopback origin; and the docs claim more isolation than exists. That was the pre-release plan. Anders later moved S1/S2 after 0.8.0 and kept the stated S0 scope in the 12 October decision. The Browser provider enforcement and B14 criteria below retain their full scope.

Target

  • T1 Untrusted content never shares an origin with Home or apps.
  • T2 The Home GUI is a capsule in an opaque sandbox whose only channel is the Runtime, with only a delegation capability.
  • T3 The Runtime mints each app's capability into the sandbox it mounts: scoped, short-lived, revocable, ended by a real stop.
  • T4 Every approval is shown by a Runtime-owned surface that Home and apps cannot script, and the passkey signs exactly what is shown.
  • T5 The Runtime runs without any root path at run time (no sudo, setuid or file capabilities); each provider runs confined to what its manifest declares; keys stay in the Runtime or in their key providers (the did provider for the device key, the wallet provider for wallet keys). The Runtime's local control listener and attach secret are reachable only by the Runtime account's own tools, not by providers.
  • T6 The front door accepts only expected origins and hosts, nothing sensitive works without sign-in, and nothing listens beyond this device unless the owner turns it on.
  • T7 Docs, manifests, website and release notes state exactly what is isolated.
  • T8 Carrier peers (remote Homes, rooms, contacts, service offers) are held to the same rules.
  • T9 Installs and updates accept only the signed release set, and the release key is kept off public servers and away from candidate code.
  • T10 A user's keys and private data are readable only by that user: never by the operator of a hosted Home, and not by other software or users on a self-hosted device while Home is locked.

Threat model

  • In scope: script in the Home GUI, in any app frame, in a CID or site page, or in a same-origin document other than the host; a foreign web origin, another localhost port and DNS rebinding; a local process with no session; a hostile Carrier peer; a compromised native provider; an internet guest on the public seed; a tampered installer or release on the seed; a device on the same network; an app, provider, peer or guest that tries to exhaust memory, disk or CPU; hostile text or model output passed through the Assistant; a stolen copy of the old maintainer key; the operator of a hosted Home, including root on the seed; other software or OS users on a self-hosted device while Home is locked.
  • Out of scope, stated in the docs: code running as the user or as root on a self-hosted device while Home is unlocked, the user's browser and its extensions, physical access, a stolen Recovery Kit or passkey authenticator, recovery from a stolen device or profile key (it means a new identity), the development process itself (it relies on Irzhy's review).

Steps

0.8.0 vs after 0.8.0: 0.8.0 requires S0-S2. Key and private-data protection from the host (T10, #209, milestone After 0.8.0) is S3 and is scheduled after 0.8.0, per the existing step: “S3, after 0.8.0: ... #209 user keys and private data that the host cannot read (before hosted accounts hold real value).”

Every Done means names its test or proof.

The public demo is paused since 1 October; #174 decides when it reopens.

Until S2 is done, no PR adds a public route, an approval type, or an app or provider capability unless its issue records approval under this plan.

Chat already has the contact-request approval in #86 and the bounded participant-history approval in #139. Their implementations retain destination/conversation authority and refused-case tests. #264 records its own approval if leaving Community needs another route or capability. These links preserve the current S0 through S2 and later S3 scope.

Every S0-S2 change needs a regression test for the refused case. Merge rule (Anders, 2 October): a PR merges into develop when all checks are green and an independent adversarial review from a different model family than its author has passed (Codex authors use elastos-pr-review, a Claude review; Claude authors get a Codex review). Changes to the gateway, page security headers or frames also pass the installed Home journey (#153) before merge. Irzhy reviews merged security changes afterwards and owns the isolation design (#172), the threat model and the attack suite (#180); main, tags and releases stay with Anders. Third-party executable capsules stay unavailable.

Every S0-S2 change needs Irzhy's review, so these PRs go to the front of his queue.

Done means

Browser authority acceptance contribution (#283, B14)

Runtime enforces the Browser owner's grants for Engine actions, inspection and selected Exit connections. Source work can begin from the existing capability/owner contracts; this Browser contribution retains the applicable platform and required human-review gates.

The current remote supervisor's 5-second check and 50-second stale heartbeat differ from B14's required bounds. Provider-side measured fault tests, rather than timer edits alone, establish acceptance. irzhywau's authority/isolation/approval review remains separate from independent agent review. Preserve #173's approved threat model and its before/after-release scope; this contribution does not move unrelated later platform work into the first local Browser milestone.

Browser plan reconciliation — 2026-10-08

The executable consumers are #289 session bounds, #290 operator actions, #291 remote Engine/Exit, #292 profiles and #293 qualification. Keep provider-side authority as this issue's Browser contribution: immediate issuing-Runtime refusal, reachable enforcement within 2 seconds and partition lease expiry within 30 seconds, with suspend/clock/restart tests. #131's exact pending lifetime and settlement retain resource barriers. Browser source milestones consume accepted authority outputs; final isolation/approval/review gates and the existing S0–S3 schedule remain unchanged.

Local AI plan reconciliation — 2026-10-08

#99 supplies the Local AI confinement contribution; #98/#100/#101 supply resource/lifecycle/retry proof, and #103 binds the installed target matrix. The existing #166 shared provider rights and #180 hostile-model-output tests remain required. Runtime authorizes each effect proposed by a model under the same principal/session rules as a human action.

Activity

  1. added this to the 0.8.0 milestone on Oct 1, 2026
  2. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    The public demo on https://elastos.elacitylabs.com is paused since 1 October, 19:58 UTC, until the isolation fixes in #173 ship. The web server answers 503 with a short notice for /home/, /apps/, /api/, /s/ and /content/. The website, install.sh, /release-head.json, /release.json, /artifacts/, the publisher Carrier bootstrap under /.well-known/ and /ipfs/ downloads stay available; /ipfs/ responses carry a sandbox Content-Security-Policy. The accounts are kept. Undo: restore the saved web-server config and reload.

  3. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    Local AI session owns #97's 2 October bounded Jetson proof and #150 / draft PR #153's Mac CI fixture repair.
    This work keeps the existing public routes, approvals and app/provider powers; authority changes require recorded approval here.
    The isolation session retains the gateway front door and provider/bridge.rs; this session will coordinate any dependency through issues.
    The isolation session has priority for the Mac's single heavy build slot; CI and light source checks can proceed in parallel.
    Required reviews remain with Irzhy, with two independent review rounds and refused-case tests for corrections.

  4. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    Session scope: gateway front door and provider launcher confinement; active task #168, base/target develop at c9205a7; PR pending.
    Approved sequence, one active task: #168 → #169 → #167 → #170 → #165 → #171 → #184 → combined #166/#99 → #183; issue-specific base instructions take precedence.
    After #168/#169 merge, record the design note in #172 for Irzhy and Sasha; #176 through #180 begin after their acceptance.
    Every PR proves the refused case, has at most two review rounds, requests irzhywau after green checks, and merges after his approval; Anders approves #170 public correction.
    Authority freeze lasts through S2; each exception needs approval in its issue under #173. Seed, main, tags and releases stay outside this session; local builds are serial and free disk stays above 15%.

  5. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    The active order is #188 CI repair and review, with #169 in a separate worktree while CI runs.
    The #188 hang is understood; #167 starts from its corrected branch and waits for #188 integration before merge, followed by #170.
    #186 follows #170 for code only: separate signing tool, publish-release signer, source re-trust, main-tag release gate, pinned Actions and signed served files.
    Anders retains key custody and person-run proofs; #160 integration gates overlapping update.rs, install.sh and ci.yml work, and its branch stays with its owner.
    The consolidated 18-issue plan, authority freeze, refused-case tests and Irzhy approval before merge remain the acceptance contract.

  6. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    #150 / draft PR #153 now needs a Mac reproduction of installed candidate cd00623 for a cold reply backend_timeout; the current reply deadline stays fixed.
    The Mac currently has 81 GiB free and the process inventory shows the heavy build slot idle.
    Local AI requests the next free slot for an exact-candidate source-home build; isolation retains priority, so please record any current reservation or handoff here.
    Gateway front-door files and provider/bridge.rs remain owned by isolation; any finding on those paths will be recorded here for that session.
    The Linux x86 apt timeout is recorded in #150 and only its cancelled CI job was rerun; #97's Jetson attempt stays with its 2 October heartbeat.

  7. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    The shared Mac build ledger records isolation #167's slot as finished at 22:39 UTC, and the compiler process inventory is empty.
    #150 will claim that released lease for the exact cd00623 isolated source-home build, with a 15% free-disk stop guard and shared dependency cache.
    The build writes only this session's source outputs and new test Home; existing Homes and isolation source files stay with their owners.
    Isolation keeps priority for its next reservation; this session will release the lease when installation finishes and record the handoff here.
    Cold reply diagnosis retains the 120-second provider deadline and records engine, health and reply timing before any cause correction.

  8. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    #150's local Playwright 1.59.1 setup reproduced the Node 26 extraction stall after its 92 MiB headless-shell download reached 100%.
    The same pinned package and browser revision installed successfully with a local Node 20 setup process; the installed journey will still run with Node 26 like CI.
    Only that owned stalled installer and its child were stopped; the replacement added the missing test browser shell.
    This is setup evidence for the #188 diagnosis, separate from #153's Rust model backend_timeout; the exact Mac source-home build remains under the shared lease.
    Current free disk is above 16%; the 15% stop guard and isolation build priority remain in effect.

  9. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    #150's exact cd00623 source-home installation completed; the shared heavy build lease is released for isolation's next build.
    The new Mac fixture has its own Runtime, providers, capsules, verified pinned engine and installation receipt.
    Existing Homes and isolation source files remain under their owners; local free disk remains above the guarded 15% floor.
    Next is the light installed cold reply measurement with the existing provider deadline, outside the build slot.
    Any launcher or front-door finding will be sent here for isolation ownership.

  10. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    Isolation #167 released the shared heavy build lease at 23:17 UTC; the compiler inventory is empty and free disk is above 16%.
    #150 will use that released lease for narrow model-provider timing tests with the 15% stop guard, then release it for isolation.
    The original installed wrapper left one detached Browser helper in the disposable Home; its saved identity was checked and the owned helper was stopped.
    This cleanup finding stays with the launcher owner for coordination; #150 edits only model-provider timing and safe CI receipts.
    The exact baseline cold reply passed in 10.355 seconds, so the 120-second provider deadline remains fixed while GitHub Mac stage evidence is added.

  11. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    #150 released the shared Mac build lease after the narrow timing verification.
    All 16 local engine lifecycle/health tests and 12 local text tests passed serially; the first parallel run had two fake-engine startup timing failures.
    Isolation retains priority for its next build; #150 will use a later released lease for the reviewed diagnostic candidate installation.
    The production reply deadline stays at 120 seconds and installed proof remains separate from source checks.
    Gateway front-door files and provider/bridge.rs remain with isolation.

  12. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    #150 pushed reviewed diagnostic candidate 0f2211d and started exact-source CI; the provider reply deadline remains 120 seconds.
    Isolation released its latest #169 Mac lease at 23:28 UTC, and #150 will use the next free lease for a fresh candidate installation under the 15% disk guard.
    The installation copies only verified immutable inputs into a new disposable Home and writes this session’s own final outputs.
    The earlier exact cd00623 fixture remains retained with all owned processes stopped; existing Homes and private authority stay intact.
    The lease will be released at installation completion for isolation’s next build.

  13. andersalm commented on Oct 1, 2026

    @andersalm
    ContributorAuthor

    #150’s exact 0f2211d Mac installation and installed model-provider verification passed; the shared heavy build lease is released for isolation.
    The fresh fixture binds the reviewed commit/tree and verifies copied engine/model inputs, built/installed Runtime parity and provider manifest hashes.
    Pinned-input verification and disposable package preparation passed; the light installed journey is now running outside the build lease.
    The controller tracks original process birth identities and preserves any later isolation lease owner during cleanup.
    The provider reply deadline remains 120 seconds; gateway front-door files and provider/bridge.rs stay with isolation.

  14. andersalm commented on Oct 2, 2026

    @andersalm
    ContributorAuthor

    #150 / draft PR #153 passed all source and installed Mac/Linux checks at f6c66c5; #98 / draft PR #136 now continues its separate Linux resource proof.
    Isolation #186 released the shared Mac lease at02:43 UTC; the compiler inventory is empty and free disk is above15%.
    Local AI will use the released lease for narrow model-provider unit/process tests from its own continuation worktree, sharing dependency artifacts and keeping own final outputs.
    The15% stop guard stays active; isolation retains priority for its next reservation and the lease will be released when these checks finish.
    Gateway front-door files and provider/bridge.rs retain isolation ownership; this continuation changes resource-test fixtures and private CI proof only.

  15. andersalm commented on Oct 2, 2026

    @andersalm
    ContributorAuthor

    #98 released its shared Mac build lease after the first narrow provider test build; isolation #170 now owns the next lease.
    That build found two retained queue fixtures missing the added optional timing argument; the continuation source now supplies it explicitly.
    All four basic gates passed; the corrected provider tests will run after isolation releases its lease and the15% disk guard permits them.
    CI harness source work and light refused-case checks continue while isolation has priority.
    Gateway front-door files and provider/bridge.rs retain isolation ownership; existing Homes and keys stay intact.

  16. andersalm commented on Oct 2, 2026

    @andersalm
    ContributorAuthor

    #98 released the shared Mac build lease after its corrected provider checks passed:249 unit tests and10 process tests, with installed lifecycle still reserved for Linux CI.
    The checks cover the preserved admission, queue/cancellation, account lease and engine cleanup paths; all four basic gates also passed.
    Free disk remained above15% under the active stop guard, and this session's final outputs stay in its own worktree.
    Isolation retains priority for its next build; the remaining #98 harness work and independent reviews use light checks.
    Gateway front-door files and provider/bridge.rs retain isolation ownership; fresh fixture evidence and Linux resource qualification remain separate from the accepted #150 ordinary reply.

  17. andersalm commented on Oct 2, 2026

    @andersalm
    ContributorAuthor

    This session merged its own #155, #142 and #144 after posted Claude PASS; #142’s four Mac confinement tests passed.
    PR #148’s End ordering change now conflicts with develop in elastos/crates/elastos-server/src/api/mod.rs; isolation retains that front-door file.
    Please provide the owned resolution through #148 or this issue; this session will integrate it normally and preserve the reviewed End behavior.
    #148 source 20076de5b7570d5688670d48d32146abd3c015eb, current develop 93a7284db358a9099c7af407dd7152a6c5a3decb; CI36864014484 and the posted operator PASS remain qualified inputs.
    The Carrier fix, normal ARM engine input and Mac reply timings continue in this session’s own worktrees; the12:00UTC Jetson slot remains first.

  18. andersalm commented on Oct 2, 2026

    @andersalm
    ContributorAuthor

    PR #153 CI36964468702 and PR #136 CI36964466444 remain blocked before model admission: the real signed-in Home reaches an empty Marketplace; exact receipts and media bind tasks aa9a2bda / 77dd1c98 and their tested trees.
    #167 now assigns its dispatch-only CI job the existing #153 installed journey, with pinned harness provenance and owned-process cleanup: prove PR #202 on its exact head before merge, then on the exact merged develop commit.
    Read-only integration previews at aa9a2bdab03472cf7100af4833e846d0667a1b70: owner #202 head 3bceced34ddb0b79139becc3e933745556349b55 merges cleanly (preview tree 4bd1be2227d5073c8eda376e092d723efb4d920d); develop 829a24ad conflicts in this session's .github/workflows/ci.yml and scripts/ci-release-policy-test.py.
    Isolation owns the CSP and foreign-frame authority boundary. Please hand off the accepted #202 candidate and installed proof here; this session will then integrate normally, resolve its two CI conflicts, preserve the 120s deadline / eight-token bound, and obtain three Mac timings plus #98's separate lifecycle proof.
    PR #133 is merged and its normal develop engine/cache proof is green. The separate heartbeat retains the sole 12:00UTC Jetson slot with its prepared candidate, fixed guard, 30-minute limit and cleanup.

  19. andersalm commented on Oct 2, 2026

    @andersalm
    ContributorAuthor

    Paused on 2 October (Anders): ElastOS focuses on one end-user goal, install.sh on a Mac and an update to the next version (#89). After today's wrap-up, isolation work pauses except #186 (new release key and signer), which that goal needs. #202 finishes only after its installed check; #199 is parked.

  20. andersalm commented on Oct 2, 2026

    @andersalm
    ContributorAuthor

    #167 closed after PR202, its green CI, Codex PASS and the exact merged-develop installed journey proved its Done means. The old isolation queue remains paused under #89.

    • Use trusted Home-shell IDs when classifying shell ancestors; the accepted manifest-role check adds restriction and grants no authority.
    • Extend foreign-frame coverage to Home, shells, viewers and secondary documents; current fixtures prove nested app loading and foreign-frame refusal of API authority.
  21. andersalm commented on Oct 3, 2026

    @andersalm
    ContributorAuthor

    Anders’s 3 October ownership decision assigns the #110 Home System update journey to this session, including gateway-side temporary Carrier cleanup. The initial action uses POST on the existing System summary resource and the existing owner/passkey path; its canonical intent binds source, channel, signer, versions and signed head/release CIDs. The release session reviews the gateway candidate.
    The #110 contract keeps ordinary checks read-only and release-changing authority with the admin principal and fresh System passkey effect. This implements the existing #89 first goal; broader approval types and provider capabilities retain their own scope decisions.

  22. andersalm commented on Oct 3, 2026

    @andersalm
    ContributorAuthor

    The direct 3 October operator instruction assigns this session the normal Home System update journey and gateway-side Carrier cleanup: “Start with #109 … then the Home System screen update in #110.” Draft PR229 records the concrete first-goal scope: POST apply on the existing /api/apps/system/summary resource, with the existing owner/passkey approval type and exact signed source/channel/publisher/versions/head/release intent.
    Read-only checks retain viewer scope; release-changing authority requires the admin principal, System launch binding, fresh passkey effect and durable exact replay ownership. Release reviews the gateway candidate. Broader routes, approval types and provider/app authority remain their own decisions; the draft merge waits for the installed journey.

  23. self-assigned this
    on Oct 7, 2026
  24. changed the title [-]0.8.0: Isolation as promised[/-] [+]Required: Isolation as promised[/+] on Oct 12, 2026
  25. 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. S1 and S2 items moved; S0 stays (without #174).

  26. modified the milestones: 0.8.0, After 0.8.0 on Oct 15, 2026
  27. andersalm commented on Oct 15, 2026

    @andersalm
    ContributorAuthor

    Moved to After 0.8.0 per Anders's decision 6136835874 (S1/S2 do not block 0.8.0; planned for 0.8.1). S0 (#167, #168, #169) is closed; the 0.8.0 part is #93 gate 2 (#170 correction, #186).

  28. andersalm commented on Oct 20, 2026

    @andersalm
    ContributorAuthor

    Three Shell follow-ups for after 0.8.0 are recorded privately under SECURITY.md. They become tasks in this issue after 0.8.0 ships. Source: Sash's review of the Shell agent, checked against the 0.8.0 candidate on 20 Oct.

  29. irzhywau commented on Oct 30, 2026

    @irzhywau
    Collaborator

    Heads-up for #173 approval: the #388 protected-content work adds one owner/passkey route (DELETE /api/apps/custody/local-node, step-up custody.local_node.remove) and a Creator method to list/resume unfinished mints (unfinished_protections, runtime_custody_resume); each is declared in one place.
    Planned next: cross-Home custody, so a buyer on any Home gets the content key from the item's own custody pool; this will add routes/capabilities, which we'll list here for approval before the PR.
    No new approval types for the DASH media format; its wire changes are optional fields on existing provider calls.

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