
Выполняет недоверенный код Python, JavaScript и Bash в усиленной изолированной среде с ограничениями в 5 секунд, 128 МБ, 0,5 ядра, а также лимитами на PID и объём вывода.
Выполнение недоверенного кода под принудительным контролем ядра — каждая полезная нагрузка изолирована cgroups v2, пространствами имён, seccomp-BPF и корневой ФС только для чтения, а каждый запуск фиксируется в аудите PostgreSQL.
python · javascript · bash → изоляция на 5 секунд, 128 МБ, 0.5 ядра, 32 PID, 512 КБ вывода
Служба выполнения кода с усиленной безопасностью для кода, которому вы не доверяете. Клиенты отправляют исходный код через небольшой REST API; демон запускает каждую полезную нагрузку в эфемерной изоляции на уровне ядра, где само ядро Linux — а не логика приложения — гарантирует сдерживание:
pivot_root на корневую ФС только для чтения),lo отключён + seccomp блокирует socket),PID · MOUNT · NET · IPC · UTS · USER), строгий белый список seccomp-BPF, ресурсные ограничения cgroups v2 и файловая система pivot_root только для чтения с 16 МБ временного пространства tmpfs.5 с по настенным часам, потолок памяти 128 МБ (swap отключён, мгновенное уничтожение по OOM), 0.5 ядра CPU, pids.max = 32 для защиты от fork-бомб и ограничение вывода 512 КБ для stdout/stderr.execution_runs).flowchart LR
CLI["👤 API Client<br/><i>tenant / CI job</i>"]
subgraph CP["🔐 Trusted Control Plane — Go daemon"]
API["Ingestion Daemon<br/><i>net/http :8080</i>"]
POOL["Warm Runner Pool<br/><i>16 slots · 3 s cap</i>"]
RUN["Process Runner<br/><i>watchdog + pipes</i>"]
ISO["Kernel Isolation<br/><i>cgroups v2 · namespaces · seccomp-BPF</i>"]
end
subgraph JAIL["⛓️ Ephemeral Kernel Jail — untrusted"]
INIT["sandbox_init<br/><i>exec trampoline</i>"]
GUEST["💀 Untrusted Code<br/><i>python · node · bash</i>"]
end
PG[("🗄️ PostgreSQL 16<br/><i>execution_runs</i>")]
RD[("📮 Redis 7 Queue<br/><i>sandbox:jobs</i>")]
CLI -->|"POST /api/v1/execute"| API
API -->|"validate + acquire"| POOL
POOL -->|"spawn + limits"| RUN
RUN -.->|"apply jail"| ISO
ISO ==>|"seccomp · pivot_root"| GUEST
RUN -->|"fork / exec"| INIT
INIT -->|"syscall.Exec"| GUEST
RUN -.->|"stdout / stderr ≤ 512 KB"| POOL
API -.->|"async audit INSERT"| PG
RD -.->|"BRPop drain · worker module"| POOL
style JAIL fill:#2a1215,stroke:#f87171,stroke-width:2px
style CP fill:#0d1b2a,stroke:#38bdf8,stroke-width:1px
| Компонент | Ответственность | Исходный код |
|---|---|---|
| Демон приёма | REST-интерфейс: POST /api/v1/execute + /health; валидация запросов; асинхронная отправка аудита | cmd/server/main.go |
| Пул прогретых раннеров | Слоты выполнения, ограниченные семафором (16), с таймаутом захвата 3 с → обратное давление при исчерпании в стиле 503 | internal/runner/pool.go |
| Раннер процессов | Формирует команду языка, подключает cgroup, передаёт потоки через усекающие писатели, обеспечивает 5-секундный сторожевой таймер, собирает метрики cgroup, классифицирует результаты | internal/runner/process.go |
| Изоляция ядра | Ограничитель cgroups v2 (memory.max, cpu.max, pids.max), флаги пространств имён (CLONE_NEWPID/NET/NS/IPC/UTS/USER), компилятор фильтра seccomp-BPF | internal/isolation/ |
| sandbox_init | Дочерний трамплин: pivot_root только для чтения + tmpfs /dev//tmp, отключение сети (lo down), применение seccomp, затем syscall.Exec целевой программы | cmd/sandbox_init/main.go |
| Недоверенный код | Гостевая полезная нагрузка. Устройства хоста удалены, /proc скрыт (hidepid=2), все системные вызовы вне белого списка блокируются | образы rootfs в runtimes/ |
| PostgreSQL 16 | Долговечный журнал аудита каждого запуска, включая нарушения безопасности | migrations/001_init_sandbox_schema.sql |
| Redis 7 | Очередь sandbox:jobs + воркер BRPop, вычерпывающий задания в пул (модуль реализован, но ещё не подключён к демону — см. Известные ограничения) | internal/queue/redis_consumer.go |
| Граница | Что разделяет | Механизм обеспечения |
|---|---|---|
| Клиент ↔ Демон | Неаутентифицированная отправка полезной нагрузки от плоскости управления | валидация схемы (tenant_id, language, code) |
| Плоскость управления ↔ Изолированная среда | Доверенный код на Go против враждебной полезной нагрузки | fork в приватные пространства имён; pivot_root; наследование seccomp при exec |
| Изолированная среда ↔ Ограничения ядра | Потребление ресурсов гостем против ёмкости хоста | cgroups v2 memory.max=128MB, swap.max=0, cpu.max="50000 100000", pids.max=32 |
| Изолированная среда ↔ Сеть | Любой исходящий трафик или доступность со стороны хоста | приватное пространство имён NET, lo down, системный вызов socket блокируется |
🔍 Интерактивная версия этой диаграммы с поддержкой тем (с экспортом в PNG/SVG) создана на основе кандидатов, подкреплённых доказательствами, в
docs/archify/.
sequenceDiagram
autonumber
participant C as Client
participant A as REST API
participant P as Warm Pool
participant R as Process Runner
participant I as sandbox_init
participant G as Untrusted Code
participant DB as PostgreSQL