Skip to content

fix(apps): signed host allowlist per app; e2e tests never join a live network; v0.3.5 - #228

Merged
ralyodio merged 1 commit into
masterfrom
fix/apps-hosts-allowlist
Nov 9, 2026
Merged

ralyodio merged 1 commit into
masterfrom
fix/apps-hosts-allowlist

Conversation

@ralyodio

@ralyodio ralyodio commented Nov 9, 2026

Copy link
Copy Markdown
Collaborator

Found live on dev2: apps_e2e's loopback test nodes discovered the real network over mDNS, took copies of a real app, received its sealed secrets from the real holder, and published fake "snapshots" encrypted with the real app key, which the real node then restored (tar: invalid tar magic).

  • AppRecord.hosts: a signed allowlist of peers that may hold an app (omitted when empty, so existing records still verify). Each app sees a view scoped to that list: nodes off it never take a copy, are never elected, never receive secrets and are never a snapshot source. Exposed as apps deploy --host, hosts = [...] in c0mpute.toml, and in the MCP tool.
  • Tests: apps_e2e and hosting_parts_e2e set C0MPUTE_DISABLE_MDNS, so they talk to loopback peers only.

Local verification was cargo check only (dev2's disk is at 99%), so CI runs the tests.

🤖 Generated with Claude Code

… network; v0.3.5

Found live on dev2: apps_e2e's loopback nodes discovered the real network
over mDNS, took copies of a real app (they had no owner allowlist), received
its sealed secrets from the real holder as legitimate newcomers, promoted at
higher epochs and published "snapshots" of the test's fake state encrypted
with the real app key. The real node then restored those ("tar: invalid tar
magic") and the demo app's state was lost.

- AppRecord.hosts (signed; omitted when empty so existing records verify):
  peers allowed to hold the app. Each app sees a view scoped to its list, so
  nodes off it never take a copy, are never elected, are never sealed
  secrets and are never a snapshot source; a holder dropped from the list
  lets go. `c0mpute apps deploy --host <peer>`, `hosts = [...]` in
  c0mpute.toml, `hosts` in the MCP deploy tool. Docs say plainly that
  without it every holder gets the app's secrets.
- apps_e2e and hosting_parts_e2e set C0MPUTE_DISABLE_MDNS: loopback peers only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 9, 2026

Copy link
Copy Markdown

ThreatCrush Security Scan

13 finding(s)

HIGH/CRITICAL: 1 | MEDIUM: 8 | LOW: 4

Severity Rule Location
HIGH js-ssrf-outbound-request apps/web/public/sw.js:24
MEDIUM js-unescaped-html-sink apps/web/src/app/blog/[slug]/page.tsx:53
MEDIUM js-unescaped-html-sink apps/web/src/app/layout.tsx:89
MEDIUM sh-remote-script-execution scripts/dev-setup.sh:25
MEDIUM sh-eval-expansion scripts/dev-setup.sh:35
MEDIUM sh-remote-script-execution scripts/install.sh:181
MEDIUM sh-remote-script-execution scripts/install.sh:206
MEDIUM sh-remote-script-execution scripts/install.sh:399
MEDIUM sh-remote-script-execution scripts/install.sh:441
LOW py-ssrf-outbound-request examples/business-strategist-agent/chat.py:37
LOW py-ssrf-outbound-request examples/business-strategist-agent/train.py:54
LOW secret-generic-credential node/crates/c0mpute-core/src/webhook.rs:1171
LOW py-path-traversal node/crates/c0mpute-core/tests/fixtures/fake-infernet-text:29

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit 91d42bf into master Nov 9, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant