Skip to content
This chapter explains boundaries the shipped runtime enforces, but no command the documentation gate runs demonstrates them; space status is shown rather than run because its output varies per host.

Threat model

This page is the security model of SpaceOS: what each boundary protects, what enforces it, and what it does not cover.

Local development runs are outside this model. Do not use a local run as evidence that a flight release, association key, or node trust root was admitted.

Assets

The controls in this model protect these assets:

  • the integrity and publisher identity of release bytes and build evidence;
  • the authority assigned to each project, partition, and service;
  • the integrity and freshness of capability and release metadata;
  • the isolation of the node control plane from an untrusted workload;
  • the integrity, source identity, and freshness of frame and bundle traffic;
  • the availability of the runner and of workloads outside a failed service;
  • private signing, association, and workload keys.

Mission payload confidentiality is also an asset. The ground paths do not protect it today, and the section on link and bundle traffic below marks that where the claim is made.

Trust boundaries

BoundaryUntrusted sideTrusted sideEnforcement
Release store to admissionOCI content, metadata, and transportPinned publisher and TUF root keysDigest checks, signed statements, target path and length checks, and metadata version floors
Capability to runnerRequested identity, artifact, interfaces, storage, and secretsPinned capability issuers and the runnerSigned capability, artifact digest binding, rollback floor, and subset checks
Workload to nodeWorkload process and guest-written dataRunner, node kernel, hypervisor, and device backendsThe selected isolation backend and narrow host interfaces
Workload to frame busFrames supplied by one service socketspace-net routerSocket-derived service identity, source APID range, and destination allow-list
Ground link to relayReceived framesRelay association state and keyFrame authentication and anti-replay checks
Bundle transport to DTN serviceReceived bundlesBPSec integrity key and replay stateBIB verification, integrity scope, age, and replay checks
Operator to nodeNoneNode operator and platform administratorThe operator is trusted by this model

A tag in the local store selects the trust chain the first row is enforced against, and a tag is a mutable pointer. Signing and verification states what that bounds and what it does not.

The isolation backend changes the workload boundary:

  • runc shares the node kernel. The runner applies a user namespace, seccomp, dropped capabilities, no-new-privileges, cgroups, a read-only root filesystem, and separate network namespaces under the default policy.
  • Solo5 SPT is a kernel-process boundary with seccomp, dropped capabilities, no-new-privileges, and a read-only image. It has no user namespace or cgroup boundary.
  • Solo5 HVT, Firecracker, and QEMU use a hardware-virtualisation boundary. They still trust the host kernel, tender or virtual machine monitor, and hardware virtualisation implementation.
  • Host execution has no workload isolation boundary. It is limited to targets that explicitly allow it and is not a tenant security mechanism.
  • The trusted host-network exception weakens the normal container boundary. It is for trusted platform services, not tenant workloads.

Read the boundary a workload runs behind

Read which row of that list applies to a given workload. Do not assume the backend. space status reports every workload the runner supervises with its lifecycle state, its isolation backend, and its image digest. The backend column names the boundary. The command queries the live runner and mutates nothing: it starts no daemon, no image and no virtual machine, and on a machine with no local runner it says so and exits zero.

Terminal window
$ space status

--json prints the same report as canonical JSON, which is the form to assert against in a test.

Adversaries

This model considers:

  • an attacker who can replace or modify release and capability bytes but does not hold an accepted signing key;
  • an attacker who can inject, modify, or replay link traffic but does not hold the association or bundle integrity key;
  • a compromised workload that can use all authority granted to its service and can send malformed data through every interface it owns;
  • a compromised container process that attempts to reach the shared node kernel or other workloads;
  • an operator error that grants more authority than intended.

This model does not defend against a malicious node operator, a compromised publisher with an accepted key, compromised firmware or hypervisor, physical attacks, hardware side channels, or denial of service by an administrator.

Threats and mitigations

Modified release or build evidence

The source implementation verifies digest-valued SBOM and provenance annotations, the referenced blobs, in-toto statements, detached SCITT statements, and their subjects. The launch-trust verifier checks a signed TUF chain and matches the authorised target path, byte length, and SHA-256 digest.

A signature proves which accepted key authorised the bytes. It does not prove that the source code is correct, that the build host was clean, or that the publisher intended a safe change.

Replayed release or capability

The release verifier compares submitted root and targets versions with retained versions. The capability verifier rejects a rollback index below the retained floor. These checks depend on durable, authentic retained state.

Capability escalation

The runner binds a capability to the project, partition, and exact launch digest. It rejects requested credentials, APIDs, routes, bridges, host ports, and data links that are not subsets of the signed capability.

This control cannot correct an over-broad capability. The issuer must grant the minimum required authority.

Frame-bus spoofing and lateral movement

Each frame-bus service receives its own Unix socket. The router derives the service identity from that socket. It checks the frame’s source APID against the service range and applies the service’s send_to list to local destinations. An empty list denies local service-to-service delivery.

APIDs are routing labels. They are not credentials.

The SDLS relay authenticates frames and checks its sequence window. The BPSec receiver requires a BIB over the payload, verifies its integrity scope, and rejects wrong-key, stale, and replayed bundles.

Malformed supervision data

A compromised guest can write any byte in its shared supervision page. The runner treats guest status and health as untrusted. It reads the health field with a fixed bound and evaluates heartbeat progress against the host clock. A stalled heartbeat can trigger workload recovery. It does not prove that a responsive workload is correct.

Workload escape

The runner reports runc as a kernel-process boundary and the virtual-machine backends as hardware-virtualisation boundaries. A container escape can attack the shared node kernel. A virtual-machine escape can attack the hypervisor or host. Neither boundary protects a workload from the node operator.

Resource exhaustion

The runc configuration applies memory, CPU, and process limits. Supervision can restart or park a workload whose process exits or heartbeat stalls. These controls reduce interference from one service. They do not guarantee node or mission availability under every workload, kernel, storage, or traffic fault.

Credential access

The runner checks requested credential identifiers against the signed capability. For runc, it refuses missing files, symlink sources, malformed container paths, and ownership that the workload user namespace cannot read. Credentials are mounted read-only into the named service.

The node operator and node kernel remain inside this trust boundary.

Assumptions

The controls above require all of the following:

  • accepted public keys are provisioned through an independent trusted channel;
  • private keys remain secret and are rotated after suspected compromise;
  • cryptographic implementations and random-number sources work as specified;
  • retained rollback state cannot be deleted or replaced by an attacker;
  • the node kernel, runner, firmware, hypervisor, and hardware enforce their documented boundaries;
  • the selected backend is available and matches the admitted launch plan;
  • release and capability issuers apply least privilege;
  • operational monitoring notices repeated refusals, restarts, and resource pressure.

Residual risks

  • The current ground paths do not provide payload confidentiality.
  • A trusted publisher can sign a malicious release.
  • A broad but valid capability authorises broad access.
  • A runc workload shares the node kernel. A kernel vulnerability can cross the container boundary.
  • Hardware-virtualisation backends depend on the host, hypervisor, tender, and CPU isolation implementation.
  • Host execution and the trusted host-network exception weaken workload isolation by design.
  • Heartbeat monitoring detects lack of progress, not incorrect output.
  • Resource controls do not prevent every denial-of-service condition.
  • Local development execution is not evidence of flight admission or link protection.
  • Tests exercise specific behaviours. They are not a formal proof of the complete system.

Outside this model

Four areas have their own boundaries and are not analysed here: board secure boot, physical protection of the spacecraft and the ground station, mission command policy, and incident response. Each needs its own threat model, and a control on this page never stands in for one of them.