Only signed software
Runcrate signs every release offline with an ed25519 key. The installer checks the agent’s signature withopenssl before it installs anything, and the installer itself is signed the same way. The agent carries the same public key: it only installs an update that Runcrate signed and that is newer than the one running, and only boots a VM image Runcrate signed. A compromised download server can’t push code to your machine. The previous agent stays at /usr/local/bin/runcrate-host.prev.
Outbound HTTPS only
The agent calls Runcrate every 10 seconds over HTTPS with the machine’s state and gets back its commands: start a VM, stop one, take back a spot GPU, drain, benchmark, update. Nothing on your network needs to accept a connection, so the machine can sit behind NAT. Customers reach their VM through an outbound tunnel the VM opens to Runcrate, not through your network. The one exception: while a benchmark runs on two or more machines on the same site, iperf3 (and ib_write_bw with InfiniBand) listens on their private addresses for up to 5 minutes, open only to the site’s other machines.How customer VMs are isolated
Every customer workload runs in a KVM virtual machine with its GPUs passed through. Customers never get a shell on your machine.- Each VM has its own network. A tap device and a /30 from
10.254.0.0/16, with no shared layer 2 between VMs. - Internet only. The firewall (nftables table
inet runcrate_host) lets a VM reach the internet through NAT and nothing else: not your machine, not other VMs, not private, link-local or carrier NAT ranges. Nothing from outside can open a connection into a VM. - Watched, not set and forgotten. The firewall is re-applied every 5 seconds. Whenever the agent isn’t running (stopped, crashed, updating or removed), every VM’s network is set down, so isolation never depends on a firewall nobody is watching.
- One host service. The only thing on your machine a VM can reach is the metadata server at
169.254.169.254, which answers each VM only about itself. - Your firewall stays yours. If Docker or ufw set the FORWARD policy to DROP, the agent adds two narrow accept rules for its own
rc-*interfaces. If IPv4 forwarding was off before the install, the agent drops any other forwarding, so your machine doesn’t start routing for anything else. To keep VMs away from more ranges, add them toblocked_cidrsin/etc/runcrate-host/config.json.
Isolation checks
The GPU check boots a throwaway VM that tries to reach what a customer VM must and must never reach, on your machine and your network:
Meanwhile your machine checks the other direction: a throwaway network namespace, routed through your machine the way a computer on your LAN would be, tries to open a connection to the VM and must fail. Each result, with what it tried, shows on the machine’s page in the dashboard. Re-run them at any time with Re-run check.
After every rental
When a rental ends, the agent stops the VM, overwrites its disk with zeros and deletes it. Then it boots a throwaway VM that overwrites the memory of the GPUs before they can be rented again.What the agent can and can’t see
The agent can see:- the hardware: CPU, RAM, disk space, PCI devices, network cards and their speeds, and private IPv4 addresses (reported to group machines on a site);
- the VMs it runs: their size, state and GPUs;
- each customer’s setup script, which it hands to the VM in its boot seed (root only, deleted with the VM).
What you, as root, could see
An administrator can always read the memory and disk of VMs running on hardware they control. Runcrate doesn’t pretend otherwise. Customers are protected from you by your agreement with Runcrate, which forbids opening, inspecting or copying a VM, its memory, its disks or its traffic, and by the wipe after every rental. You are protected from customers by keeping their code inside VMs with no route into your network.What the agent installs
The installer adds the packages QEMU/KVM, OVMF, nftables, genisoimage and iperf3 (and perftest when InfiniBand is present). It creates the unprivilegedruncrate-vm user, and the agent adds one more user per VM slot (runcrate-vm-<slot>), so each VM’s QEMU runs confined as its own user. Then it writes these files:
/usr/local/bin/runcrate-host: the agent./etc/runcrate-host/: its config,config.json, and the machine’s credential,credential. Root only./var/lib/runcrate-host/: VM disks, the base image and the agent’s state. Root only./etc/systemd/system/: the agent’s service,runcrate-host.service, andruncrate-host-gpus.service, which moves the GPUs you gave Runcrate tovfio-pciat boot so no host driver takes them./etc/modules-load.d/:runcrate-host.conf, which loads the KVM and VFIO modules at boot./etc/modprobe.d/:runcrate-host-vfio.conf, only when Runcrate has every GPU, sovfio-pciclaims them before any host driver./etc/udev/rules.d/:90-runcrate-host.rules, which gives groupkvmaccess to/dev/vhost-net./etc/default/grub.d/:90-runcrate-host.cfg, only if the installer turned on the IOMMU.
Useful commands
sudo runcrate-host status lists each VM’s id. To read a VM’s serial console, its last 1 MB, run sudo runcrate-host console with that id.