Skip to content

Security: andrebassi/runner-codes

Security

docs/security.md

Security Model

Table of Contents

  1. Threat Model
  2. Isolation Layers
  3. Attack Surface Analysis
  4. Seccomp Profiles
  5. Jailer Configuration
  6. Network Isolation
  7. Resource Limits
  8. Secrets Management
  9. Hardening Checklist

Threat Model

Adversary Profile

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    THREAT MODEL                              β”‚
β”‚                                                              β”‚
β”‚  Adversary: Malicious LLM-generated code                    β”‚
β”‚                                                              β”‚
β”‚  Assumptions:                                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Code is UNTRUSTED and potentially malicious      β”‚    β”‚
β”‚  β”‚  - Adversary has arbitrary code execution in guest  β”‚    β”‚
β”‚  β”‚  - Adversary knows the sandbox architecture         β”‚    β”‚
β”‚  β”‚  - Adversary may attempt multi-stage attacks        β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Goals:                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Prevent escape from guest to host                β”‚    β”‚
β”‚  β”‚  - Prevent access to other guests' data             β”‚    β”‚
β”‚  β”‚  - Prevent persistent compromise                    β”‚    β”‚
β”‚  β”‚  - Prevent resource exhaustion (DoS)                β”‚    β”‚
β”‚  β”‚  - Prevent data exfiltration                        β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Attack Scenarios

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    ATTACK SCENARIOS                          β”‚
β”‚                                                              β”‚
β”‚  1. GUEST-TO-HOST ESCAPE                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Attack Vector:                                      β”‚    β”‚
β”‚  β”‚  - Exploit bug in Firecracker VMM                   β”‚    β”‚
β”‚  β”‚  - Exploit bug in virtio device emulation           β”‚    β”‚
β”‚  β”‚  - Exploit KVM vulnerability                        β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Mitigations:                                        β”‚    β”‚
β”‚  β”‚  - Firecracker written in Rust (memory safe)        β”‚    β”‚
β”‚  β”‚  - Minimal device model (small attack surface)      β”‚    β”‚
β”‚  β”‚  - Seccomp filtering in VMM                         β”‚    β”‚
β”‚  β”‚  - Jailer drops privileges                          β”‚    β”‚
β”‚  β”‚  - Regular security updates                         β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  2. LATERAL MOVEMENT (Guest-to-Guest)                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Attack Vector:                                      β”‚    β”‚
β”‚  β”‚  - Side-channel attacks (Spectre, Meltdown)         β”‚    β”‚
β”‚  β”‚  - Shared resource timing attacks                   β”‚    β”‚
β”‚  β”‚  - Covert channels via cache/memory                 β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Mitigations:                                        β”‚    β”‚
β”‚  β”‚  - Each job in separate VM (full isolation)         β”‚    β”‚
β”‚  β”‚  - VMs destroyed after execution                    β”‚    β”‚
β”‚  β”‚  - No shared state between executions               β”‚    β”‚
β”‚  β”‚  - CPU microcode patches                            β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  3. DATA EXFILTRATION                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Attack Vector:                                      β”‚    β”‚
β”‚  β”‚  - Network access to external servers               β”‚    β”‚
β”‚  β”‚  - DNS tunneling                                    β”‚    β”‚
β”‚  β”‚  - Covert timing channels                           β”‚    β”‚
β”‚  β”‚  - Large stdout/stderr output                       β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Mitigations:                                        β”‚    β”‚
β”‚  β”‚  - No network interface by default                  β”‚    β”‚
β”‚  β”‚  - Output size limits                               β”‚    β”‚
β”‚  β”‚  - Execution time limits                            β”‚    β”‚
β”‚  β”‚  - No persistent storage                            β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  4. DENIAL OF SERVICE                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Attack Vector:                                      β”‚    β”‚
β”‚  β”‚  - CPU exhaustion (infinite loops)                  β”‚    β”‚
β”‚  β”‚  - Memory exhaustion (allocation bombs)             β”‚    β”‚
β”‚  β”‚  - Disk exhaustion (write loops)                    β”‚    β”‚
β”‚  β”‚  - Fork bombs                                       β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Mitigations:                                        β”‚    β”‚
β”‚  β”‚  - Hard execution timeout                           β”‚    β”‚
β”‚  β”‚  - Memory limit (512 MiB)                           β”‚    β”‚
β”‚  β”‚  - Disk is tmpfs (limited size)                     β”‚    β”‚
β”‚  β”‚  - No fork capability in guest                      β”‚    β”‚
β”‚  β”‚  - Rate limiting at control plane                   β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  5. CRYPTOMINING / RESOURCE ABUSE                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Attack Vector:                                      β”‚    β”‚
β”‚  β”‚  - Use allocated CPU for mining                     β”‚    β”‚
β”‚  β”‚  - Long-running background processes                β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Mitigations:                                        β”‚    β”‚
β”‚  β”‚  - Short execution timeout (10s default)            β”‚    β”‚
β”‚  β”‚  - VM destroyed after each job                      β”‚    β”‚
β”‚  β”‚  - No network (can't submit mining results)         β”‚    β”‚
β”‚  β”‚  - CPU accounting/billing                           β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Isolation Layers

Defense in Depth

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    ISOLATION LAYERS                          β”‚
β”‚                                                              β”‚
β”‚  Layer 5: APPLICATION SANDBOX                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Temp directory per execution                     β”‚    β”‚
β”‚  β”‚  - Limited file system access                       β”‚    β”‚
β”‚  β”‚  - No access to guest-runner internals              β”‚    β”‚
β”‚  β”‚  - Process killed after timeout                     β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                         β”‚                                    β”‚
β”‚                         β–Ό                                    β”‚
β”‚  Layer 4: GUEST USERSPACE                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Minimal rootfs (no extra tools)                  β”‚    β”‚
β”‚  β”‚  - No setuid binaries                               β”‚    β”‚
β”‚  β”‚  - No sudo/su                                       β”‚    β”‚
β”‚  β”‚  - Read-only rootfs (optional)                      β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                         β”‚                                    β”‚
β”‚                         β–Ό                                    β”‚
β”‚  Layer 3: GUEST KERNEL                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Minimal kernel config                            β”‚    β”‚
β”‚  β”‚  - No kernel modules loading                        β”‚    β”‚
β”‚  β”‚  - No network stack (optional)                      β”‚    β”‚
β”‚  β”‚  - Hardened kernel options                          β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                         β”‚                                    β”‚
β”‚                         β–Ό                                    β”‚
β”‚  Layer 2: FIRECRACKER VMM                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Rust (memory safety)                             β”‚    β”‚
β”‚  β”‚  - Minimal device model                             β”‚    β”‚
β”‚  β”‚  - Seccomp-bpf filtering                            β”‚    β”‚
β”‚  β”‚  - No legacy devices                                β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                         β”‚                                    β”‚
β”‚                         β–Ό                                    β”‚
β”‚  Layer 1: JAILER                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - chroot isolation                                 β”‚    β”‚
β”‚  β”‚  - User namespace (unprivileged)                    β”‚    β”‚
β”‚  β”‚  - Dropped capabilities                             β”‚    β”‚
β”‚  β”‚  - Cgroup resource limits                           β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                         β”‚                                    β”‚
β”‚                         β–Ό                                    β”‚
β”‚  Layer 0: KVM / HARDWARE                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Hardware virtualization (VT-x/AMD-V)             β”‚    β”‚
β”‚  β”‚  - EPT/NPT memory isolation                         β”‚    β”‚
β”‚  β”‚  - Separate address spaces                          β”‚    β”‚
β”‚  β”‚  - Privileged instruction trapping                  β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Attack Surface Analysis

Firecracker Attack Surface

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    ATTACK SURFACE                            β”‚
β”‚                                                              β”‚
β”‚  GUEST β†’ VMM INTERFACES                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Interface          β”‚ Attack Surface β”‚ Risk Level   β”‚    β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€    β”‚
β”‚  β”‚  virtio-blk         β”‚ Low            β”‚ Medium       β”‚    β”‚
β”‚  β”‚  virtio-net         β”‚ Medium         β”‚ High         β”‚    β”‚
β”‚  β”‚  virtio-vsock       β”‚ Low            β”‚ Low          β”‚    β”‚
β”‚  β”‚  Serial console     β”‚ Very Low       β”‚ Low          β”‚    β”‚
β”‚  β”‚  RTC                β”‚ Very Low       β”‚ Very Low     β”‚    β”‚
β”‚  β”‚  KVM ioctls         β”‚ High           β”‚ Critical     β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Recommendation:                                             β”‚
β”‚  - Disable virtio-net if not needed (we do this)           β”‚
β”‚  - Minimize virtio-blk operations                           β”‚
β”‚  - Use read-only rootfs where possible                      β”‚
β”‚                                                              β”‚
β”‚  HOST β†’ VMM INTERFACES                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Interface          β”‚ Attack Surface β”‚ Risk Level   β”‚    β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€    β”‚
β”‚  β”‚  API socket         β”‚ Low            β”‚ Medium       β”‚    β”‚
β”‚  β”‚  vsock UDS          β”‚ Low            β”‚ Low          β”‚    β”‚
β”‚  β”‚  File paths         β”‚ Medium         β”‚ Medium       β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Recommendation:                                             β”‚
β”‚  - API socket only accessible by host-agent                 β”‚
β”‚  - Validate all file paths                                  β”‚
β”‚  - Use jailer chroot                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Comparison: Firecracker vs Containers

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                FIRECRACKER vs CONTAINERS                     β”‚
β”‚                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  Aspect              β”‚ Firecracker β”‚ Containers      β”‚   β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€   β”‚
β”‚  β”‚  Kernel              β”‚ Separate    β”‚ Shared          β”‚   β”‚
β”‚  β”‚  Syscall exposure    β”‚ ~50 VMM     β”‚ ~300+ host      β”‚   β”‚
β”‚  β”‚  Device drivers      β”‚ VMM only    β”‚ All host        β”‚   β”‚
β”‚  β”‚  Memory isolation    β”‚ Hardware    β”‚ Software        β”‚   β”‚
β”‚  β”‚  Escape complexity   β”‚ Very High   β”‚ Medium          β”‚   β”‚
β”‚  β”‚  CVE impact scope    β”‚ Guest only  β”‚ All containers  β”‚   β”‚
β”‚  β”‚  Startup time        β”‚ ~150ms      β”‚ ~50ms           β”‚   β”‚
β”‚  β”‚  Memory overhead     β”‚ ~5 MiB VMM  β”‚ ~0 (shared)     β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                              β”‚
β”‚  Verdict: Firecracker provides stronger isolation at        β”‚
β”‚  the cost of slightly higher resource usage and latency.    β”‚
β”‚  For untrusted code execution, this tradeoff is worthwhile. β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Seccomp Profiles

Firecracker Seccomp (Default)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    FIRECRACKER SECCOMP                       β”‚
β”‚                                                              β”‚
β”‚  Allowed Syscalls (~50):                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  File I/O:                                           β”‚    β”‚
β”‚  β”‚    read, write, close, fstat, lseek, pread64,       β”‚    β”‚
β”‚  β”‚    pwrite64, readv, writev, fsync, fdatasync        β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Memory:                                             β”‚    β”‚
β”‚  β”‚    mmap, mprotect, munmap, brk, mremap              β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Process:                                            β”‚    β”‚
β”‚  β”‚    exit, exit_group, rt_sigaction, rt_sigprocmask,  β”‚    β”‚
β”‚  β”‚    rt_sigreturn, getpid, gettid                     β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Synchronization:                                    β”‚    β”‚
β”‚  β”‚    futex, nanosleep, clock_gettime, clock_nanosleep β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Event/Timer:                                        β”‚    β”‚
β”‚  β”‚    epoll_create1, epoll_ctl, epoll_wait, epoll_pwaitβ”‚    β”‚
β”‚  β”‚    eventfd2, timerfd_create, timerfd_settime        β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Socket (for API):                                   β”‚    β”‚
β”‚  β”‚    socket, bind, listen, accept4, recvfrom, sendto  β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  KVM:                                                β”‚    β”‚
β”‚  β”‚    ioctl (filtered to KVM_* only)                   β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Misc:                                               β”‚    β”‚
β”‚  β”‚    fcntl, dup, pipe2, getrandom                     β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Blocked (High Risk):                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Process creation: fork, clone, execve, vfork       β”‚    β”‚
β”‚  β”‚  Privilege: setuid, setgid, capset, personality     β”‚    β”‚
β”‚  β”‚  Mount: mount, umount2, pivot_root, chroot          β”‚    β”‚
β”‚  β”‚  Modules: init_module, delete_module, finit_module  β”‚    β”‚
β”‚  β”‚  Debug: ptrace, process_vm_readv, process_vm_writev β”‚    β”‚
β”‚  β”‚  Network config: socket(AF_NETLINK), sethostname    β”‚    β”‚
β”‚  β”‚  Namespaces: unshare, setns                         β”‚    β”‚
β”‚  β”‚  Keyring: keyctl, add_key, request_key              β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Action on violation: SCMP_ACT_TRAP (SIGSYS β†’ kill)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Custom Seccomp for Guest-Runner

// Additional seccomp for guest-runner (inside VM)
// Applied after fork, before exec of interpreter

#include <seccomp.h>

int apply_seccomp() {
    scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL);

    // Allow basic I/O
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0);
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0);
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fstat), 0);
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(lseek), 0);

    // Allow memory management
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap), 0);
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), 0);
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(munmap), 0);
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0);

    // Allow process exit
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0);
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);

    // Block dangerous syscalls explicitly
    // (Already blocked by default action, but explicit is clearer)

    // NO: fork, clone, execve (except initial exec)
    // NO: socket (no network)
    // NO: ptrace
    // NO: mount, chroot
    // NO: setuid, setgid

    return seccomp_load(ctx);
}

Jailer Configuration

Production Jailer Setup

#!/bin/bash
# jailer-setup.sh

# Variables
JAIL_DIR="/srv/jailer"
EXEC_FILE="/usr/local/bin/firecracker"
INSTANCE_ID="vm-$(uuidgen)"
UID=65534  # nobody
GID=65534  # nogroup

# Create jailer directory structure
mkdir -p "${JAIL_DIR}/${INSTANCE_ID}/root"

# Run with jailer
/usr/local/bin/jailer \
    --id "${INSTANCE_ID}" \
    --exec-file "${EXEC_FILE}" \
    --uid "${UID}" \
    --gid "${GID}" \
    --chroot-base-dir "${JAIL_DIR}" \
    --netns /var/run/netns/fc-net-${INSTANCE_ID} \
    --daemonize \
    --new-pid-ns \
    --cgroup cpuset.cpus=0 \
    --cgroup cpuset.mems=0 \
    --cgroup cpu.max="100000 100000" \
    --cgroup memory.max=536870912 \
    --cgroup pids.max=100 \
    -- \
    --config-file /config.json

# Jail directory structure after jailer runs:
#
# /srv/jailer/vm-xxx/root/
# β”œβ”€β”€ dev/
# β”‚   β”œβ”€β”€ kvm          (bind mount from /dev/kvm)
# β”‚   β”œβ”€β”€ urandom      (bind mount from /dev/urandom)
# β”‚   └── null         (bind mount from /dev/null)
# β”œβ”€β”€ firecracker      (hardlink to /usr/local/bin/firecracker)
# β”œβ”€β”€ kernel.bin       (hardlink)
# β”œβ”€β”€ rootfs.ext4      (hardlink, cow if needed)
# β”œβ”€β”€ config.json      (copied)
# └── run/
#     └── firecracker.socket

Jailer Security Features

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    JAILER SECURITY                           β”‚
β”‚                                                              β”‚
β”‚  1. CHROOT ISOLATION                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Firecracker sees only its jail directory        β”‚    β”‚
β”‚  β”‚  - Cannot access /etc, /home, or other host paths   β”‚    β”‚
β”‚  β”‚  - Minimal /dev with only required devices          β”‚    β”‚
β”‚  β”‚  - No /proc, /sys access                            β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  2. USER/GROUP MAPPING                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  --uid 65534  (nobody)                              β”‚    β”‚
β”‚  β”‚  --gid 65534  (nogroup)                             β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Even if Firecracker is compromised, attacker has   β”‚    β”‚
β”‚  β”‚  no privileges on the host system.                  β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  3. CGROUP LIMITS                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  cpu.max = "100000 100000"                          β”‚    β”‚
β”‚  β”‚    β†’ Max 100% of 1 CPU (100ms per 100ms period)    β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  memory.max = 536870912 (512 MiB)                   β”‚    β”‚
β”‚  β”‚    β†’ Hard memory limit, OOM kill if exceeded        β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  pids.max = 100                                      β”‚    β”‚
β”‚  β”‚    β†’ Max 100 processes (prevent fork bombs)         β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  cpuset.cpus = "0"                                   β”‚    β”‚
β”‚  β”‚    β†’ Pin to specific CPU (cache isolation)          β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  4. NETWORK NAMESPACE                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  --netns /var/run/netns/fc-net-xxx                  β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Isolate network stack. For no-network mode:        β”‚    β”‚
β”‚  β”‚    ip netns add fc-net-xxx                          β”‚    β”‚
β”‚  β”‚    (empty namespace with no interfaces)             β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  5. PID NAMESPACE                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  --new-pid-ns                                        β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Firecracker is PID 1 in its namespace.             β”‚    β”‚
β”‚  β”‚  Cannot see or signal other host processes.         β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Network Isolation

No-Network Configuration (Default)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    NETWORK ISOLATION                         β”‚
β”‚                                                              β”‚
β”‚  Default: NO NETWORK                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - No virtio-net device attached                    β”‚    β”‚
β”‚  β”‚  - Guest has no network interfaces (except lo)      β”‚    β”‚
β”‚  β”‚  - No IP address, no routing                        β”‚    β”‚
β”‚  β”‚  - DNS resolution fails                             β”‚    β”‚
β”‚  β”‚  - Cannot connect to external servers               β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Guest /etc/hosts (minimal):                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  127.0.0.1   localhost                              β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Why no network?                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Prevents C2 (command & control) communication   β”‚    β”‚
β”‚  β”‚  - Prevents data exfiltration                       β”‚    β”‚
β”‚  β”‚  - Prevents cryptocurrency mining submission        β”‚    β”‚
β”‚  β”‚  - Prevents attack amplification (DDoS)             β”‚    β”‚
β”‚  β”‚  - Prevents lateral movement                        β”‚    β”‚
β”‚  β”‚  - Reduces attack surface (no virtio-net)          β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Communication Channel:                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Only vsock (host-controlled, no external access)   β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Host ◄──── vsock ────► Guest                       β”‚    β”‚
β”‚  β”‚   β–²                                                  β”‚    β”‚
β”‚  β”‚   β”‚                                                  β”‚    β”‚
β”‚  β”‚   └── Control Plane (API, rate limiting, auth)      β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Optional: Limited Network (if needed)

