Open network: discovery, NAT traversal and sandboxing untrusted work #22
Open
opened 2026-10-05 05:05:26 +00:00 by rvnminers-A-and-N
·
14 comments
No Branch/Tag Specified
dev
ci/gitea-actions
dependabot/go_modules/go-f5e78d6b71
integration
feat/777-accelerators
fix/workspace-globe-pane-motion
feat/789-pending-action-attribution
feat/741-model-catalog-stream
fix/741-shared-state-reconnect-baseline
feat/741-bootstrap-peers-stream
feat/741-city-table-stream
fix/741-location-stream-client-metadata
fix/741-files-shared-state-coverage
fix/741-settings-stream-e2e-readiness
dependabot/npm_and_yarn/apps/sisyphus/electron-45.0.0
dependabot/npm_and_yarn/apps/sisyphus/desktop-ea22606fe9
agents/app-side-confirmation
feat/files-scoped-by-pool
feat/storage-replication-push-stream
codex/protobuf-v2-lending-state
fix/dev-preview-auth-forwarding
feat/chat-attachment-retention
No results found.
Labels
Clear labels
accessibility
all-platforms
area:agents
area:ai
area:chain
area:ci
area:client
area:daemon
area:p2p
area:project
area:protocol
area:runtime
area:storage
bug
chore
community
dependencies
discussion
discussion/Announcements
discussion/General
discussion/Ideas
discussion/Q&A
discussion/Show and tell
discussion/answered
documentation
duplicate
enhancement
good first issue
help wanted
i18n
infra
invalid
needs:decision
needs:hardware
paired
question
research
security
status:in-review
test
testing
tracking
wontfix
Barrier affecting people with disabilities
Run every platform's packaging and checks on this pull request, not only the three main ones
MCP server, skill, and thinking on the pool
Planner and model providers
Blockchain, SISY, verification
Continuous integration and build workflows
Desktop and web clients
sisyphusd coordinator, worker, scheduler
libp2p hosts, relays, discovery, connections between nodes
Project planning, roadmap, and governance
Protobuf schemas and RPC contracts
Workload execution and environments
Content-addressed storage, IPFS, Kubo, Cluster, S3, names, pinning
Something isn't working
Repository health, templates, Discussions, contributor experience
Updates to actions, Go modules or npm packages
Migrated from GitHub Discussions
GitHub Discussions category: Announcements
GitHub Discussions category: General
GitHub Discussions category: Ideas
GitHub Discussions category: Q&A
GitHub Discussions category: Show and tell
Q&A discussion with an accepted answer
Improvements or additions to documentation
This issue or pull request already exists
New feature or request
Good for newcomers
Extra attention is needed
Translations and right-to-left layouts
Build, CI, releases
This doesn't seem right
Waits on a decision from both owners
Waits on a machine we do not have yet
Built together by both maintainers, with co-authored commits
Further information is requested
Needs investigation or a design decision
Sealing, keys, access control, tokens, the security model
Built and in an open pull request; closes when it merges
Tests, test harnesses and the rehearsal
Roadmap and meta issues
This will not be worked on
type
Feature
A request, idea, or new functionality (GitHub issue type)
type
Task
A specific piece of work (GitHub issue type)
Milestone
No items
No Milestone
Beyond V0: open network and chain
Projects
Clear projects
No projects
Sisyphus roadmap
Todo
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Sisyphus/Sisyphus#22
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What changes when workers and requesters are strangers.
--container-runtime runscor Kata, and with a read-only root. The evaluation itself is still to do: neither runtime has been installed and tried, which needs a machine where Docker can be given one): workers run code from strangers. Evaluate gVisor, Firecracker microVMs and Kata Containers over plain Docker; GPU passthrough complicates all of them.--task-dir; this keeps task workspaces and staged inputs off the system disk when configured on a separate/quota-backed filesystem, but does not set a per-task quota. (PR #562)docs/security-model.md, #160; and since then workers receive keys scoped to one job (#179))Progress
The confidentiality item is written down:
docs/security-model.md(#160) says who is trusted with what today, what is and is not protected, and what an open network would have to add. Writing it found a way for a container job's image name to pass options to Docker, fixed in #161; the lesser findings are in #162.Sandboxing moved a step in #168: a container's command now runs with no capabilities, cannot gain privilege (
no-new-privileges), and has a process limit; what a task leaves in/outputis capped. Not done, and listed indocs/security-model.md: a read-only root, a limit on what the command writes while it runs, user namespaces, a sandboxed runtime such as gVisor.A quick environment check from my current Linux host: Docker reports only
runc/io.containerd.runc.v2, Podman reportscrun, and neitherrunscnorkata-runtimeis installed. I did not install or run anything, so this is not a sandbox evaluation; it confirms the open runtime comparison still needs a dedicated test host or an approved isolated setup.@rvnminers-A-and-N sharing this so we distinguish “available in the code/config” from “actually tested under gVisor or Kata”.
@rvnminers-A-and-N I took a closer look at the container boundary while continuing the sandboxing work. I found one sentence in the security model that overstated the current risk: it said a job could inject Docker options such as privileged mode or arbitrary host mounts. The worker actually builds the Docker argument list itself; a job provides the image, in-container command, environment and declared resource/network fields, and the image is checked on both submission and execution. I corrected that wording in #253, while keeping the important caveat intact: arbitrary code in a submitter-chosen image still runs under ordinary Docker confinement by default, and the real sandbox/runtime evaluation is still outstanding.
I’m keeping #22 open; this documentation correction doesn’t count as the missing gVisor/Kata or real-network tests.
The read-only root is now implemented, but
/outputis still only capped after a task exits; a task can exhaust the worker's disk while it runs. I can take a focused, no-special-runtime investigation of a portable way to bound writable task storage and its failure behavior, then propose a small tested change. Are you already working on that part of #22, or is there a nearby sandbox task you want me to take instead? I’ll wait before changing daemon code so we don’t overlap. /cc @rvnminers-A-and-NI'm not working on that part of #22, so please take it. Bounding
/outputwhile the task runs, rather than only after it exits, is a good next slice. One thing that might help: whatever bounds it should also cover input staging (sisyphus-input-*), which the worker writes to the same disk. I'll review the proposal when it's up. Meanwhile I'm on the #314 load repro and the V0 laptop checks.I checked Docker's documented mechanisms against the current
packages/runtime/container.gobind mounts:--storage-opt sizeconstrains the container writable layer, not the host bind-mounted/inputand/outputdirectories we use. It is also storage-driver-dependent; foroverlay2it requires XFS withpquota.tmpfsis a real mount-time bound, but it consumes memory and Docker documents it as Linux-only./outputcurrently must survive container exit so the worker can read it; a tmpfs output would disappear when the container stops unless we redesign the container lifecycle/output export.So I don't see a safe portable hard-cap patch with the existing bind-mount design. My proposal is to scope the guarantee honestly: either implement an explicitly Linux/driver-supported quota-backed task workspace (including shared input staging) and advertise it only after a positive capability check, or keep the current behavior and track disk exhaustion as an explicit limitation until we have that storage boundary. I recommend the first only if we're comfortable with a Linux-first capability and fail-closed behavior for hardened work; otherwise the second is safer than a misleading best-effort cap.
Docker references: tmpfs mounts,
docker run --storage-opt, and overlay2 quota requirements. Which direction do you want me to take? /cc @rvnminers-A-and-NThanks, that's a clear analysis, and I agree a watcher shouldn't be called a bound. My preference is the second option now, plus one cheap portable step, with the Linux quota capability later.
/outputis checked only after exit. This goes in the security model and the worker docs.sisyphus-task-*,sisyphus-input-*) are created withos.MkdirTemp("", …)inpackages/runtime/container.go, so they already followTMPDIR. An explicit worker flag such as--task-dir, documented as "put this on its own volume or quota'd mount", would give operators a real hard bound on any OS. A runaway task then fills that volume rather than the worker's system disk. It's per-worker, not per-task, but it's honest and enforced by the filesystem. The worker should also turn ENOSPC into a clean task failure rather than a crash.If you agree, I'd suggest you take 2 (flag, ENOSPC handling, docs) and I'll write 1 for the security model, since that's where I've been working. Or you take both. Happy either way.
I agree with that split. I’m taking option 2:
--task-dirfor task workspaces and shared input staging, requiring an existing writable directory so a missing volume cannot silently fall back to the system disk, and handling filesystem-full errors as task failures. I’ll update the worker documentation to say plainly that/outputis checked after exit and that the flag only contains disk use when the operator places it on a dedicated/quota-backed filesystem; it is not a per-task quota. Please take the security-model wording as proposed. I’ll request you as reviewer on the daemon PR. /cc @rvnminers-A-and-NThanks, that sounds right, including requiring an existing directory so a missing volume can't fall back to the system disk. The security-model half is up as #560. It points owners at
TMPDIRfor now, so your PR can switch that advice to--task-dirwhen it lands.Design question for the "later" per-task quota item: Discussion #565 (project quotas versus a loop image, how to get the privilege, and how a worker advertises the capability).
I added a source-based connectivity status note in PR #743: open-network-connectivity.md. It distinguishes the DHT and mDNS discovery that are already wired, opportunistic hole punching, Sisyphus-managed relay fallback, and location lookup from actual reachability. It also calls out the cold-start gap:
--bootstrapis a configurable mechanism, but there is no public bootstrap deployment plan. The real two-router/NAT checks and sandbox evaluation remain outstanding, so I have not checked those items off. /cc @rvnminers-A-and-NThe source-based connectivity note from PR #743 is now merged as
e00acf0. It separates DHT/mDNS discovery, opportunistic hole punching, relay fallback, and location lookup from verified reachability, and records the cold-start bootstrap limitation. This is documentation/research progress only; I have left the discovery/NAT and sandbox acceptance items open because they still need design and real-machine validation. /cc @rvnminers-A-and-NBacklog audit catch-up: #306’s abuse-boundary research note was merged, but #22 did not record it. I linked it under Progress and marked only the documentation/research slice complete. The abuse-policy checkbox remains open: reporting, enforcement, acceptable-work rules and resource budgets still need decisions. /cc @rvnminers-A-and-N