feat(assessment): runner de sandbox gVisor + ADR-0002 Opción B validada #8

Merged
mane merged 1 commit from feat/gvisor-sandbox-runner into main 2026-06-29 02:06:50 +00:00
Owner

Primitiva de ejecución de código no confiable (ADR-0002 Opción B), construida
tras validar gVisor en el VPS de prod:

  • SandboxExecutor (puerto) — primitiva exec(req)→result sobre la que se compone
    el CodeExecutionPort de test-cases.
  • ociConfig() — config.json OCI puro: red aislada (egress cero), rootfs read-only,
    /work read-only, caps cero, no-new-privileges, RLIMIT_CPU + límites mem/pids.
  • BunProcessRunner — Bun.spawn con wall-timeout duro (inyectable para test).
  • GvisorSandbox — runsc run + bundle OCI efímero por submission; mata y limpia al
    vencer el wall-clock.
  • 9 unit tests (sin runsc, ProcessRunner falso) + README de productivización.

Spike validado en el host real (kernel 6.8, cgroup v2, sin KVM): bundle generado
por ociConfig corrió bajo runsc --platform=ptrace → kernel 4.19.0-gvisor,
home-host NO visible (FS aislado), solo iface lo (egress cero), uid nobody.

ADR-0002 enmendado: la premisa "gVisor solo cgroup v1" estaba obsoleta; Opción B
es viable y se RE-PRIORIZA sobre A — este host es compartido con Forgejo prod +
gateway, así que un escape del isolate privilegiado (A) daría root sobre el git
server. No se usa docker --runtime=runsc (evita reiniciar el daemon / dar socket
root al backend); runsc directo con bundles propios.

Pendiente (coordinar, toca infra): instalar runsc + servicio de ejecución root
aparte detrás del CodeExecutionPort + rootfs por lenguaje + caps de cgroup.

Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com

Primitiva de ejecución de código no confiable (ADR-0002 Opción B), construida tras validar gVisor en el VPS de prod: - SandboxExecutor (puerto) — primitiva exec(req)→result sobre la que se compone el CodeExecutionPort de test-cases. - ociConfig() — config.json OCI puro: red aislada (egress cero), rootfs read-only, /work read-only, caps cero, no-new-privileges, RLIMIT_CPU + límites mem/pids. - BunProcessRunner — Bun.spawn con wall-timeout duro (inyectable para test). - GvisorSandbox — runsc run + bundle OCI efímero por submission; mata y limpia al vencer el wall-clock. - 9 unit tests (sin runsc, ProcessRunner falso) + README de productivización. Spike validado en el host real (kernel 6.8, cgroup v2, sin KVM): bundle generado por ociConfig corrió bajo runsc --platform=ptrace → kernel 4.19.0-gvisor, home-host NO visible (FS aislado), solo iface lo (egress cero), uid nobody. ADR-0002 enmendado: la premisa "gVisor solo cgroup v1" estaba obsoleta; Opción B es viable y se RE-PRIORIZA sobre A — este host es compartido con Forgejo prod + gateway, así que un escape del isolate privilegiado (A) daría root sobre el git server. No se usa docker --runtime=runsc (evita reiniciar el daemon / dar socket root al backend); runsc directo con bundles propios. Pendiente (coordinar, toca infra): instalar runsc + servicio de ejecución root aparte detrás del CodeExecutionPort + rootfs por lenguaje + caps de cgroup. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(assessment): runner de sandbox gVisor + ADR-0002 Opción B validada
Some checks failed
CI / quality (pull_request) Failing after 22s
CI / integration (pull_request) Failing after 29s
c9000c4044
Primitiva de ejecución de código no confiable (ADR-0002 Opción B), construida
tras validar gVisor en el VPS de prod:

- SandboxExecutor (puerto) — primitiva exec(req)→result sobre la que se compone
  el CodeExecutionPort de test-cases.
- ociConfig() — config.json OCI puro: red aislada (egress cero), rootfs read-only,
  /work read-only, caps cero, no-new-privileges, RLIMIT_CPU + límites mem/pids.
- BunProcessRunner — Bun.spawn con wall-timeout duro (inyectable para test).
- GvisorSandbox — runsc run + bundle OCI efímero por submission; mata y limpia al
  vencer el wall-clock.
- 9 unit tests (sin runsc, ProcessRunner falso) + README de productivización.

Spike validado en el host real (kernel 6.8, cgroup v2, sin KVM): bundle generado
por ociConfig corrió bajo runsc --platform=ptrace → kernel 4.19.0-gvisor,
home-host NO visible (FS aislado), solo iface lo (egress cero), uid nobody.

ADR-0002 enmendado: la premisa "gVisor solo cgroup v1" estaba obsoleta; Opción B
es viable y se RE-PRIORIZA sobre A — este host es compartido con Forgejo prod +
gateway, así que un escape del isolate privilegiado (A) daría root sobre el git
server. No se usa docker --runtime=runsc (evita reiniciar el daemon / dar socket
root al backend); runsc directo con bundles propios.

Pendiente (coordinar, toca infra): instalar runsc + servicio de ejecución root
aparte detrás del CodeExecutionPort + rootfs por lenguaje + caps de cgroup.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mane merged commit 86437e8e70 into main 2026-06-29 02:06:50 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mane/dev-platform!8
No description provided.