# Only if network access is required (e.g., package downloads)
# Use host-side firewall to restrict

# Create network namespace with outbound-only rules
ip netns add fc-net-${ID}

# Add veth pair
ip link add veth-host type veth peer name veth-guest
ip link set veth-guest netns fc-net-${ID}

# Configure IP addresses
ip addr add 172.16.0.1/30 dev veth-host
ip netns exec fc-net-${ID} ip addr add 172.16.0.2/30 dev veth-guest

# Enable NAT for outbound
iptables -t nat -A POSTROUTING -s 172.16.0.0/30 -j MASQUERADE

# BLOCK ALL INBOUND
iptables -A FORWARD -d 172.16.0.0/30 -m state --state NEW -j DROP

# Allow only specific outbound (e.g., PyPI)
iptables -A FORWARD -s 172.16.0.0/30 -d pypi.org -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 172.16.0.0/30 -j DROP  # Block everything else

Resource Limits

Limit Configuration

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    RESOURCE LIMITS                           β”‚
β”‚                                                              β”‚
β”‚  VM Configuration:                                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  vcpu_count: 1              # Single vCPU           β”‚    β”‚
β”‚  β”‚  mem_size_mib: 512          # 512 MiB RAM           β”‚    β”‚
β”‚  β”‚  ht_enabled: false          # No hyperthreading     β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Execution Limits:                                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Timeout: 10 seconds (configurable)                 β”‚    β”‚
β”‚  β”‚  Max stdout: 1 MiB                                  β”‚    β”‚
β”‚  β”‚  Max stderr: 1 MiB                                  β”‚    β”‚
β”‚  β”‚  Max code size: 64 KiB                              β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Cgroup Limits (via Jailer):                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  cpu.max: "100000 100000"   # 100% of 1 CPU        β”‚    β”‚
β”‚  β”‚  memory.max: 536870912      # 512 MiB              β”‚    β”‚
β”‚  β”‚  memory.swap.max: 0         # No swap              β”‚    β”‚
β”‚  β”‚  pids.max: 100              # Max processes        β”‚    β”‚
β”‚  β”‚  io.max: "8:0 riops=1000"   # I/O rate limit      β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Rate Limiters (Firecracker):                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Block device:                                      β”‚    β”‚
β”‚  β”‚    bandwidth: 100 MiB/s                            β”‚    β”‚
β”‚  β”‚    ops: 1000 IOPS                                  β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  Network (if enabled):                              β”‚    β”‚
β”‚  β”‚    bandwidth: 10 Mbit/s                            β”‚    β”‚
β”‚  β”‚    ops: 1000 packets/s                             β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Enforcement Mechanism

