Skip to content

Test matrix

This page summarizes SECURITY_TEST_MATRIX.md. “Pass” means the invariant held on the listed kernels and environments; it is not a proof against unknown kernel defects.

EnvironmentCoverage
GitHub-hosted x86_64 VM (Ubuntu 24.04, rootful privileged Docker)Full sandbox suite and five-round adversarial repetition on every push and pull request
GitHub-hosted ARM64 VM (Ubuntu 24.04, rootful privileged Docker)The same suite and repetition
Production image (linux/amd64)Smoke test and the language toolchain test on every push and pull request
KernelsSuites pass on Linux 6.6, 6.12 and 6.16; 5.8 is the minimum supported
Local developmentOnly inside a disposable KVM guest (scripts/vm.sh)
FamilyProbes
Submitted pathsAbsolute paths, .., symlinks, /proc magic links, cross-mount hard links, directories, FIFOs, sockets, devices, parallel symlink swaps, RENAME_EXCHANGE swaps during directory creation
Root and mountsOld root absent, private propagation, read-only toolchains, empty /sys, subset=pid procfs, no cgroup filesystem, nodev,nosuid tmpfs
IdentityRequest-owned user namespace, distinct identities for concurrent requests, UID/GID map checks, setuid/setgid/setgroups, map rewriting, chroot, hostname, capability and ambient-capability regain
Process visibilityPer-task PID namespace, parallel tasks unable to see or signal each other, protected PID 1, denied /proc/1/root, orphan and double-fork reaping
File descriptorsOnly stdin, stdout and stderr survive exec
SyscallsEvery denied syscall invoked under each of the four profiles, including with a SIGSYS handler installed; socket-family rules; ENOSYS for unlisted calls under v2
NetworkInterfaces, IPv4/IPv6 routes, external connects, resolver files, native socket denial, unique namespace per runtime
Memory and processesReal OOM kills, own versus ancestor OOM, per-request cgroup sizing, no swap, fork exhaustion, peaks, cleanup
TimeoutsAtomic cgroup.kill, descendants holding stdout open, request deadline confined to its own request, later steps reported not_started
CPU and rlimitscpu.max throttling, RLIMIT_CPU, EMFILE, EFBIG, stack overflow, no core files
Outputstdout and stderr floods, binary output, truncation flags, per-request budget, concurrent stdin and stdout, large parallel results
LifecycleTimeout, signals, output and policy kills, setup failure, API cancellation, shutdown during multi-step requests, disconnecting clients, cgroup and root cleanup

Privileged containers share the test machine’s kernel, so these are excluded from the suites:

  • kernel exploits, public or private;
  • deliberate kernel panics, hung tasks or host-wide OOM;
  • speculative execution, cache timing, Rowhammer and other physical side channels;
  • malicious firmware, DMA, device passthrough and hypervisor attacks;
  • Docker daemon, runc or host-root compromise proofs of concept.

Testing them needs disposable VMs with crash detection, and Faber has no microVM backend yet, so passing the suite says nothing about protection from host-kernel compromise. See the isolation tier.