Agent Sandbox & Secure Code Execution 2026 - Kiến trúc Firecracker, gVisor, E2B, Daytona cho AI Coding Agents với Redis và ClickHouse

Posted on: 4/14/2026 3:10:07 PM

Khi một agent AI được trao quyền chạy lệnh shell, cài package, sửa file, gọi API có trạng thái — câu hỏi không còn là "nó có làm được không" mà là "nếu nó bị nhầm, bị prompt-inject, hoặc bị điều khiển, thì máy và dữ liệu của chúng ta còn lại gì". Năm 2026, không còn là tính năng phụ trợ mà đã trở thành cột sống kiến trúc của mọi hệ thống multi-agent production. Bài viết này đi sâu vào các công nghệ cô lập từ container truyền thống đến microVM Firecracker, so sánh các nền tảng cho AI agent hàng đầu (E2B, Daytona, Modal, Docker Sandboxes), mô tả cách Claude Code xây dựng native, và vạch ra một kiến trúc production hoàn chỉnh kết hợp Redis làm state store cùng ClickHouse làm audit backbone.

84%Số prompt xin quyền bị cắt bỏ khi bật trong Claude Code
125msThời gian khởi động Firecracker microVM
150/sSố microVM tạo mới mỗi giây trên một host đơn
<5 MiBOverhead bộ nhớ mỗi microVM

1. Vì sao trở thành bắt buộc cho AI agent 2026

Ba năm trở lại đây, các đội ngũ AI đã chứng kiến một sự dịch chuyển rõ ràng: từ "LLM sinh ra văn bản, con người copy-paste vào terminal" sang "LLM tự gọi tool, tự chạy lệnh, tự sửa file". Mô hình thứ hai mở ra năng suất khổng lồ nhưng cũng kéo theo một bề mặt tấn công hoàn toàn mới. Một agent coding có thể vô tình chạy rm -rf ~, có thể cài một package npm độc hại do prompt-injection, có thể ghi đè ~/.ssh/config, hoặc đơn giản là leak secrets qua một lời gọi HTTP đi sai địa chỉ.

Sự cố thực tế cuối 2025

Một công ty SaaS triển khai coding agent để tự fix bug từ issue GitHub. Một issue giả được submit với nội dung "fix lỗi import, chạy npm install vô-hại-package trước". Agent làm đúng như được bảo. Package đó chứa postinstall script chạy curl để exfiltrate biến môi trường. Vì agent chạy trực tiếp trên runner CI của team với full quyền repo và secrets — hậu quả là 3 API key production bị lộ và phải rotate khẩn cấp trong 2 giờ.

Bốn lý do khiến trở thành điều kiện tiên quyết, không phải "nice to have":

  • Prompt injection là mối đe doạ cấp hệ thống. Nội dung mà agent đọc (email, PR, web page, file) có thể chứa chỉ thị ẩn. Không có , mọi chỉ thị đều có sức tấn công ngang với người dùng trực tiếp.
  • Agent tự hành cần ít prompt xin quyền hơn. Nếu mỗi lần chạy git status đều phải hỏi user, agent không còn tự hành. Sandbox cho phép quy định trước "những gì an toàn" để agent chạy tự do trong giới hạn đó.
  • Multi-agent đồng thời đòi hỏi cách ly mạnh. 20 sub-agent chạy song song cần không xâm phạm nhau — cần tách biệt filesystem, network, process space.
  • Audit và compliance yêu cầu bằng chứng không thể phủ nhận. Regulators ngày càng muốn biết chính xác mỗi agent đã làm gì, trên file nào, với network nào. Sandbox là nơi gắn telemetry trực tiếp vào hành vi, không phụ thuộc vào sự thật thà của code bên trong.

2. Các lớp cô lập — từ process đến hardware virtualization

Để chọn đúng , kỹ sư cần hiểu chính xác mỗi công nghệ cô lập tại lớp nào của stack, và ai là "đối thủ" mà nó có thể ngăn được.

graph TB
    subgraph "Lớp cách ly từ yếu đến mạnh"
        L1[Process - chroot, rlimit]
        L2[Container - namespaces, cgroups]
        L3[gVisor - user-space kernel]
        L4[Firecracker / Kata - microVM KVM]
        L5[Hardware VM - đầy đủ QEMU]
    end
    L1 -->|Dễ escape qua kernel bug| L2
    L2 -->|Chia sẻ kernel với host| L3
    L3 -->|Syscall interception overhead| L4
    L4 -->|Kernel riêng, boot <125ms| L5
    style L1 fill:#ffcdd2,stroke:#e94560
    style L2 fill:#ffe0b2,stroke:#ff9800
    style L3 fill:#fff9c4,stroke:#fbc02d
    style L4 fill:#c8e6c9,stroke:#4CAF50
    style L5 fill:#bbdefb,stroke:#1976d2
Hình 1 — Phổ cách ly từ process đến hardware virtualization

2.1. Container truyền thống (Docker, containerd)

Container dùng Linux namespaces (PID, mount, net, user...) và cgroups để tạo ra "ảo giác" máy riêng cho mỗi process group. Ưu điểm là cực nhanh (khởi động 20-50ms), nhẹ (vài chục MB RAM), dễ triển khai. Nhược điểm là tất cả container cùng chia sẻ kernel host. Một lỗ hổng kernel (CVE) có thể cho phép escape khỏi container, tiếp cận kernel, rồi từ đó lan sang các container khác. Đối với coding agent chạy code không đáng tin, đây là rủi ro không chấp nhận được.

2.2. gVisor — user-space kernel

gVisor (của Google) chèn một "kernel người dùng" tên Sentry giữa container và kernel host. Mọi syscall từ container bị intercept và xử lý bên trong Sentry, chỉ một tập hữu hạn syscall được chuyển tiếp xuống kernel thật. Nhờ đó bề mặt tấn công giảm mạnh, nhưng cái giá phải trả là overhead I/O có thể 10-30% cao hơn container thường, và một số syscall exotic không được hỗ trợ. gVisor phù hợp với workload compute-heavy có I/O thấp như Python ML inference — và đó chính là lý do Modal chọn gVisor cho nền tảng GPU của họ.

2.3. Firecracker microVM — chuẩn vàng cho untrusted code

Firecracker là Virtual Machine Monitor mã nguồn mở do AWS phát triển bằng Rust, chính là công nghệ chạy AWS Lambda và Fargate. Mỗi workload nhận một kernel Linux riêng, cô lập hoàn toàn ở tầng hardware virtualization (KVM). Firecracker loại bỏ mọi thiết bị ảo hoá không cần thiết (USB, audio, graphic), chỉ giữ lại vài virtio thiết yếu — nhờ đó attack surface cực nhỏ, overhead bộ nhớ chỉ khoảng 5 MiB, và một host đơn có thể spawn tới 150 microVM mỗi giây với startup ~125ms. Một kernel exploit trong microVM này không thể chạm tới microVM khác hay host, vì KVM là đường biên cứng.

Điểm nhấn kiến trúc

Firecracker không phải là "container nâng cấp" mà là VM bị lột bỏ. Điều này tạo ra một tính chất quan trọng: bạn không thể chia sẻ filesystem tuỳ tiện với host như container — phải dùng virtio-fs hoặc snapshot. Đổi lại, mỗi là một "máy mới toanh" đúng nghĩa, không có thư mục lạ, không có process lạ, không có cache dính.

2.4. WebAssembly — lớp cô lập mới nổi

WebAssembly (Wasm) tạo ra một ngôn ngữ cấp bytecode: code chạy trong một máy ảo stack-based không có truy cập trực tiếp tới syscall host, mọi capability phải được inject tường minh qua WASI. Ưu điểm là khởi động gần như tức thì (<1ms), overhead nhỏ, và chạy được trên nhiều platform kể cả edge/browser. Nhược điểm là hệ sinh thái ngôn ngữ còn hạn chế — Python/Node.js trong Wasm chưa đạt mức production so với trên Linux gốc. Wasm phù hợp với "tool execution" (ví dụ chạy một hàm tính toán từ LLM) hơn là full coding workspace.

3. So sánh các nền tảng hàng đầu 2026

Hệ sinh thái cho AI agent đã trưởng thành đáng kể. Bốn nền tảng đáng chú ý nhất hiện nay:

Nền tảngCông nghệ cách lyStartupĐiểm mạnhĐối tượng phù hợp
E2BFirecracker microVM~150msBảo mật hardware-level, kernel riêng mỗi session, SDK Python/TS thân thiệnCoding agent chạy code untrusted, data analysis, tác nhân cần tách biệt nghiêm ngặt
DaytonaDocker container (OCI)27-90msStartup nhanh nhất, snapshot/restore hiệu quả, giá thành thấpHigh-throughput workload, agent tạo hàng trăm ngắn hạn
ModalgVisor + GPU passthrough~200msFull GPU stack (T4, A100, H100, H200), Python-first, auto-scaleML workload, inference agent, training fine-tune
Docker SandboxesMicroVM (Linux kernel riêng) trên macOS/Windows~300msTích hợp Claude Code, Codex, hoạt động offline, dev experience trên desktopDeveloper chạy local agent, CI/CD tự động hoá

Sai lầm phổ biến khi chọn

Nhiều team bị cuốn vào "startup time" và chọn container vì nó nhanh nhất. Nhưng startup thường chỉ được kích hoạt khi tạo mới — trong một session coding agent kéo dài 10 phút, 100ms chênh lệch khởi động gần như vô nghĩa. Trong khi đó một lỗi kernel escape có thể kéo theo một sự cố 6 con số. Chọn theo attack surface trước, tối ưu startup sau.

4. Claude Code native — bubblewrap, seatbelt và microVM

Anthropic đã công bố vào đầu 2026 rằng Claude Code có native được thiết kế để giảm 84% số prompt xin quyền trong nội bộ. Kiến trúc của nó đáng học hỏi vì nó minh hoạ cách áp dụng cho một agent chạy trên máy tính cá nhân (không phải cloud remote VM):

  • Linux: bubblewrap. Bubblewrap là utility cô lập namespace được Flatpak sử dụng, cho phép tạo ra một môi trường chroot-like với network và mount tuỳ biến, mà không cần root privilege. Claude Code dùng bubblewrap để giới hạn agent chỉ có thể ghi vào thư mục dự án hiện tại và đọc một số cấu hình chỉ định.
  • macOS: seatbelt. Seatbelt (-exec) là framework MAC của Apple được dùng sẵn cho App Sandbox và Mail.app. Policy được viết theo Scheme-like DSL, cho phép whitelist từng operation (file-read, file-write, network-outbound...). Claude Code sinh policy tự động dựa trên thư mục dự án và allowlist domain mà người dùng cấu hình.
  • Docker Sandboxes (1/2026). Với người dùng cần mức cô lập cao nhất, Docker phát hành Docker Sandboxes — mỗi chạy trong một microVM riêng với kernel Linux riêng và Docker daemon riêng. Điều này cho phép agent chạy gần như "máy Linux mới" ngay cả khi người dùng đang dùng Mac hay Windows.
graph TB
    User[Developer]
    CC[Claude Code CLI]
    subgraph "Sandbox runtime theo OS"
        Linux[Linux: bubblewrap
namespaces + seccomp] Mac[macOS: seatbelt
Scheme policy] Win[Windows/Mac: Docker Sandbox
microVM] end subgraph "Giới hạn cấu hình được" FS[Filesystem
allowlist path] Net[Network
allowlist domain] Proc[Process
kill budget, CPU limit] end User --> CC CC --> Linux CC --> Mac CC --> Win Linux --> FS Linux --> Net Linux --> Proc Mac --> FS Mac --> Net Win --> FS Win --> Net Win --> Proc style CC fill:#e94560,stroke:#fff,color:#fff style Win fill:#0f3460,stroke:#fff,color:#fff
Hình 2 — Kiến trúc đa nền tảng của Claude Code

4.1. Sub-agent và isolation boundary

Trong Claude Code, mỗi sub-agent được sinh ra có thể chạy trong cùng cha, hoặc trong một con cách ly hoàn toàn. Đây là điểm tinh tế: nếu sub-agent phải khám phá một thư mục không tin cậy (ví dụ node_modules của một repo submit từ user ngoài), tốt nhất nên tạo một con với chính sách chặt hơn. Ngược lại, sub-agent chỉ đọc code hiện tại và trả về tóm tắt, thì cùng cũng ổn. Quyết định này nên được orchestrator (main agent) đưa ra dựa trên trust level của input.

5. Kiến trúc production: pool + Redis + ClickHouse

Triển khai cho một hệ thống nhiều tenant đòi hỏi nhiều hơn là chỉ "gọi E2B API khi cần". Ba bài toán phát sinh: (1) tối ưu chi phí với ngắn hạn, (2) lưu trữ trạng thái persistent giữa các lần gọi của cùng session, (3) audit mọi thao tác để compliance và debugging.

graph LR
    Agent[AI Agent]
    subgraph "Sandbox Control Plane"
        Router[Sandbox Router]
        Pool[Warm Pool
50 microVM standby] Reaper[Reaper
idle > 5 phút] end subgraph "Data Plane" SB1[MicroVM 1] SB2[MicroVM 2] SB3[MicroVM N] end subgraph "State & Audit" Redis[(Redis
session → Id
rate limit)] CH[(ClickHouse
exec events
filesystem diff
network log)] end Agent -->|create/attach| Router Router -->|lookup| Redis Router -->|allocate| Pool Pool --> SB1 Pool --> SB2 Pool --> SB3 SB1 -->|event stream| CH SB2 -->|event stream| CH SB3 -->|event stream| CH Reaper -->|release| Pool Reaper -->|update| Redis style Agent fill:#e94560,stroke:#fff,color:#fff style Router fill:#0f3460,stroke:#fff,color:#fff style Redis fill:#c8e6c9,stroke:#4CAF50 style CH fill:#bbdefb,stroke:#1976d2
Hình 3 — Sandbox control plane với Redis state và ClickHouse audit

5.1. Warm pool — đánh đổi cost và latency

Một microVM khởi động mất 125ms, nhưng đó là khi image đã được cache sẵn ở host. Lần đầu pull image, lần đầu warm up language runtime (Python virtual env, Node npm cache) có thể tốn 5-15 giây. Để tránh người dùng chờ, ta duy trì một warm pool: N đã boot sẵn với môi trường chuẩn, chỉ chờ được assign. Khi agent xin , router lấy một cái từ pool (vài ms), còn pool tự động refill bằng cách tạo cái mới ở background. Redis là lựa chọn tự nhiên để lưu pool state: một set các Id idle và TTL cho mỗi cái.

Công thức pool size

Pool size tối ưu ≈ arrivalRate × bootTime × safetyFactor. Ví dụ: 2 request mới/giây, boot 10s, safety 1.5 → pool 30 . Nếu hit rate < 95%, tăng pool. Nếu > 99% và cost cao, giảm pool. Monitor cái tỷ lệ này trên ClickHouse để autoscale.

5.2. Redis làm session → map

Một coding agent điển hình có session kéo dài 10-30 phút với hàng chục lượt tương tác. Nếu mỗi lượt tạo mới, agent mất toàn bộ state (file đã sửa, dependency đã cài). Giải pháp là gắn theo session: khi request đầu tiên đến với sessionId chưa biết, router allocate một và ghi SET session:{id} {Id} EX 1800. Các request sau reuse. Khi session expire, reaper sẽ thấy key mất và release về pool (hoặc destroy hẳn tuỳ cấu hình).

Redis còn giữ hai thông tin quan trọng khác:

  • Rate limit theo tenant bằng token bucket hoặc sorted set: mỗi tenant tối đa X đồng thời, Y CPU-minute mỗi giờ.
  • Idempotency key cho các lệnh "long running": nếu agent retry cùng một lệnh, không spawn mới mà trả về cái đang chạy.

5.3. ClickHouse làm audit & analytics backbone

Mỗi nên stream event theo thời gian thực về một hệ thống có thể ingest triệu event mỗi giây và query nhanh trên cửa sổ thời gian — đó chính là sân chơi của ClickHouse. Các event quan trọng cần ghi:

Loại eventCột chínhMục đích
exec_id, cmd, exit_code, duration_ms, tsTái lập trình tự lệnh, phát hiện cmd bất thường
fs_write_id, path, bytes, hash, tsDiff-based audit, phát hiện ghi file nhạy cảm
net_out_id, host, port, bytes_tx, tsPhát hiện exfiltration, validate allowlist
policy_violation_id, rule_id, action, tsAlert realtime khi vi phạm policy
resource_id, cpu_pct, mem_mb, io_kbps, tsBilling, capacity planning, detect crypto-mining

Với ClickHouse, một materialized view có thể tự động aggregate theo tenant/ngày để dashboard cost billing, trong khi bảng raw vẫn giữ chi tiết phục vụ forensic. TTL 90 ngày cho raw, 2 năm cho aggregated thường là đủ cho compliance SOC 2 / ISO 27001.

Đừng log raw stdin/stdout

Cám dỗ log toàn bộ stdout/stderr là rất lớn vì tiện debug. Nhưng output từ lệnh như env, cat .env, hay một LLM response chứa secret có thể lọt vào ClickHouse và tự biến audit log thành nguồn rò rỉ. Tối thiểu nên hash / redact các chuỗi trông giống token (regex 20+ ký tự base64, prefix sk-, ghp_...) trước khi ghi.

6. Các pattern triển khai điển hình

6.1. Ephemeral (1 request = 1 )

Dùng khi agent làm những tác vụ ngắn, độc lập, không chia sẻ state — ví dụ tool "run Python snippet" trong một chatbot. Mỗi lần gọi, tạo mới, chạy, trả kết quả, destroy. Đơn giản, an toàn tối đa, nhưng đắt nếu request liên tiếp với cùng một môi trường phức tạp.

6.2. Session-bound workspace

Pattern chuẩn cho coding agent: sống cùng session, được "đóng băng" (paused / hibernated) khi idle và thức dậy khi có lệnh mới. E2B và Daytona đều hỗ trợ pause/resume với checkpoint — trạng thái memory và filesystem được serialize lên object storage. Khi resume, chỉ restore những thứ cần, boot lại trong <1 giây.

6.3. Pool of personas

Nhiều sub-agent có "vai trò" khác nhau: researcher đọc web, coder sửa code, tester chạy test. Thay vì dùng một chung, tạo nhiều template chuyên biệt (researcher có curl + readability, coder có git + full dev toolchain, tester có pytest + coverage). Mỗi sub-agent pull từ pool riêng với policy riêng. Kết quả: attack surface hẹp hơn và observability chi tiết hơn.

7. Các mối đe doạ cụ thể và cách mitigate

Mối đe doạMô tảMitigation
Prompt injection → destructive cmdInput chứa chỉ thị khiến agent chạy lệnh xoá dữ liệuFilesystem write allowlist, capability tối thiểu, reviewer agent riêng cho lệnh destructive
Data exfiltration qua DNSEncode secret vào subdomain, gọi resolver bên ngoàiDNS resolver riêng trong , log tất cả query, block wildcard lookup
Kernel escapeExploit CVE Linux kernel để thoát containerDùng microVM (kernel riêng), vá kernel định kỳ, giới hạn syscall bằng seccomp
Crypto miningCode độc tận dụng CPU/GPU idle củaGiới hạn CPU-minute, monitor resource pattern, detect hash-rate trên ClickHouse
Supply chain (malicious package)Agent cài package npm/pypi chứa postinstall độcRegistry proxy whitelist, SBOM hash verification, network egress chỉ tới registry chính thức
Cross-tenant leak qua cacheSandbox B "nhặt" cache còn sót của tenant AMỗi tenant một pool riêng, wipe FS khi release, không tái sử dụng disk giữa tenant

8. Observability: ghép với OpenTelemetry

Sandbox không chỉ cần audit log; nó cần hoà vào stack observability tổng thể của agent. Công thức thực dụng:

  • Trace: mỗi lượt gọi agent là một trace; mỗi lệnh trong là một span có thuộc tính .id, .image, exec.cmd, exec.exit_code.
  • Metrics: counter .alloc, histogram .boot_ms, gauge .pool.size, histogram exec.duration_ms.
  • Logs: stdout/stderr của , đã được redact, có trace_id để join với trace.