// Timeout enforcement in guest-runner
func (e *Executor) Execute(job Job) Result {
    timeout := time.Duration(job.Timeout) * time.Second
    if timeout <= 0 || timeout > 60*time.Second {
        timeout = 10 * time.Second  // Default/max
    }

    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()

    cmd := exec.CommandContext(ctx, interpreter, scriptPath)

    // Set process group for reliable killing
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Setpgid: true,
    }

    err := cmd.Run()
    if ctx.Err() == context.DeadlineExceeded {
        // Kill process group
        syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)
        return Result{ExitCode: 124, Stderr: "Execution timed out"}
    }

    // ...
}

Secrets Management

Ephemeral Secrets Pattern

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    SECRETS MANAGEMENT                        β”‚
β”‚                                                              β”‚
β”‚  Principle: NO SECRETS IN GUEST                              β”‚
β”‚                                                              β”‚
β”‚  Default State:                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  - Guest has no access to host secrets              β”‚    β”‚
β”‚  β”‚  - No environment variables with secrets            β”‚    β”‚
β”‚  β”‚  - No mounted secret volumes                        β”‚    β”‚
β”‚  β”‚  - Code executes without credentials                β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  If Secrets Needed (Future):                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  1. Host-agent requests ephemeral credentials       β”‚    β”‚
β”‚  β”‚     from Vault/AWS STS/GCP IAM                      β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  2. Credentials have:                               β”‚    β”‚
β”‚  β”‚     - Short TTL (< execution timeout)               β”‚    β”‚
β”‚  β”‚     - Minimal permissions                           β”‚    β”‚
β”‚  β”‚     - Single-use if possible                        β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  3. Credentials injected via vsock (not env/file)   β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  4. Credentials revoked after execution             β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Secret Flow:                                                β”‚
β”‚                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Vault   │───►│ Host-Agent│───►│  Guest (vsock)    β”‚    β”‚
β”‚  β”‚          β”‚    β”‚           β”‚    β”‚                   β”‚    β”‚
β”‚  β”‚ TTL=30s  β”‚    β”‚ Encrypt   β”‚    β”‚ Use immediately   β”‚    β”‚
β”‚  β”‚ scope=X  β”‚    β”‚ in memory β”‚    β”‚ Clear from memory β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                         β”‚                                    β”‚
β”‚                         └──► Revoke after execution         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Hardening Checklist