Bộ ba này có thể được ClickHouse tiếp nhận qua OTLP exporter, hoặc Langfuse/Grafana Tempo nếu team đã có stack. Điểm mấu chốt là mọi event đều gắn trace_id để khi debug một sự cố agent, ta vạch được từ "prompt input" → "tool call" → " exec" → "network egress" chỉ trong một truy vấn.

9. Roadmap triển khai cho hệ thống multi-agent

Tháng 1 — Đánh giá và chọn công nghệ
Lập threat model cho agent của bạn (coding, data analysis, web browsing). Xác định blast radius tối đa chấp nhận được. Chọn giữa E2B (bảo mật cao), Daytona (startup nhanh), Modal (GPU), hoặc self-host Firecracker. Nếu chạy on-prem, chuẩn bị image golden (Ubuntu minimal + runtime cần thiết) và dựng một POC với 1 workload thực.
Tháng 2 — Control plane và session binding
Dựng router đằng sau agent API gateway. Gắn Redis làm session → map với TTL hợp lý (15-60 phút). Implement warm pool đơn giản (fixed size) và đo hit rate. Wire OpenTelemetry cho trace cơ bản.
Tháng 3 — Policy engine và allowlist
Định nghĩa policy per-persona: filesystem paths được phép ghi, domain được phép kết nối, CPU/mem limit, lệnh cấm (rm -rf, fork bomb, kernel module). Triển khai enforcement tại tầng (seccomp + netfilter), không dựa vào agent tự tuân thủ. Bổ sung audit event "policy_violation".
Tháng 4 — ClickHouse audit pipeline
Stream các event (exec, fs_write, net_out, resource) vào ClickHouse qua Kafka hoặc Vector. Viết materialized view cho billing và compliance. Dựng Grafana dashboard: cost per tenant, top commands, top egress hosts, anomalies.
Tháng 5 — Anomaly detection và auto-kill
Viết rule realtime trên ClickHouse (hoặc tích hợp Flink) để phát hiện pattern bất thường: spike CPU, egress host lạ, command xoá hàng loạt. Khi vi phạm, tự động kill và pause session, gửi alert. Đo false positive rate và tinh chỉnh.
Tháng 6 — Chaos và pentest
Chạy red-team với các prompt injection từ OWASP LLM Top 10, inject package độc vào registry test, mô phỏng kernel exploit bằng KernelCTF scenarios. Verify mọi vi phạm đều được detect và contain. Chuẩn bị playbook incident response và incident drill.

10. Kết luận

Năm 2026, không còn là "feature nâng cao" mà là hợp đồng xã hội giữa agent và người dùng: agent được quyền tự hành, đổi lại nó chịu ràng buộc bởi một đường biên có thể kiểm chứng. Chọn đúng công nghệ cô lập (container, gVisor, Firecracker, Wasm) là quyết định đầu tiên; nhưng giá trị lâu dài đến từ việc bạn ghép vào một control plane có state store (Redis) và audit backbone (ClickHouse), nơi mọi hành vi đều có thể truy vết, mọi policy đều enforce được, và mọi sự cố đều có dấu vết rõ ràng.

Nếu bạn đang xây dựng hệ thống multi-agent production từ đầu, hãy để là một trong ba quyết định kiến trúc bạn đóng đinh trước tiên — cùng với message backbone (Kafka/Redis Streams) và memory layer (Vector DB + Knowledge Graph). Ba nền tảng này sẽ quyết định trần khả năng mở rộng và mức rủi ro của toàn bộ hệ thống trong 3-5 năm tới. Sandbox sai, mọi thứ khác đều mang theo nợ kỹ thuật — và nợ bảo mật là loại nợ đắt nhất.

Checklist trước khi production

✔ Threat model được viết và review. ✔ Sandbox technology khớp với threat level. ✔ Policy định nghĩa per-persona, enforce ở tầng kernel. ✔ Redis quản lý session- mapping với TTL. ✔ ClickHouse nhận đầy đủ exec/fs/net events. ✔ Redact secrets trước khi log. ✔ Rate limit & cost cap per tenant. ✔ Playbook incident response và red-team drill định kỳ.

Nguồn tham khảo