Production Deployment Checklist

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    HARDENING CHECKLIST                       β”‚
β”‚                                                              β”‚
β”‚  HOST SYSTEM                                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  [ ] Kernel up-to-date with security patches        β”‚    β”‚
β”‚  β”‚  [ ] Spectre/Meltdown mitigations enabled           β”‚    β”‚
β”‚  β”‚  [ ] SELinux/AppArmor configured                    β”‚    β”‚
β”‚  β”‚  [ ] Firewall configured (no unnecessary ports)     β”‚    β”‚
β”‚  β”‚  [ ] SSH hardened (keys only, no root)              β”‚    β”‚
β”‚  β”‚  [ ] Audit logging enabled                          β”‚    β”‚
β”‚  β”‚  [ ] /dev/kvm permissions restricted                β”‚    β”‚
β”‚  β”‚  [ ] Host-agent runs as non-root (if possible)      β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  FIRECRACKER                                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  [ ] Latest Firecracker version                     β”‚    β”‚
β”‚  β”‚  [ ] Jailer enabled in production                   β”‚    β”‚
β”‚  β”‚  [ ] Seccomp filtering enabled                      β”‚    β”‚
β”‚  β”‚  [ ] API socket permissions restricted              β”‚    β”‚
β”‚  β”‚  [ ] No virtio-net unless required                  β”‚    β”‚
β”‚  β”‚  [ ] Rate limiters configured                       β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  GUEST                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  [ ] Minimal kernel config                          β”‚    β”‚
β”‚  β”‚  [ ] Minimal rootfs (no extra tools)                β”‚    β”‚
β”‚  β”‚  [ ] No setuid binaries                             β”‚    β”‚
β”‚  β”‚  [ ] Read-only rootfs (if possible)                 β”‚    β”‚
β”‚  β”‚  [ ] No persistent storage                          β”‚    β”‚
β”‚  β”‚  [ ] Guest-runner drops privileges                  β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  OPERATIONAL                                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  [ ] VM destroyed after each execution              β”‚    β”‚
β”‚  β”‚  [ ] Execution timeout enforced                     β”‚    β”‚
β”‚  β”‚  [ ] Output size limits enforced                    β”‚    β”‚
β”‚  β”‚  [ ] Rate limiting at control plane                 β”‚    β”‚
β”‚  β”‚  [ ] Monitoring and alerting configured             β”‚    β”‚
β”‚  β”‚  [ ] Incident response plan documented              β”‚    β”‚
β”‚  β”‚  [ ] Regular security audits scheduled              β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  LOGGING & MONITORING                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  [ ] All executions logged with trace_id            β”‚    β”‚
β”‚  β”‚  [ ] Failed executions alerted                      β”‚    β”‚
β”‚  β”‚  [ ] Resource usage monitored                       β”‚    β”‚
β”‚  β”‚  [ ] Anomaly detection enabled                      β”‚    β”‚
β”‚  β”‚  [ ] Logs shipped to secure storage                 β”‚    β”‚
β”‚  β”‚  [ ] Log retention policy defined                   β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

There aren’t any published security advisories