Cloud Sandbox Design

Thiết kế cloud sandbox cho AI agent chạy code, duyệt web và thao tác file thay người dùng

Isolation bảo vệ tầng máy. Nhưng mối nguy thật của agent có thể đi xuyên tường bằng ngôn ngữ (prompt injection) và bằng chính quyền hợp lệ của nó. Vì vậy, an toàn không chỉ nằm ở VM mà còn ở quyền, quota, egress control và sự duyệt có ngữ cảnh.

Tác giả: Lương Quốc Dũng Bằng chứng: quan sát trực tiếp PAM qua network trace và API

00Happy path

Một luồng chạy trơn, để thấy các phần của thiết kế ăn khớp với nhau trước khi mổ vào chỗ hỏng. Task ví dụ: đọc file sales.csv trong workspace, phân tích doanh thu theo tháng, tạo bản tóm tắt và gửi email cho sếp. Task này chạm cả ba khả năng của agent: đọc file, chạy code, và một hành động ra bên ngoài.

1
Agent lập kế hoạchkhông cần duyệt

Agent cho user xem kế hoạch để biết phạm vi xử lý. Các bước đầu chưa có external side effect nên không cần duyệt.

2
Agent tự thực thi phần nội bộreversible · scope hẹp

Đọc file, kiểm tra schema, chạy code phân tích, tạo biểu đồ / bản tóm tắt, lưu kết quả vào workspace, chạy kiểm tra lại. Các hành động này có scope rõ, không gửi dữ liệu ra ngoài, và có thể sửa / xóa / khôi phục.

3
Agent DỪNG trước bước gửi emailcần duyệt

Đây là hành động có external side effect. Action preview hiển thị: người nhận, tiêu đề và toàn bộ nội dung email; file đính kèm / dữ liệu sẽ gửi; domain nhận dữ liệu; dữ liệu nào rời khỏi sandbox; có thể thu hồi email hay không. Nút: Chỉnh sửa · Gửi lần này · Từ chối.

4
User duyệt → agent gửi

Sau khi user duyệt, agent gửi email và hiển thị trạng thái thành công, message ID, hoặc lỗi nếu gửi thất bại.

5
Hệ thống lưu state

Brief và lịch sử hội thoại; lệnh / code đã chạy; logs và thời gian thực thi; file sales-summary.md và các artifact; action preview đã được duyệt; trạng thái email (sent / failed).

Chú ý nút ở bước 3 là "Gửi lần này", không phải "Luôn cho phép" — chi tiết này nối thẳng xuống nguyên tắc chống exfiltration ở mục 05.

01Threat model

Đề bài yêu cầu cover cả failure và abuse. Tôi tách hai loại vì chúng cần biện pháp khác nhau: abuse có kẻ cố ý, còn failure là agent tự làm sai dù không ai tấn công.

LoạiKẻ gây hạiNạn nhânKênh tấn công
abuseWebsite chứa malwareBrowser runtime, sandbox, host nếu exploit thành côngKhai thác lỗ hổng trình duyệt hoặc browser automation
abuseWebsite chứa prompt injectionDữ liệu người dùng, bên thứ ba, nền tảngAgent đọc instruction giả trong nội dung web rồi tự gửi file hoặc gọi tool
abuseFile độc do user uploadHost, user khác, hạ tầng nội bộ, bên thứ baMalware escape khỏi sandbox, quét network hoặc truy cập credential
abuseUser dùng sandbox để đào coinHạ tầng cloud, ngân sách nền tảngChạy process chiếm CPU/GPU kéo dài
abuseUser dùng sandbox để DDoS hoặc scanWebsite hoặc hệ thống bên ngoàiGửi nhiều request hoặc quét port qua outbound network
abuseUser host phishing hoặc malwareNgười truy cập, bên thứ ba, thương hiệu nền tảngMở public web server hoặc chia sẻ preview URL
abuseUser đánh cắp dữ liệu qua sandboxChủ sở hữu file, email hoặc API keyĐọc workspace rồi upload ra domain ngoài
failureAgent tự xóa file thậtNgười dùngTool gọi delete hoặc ghi đè file do hiểu nhầm yêu cầu
failureAgent tự gửi email chưa duyệtNgười dùng, người nhận, tổ chứcAgent gọi email tool với nội dung hoặc recipient sai
failureAgent chạy lệnh phá dữ liệuWorkspace, database, hệ thống liên quanShell/tool execution không có confirmation hoặc scope check
failureAgent tự phát sinh chi phíChủ tài khoản hoặc nền tảngGọi API, chạy job hoặc tạo resource quá mức

Threat làm tôi "mất ngủ" nhất

Website prompt injection dẫn tới exfiltration dữ liệu. Nó nguy hiểm vì agent không cần thoát sandbox: website chỉ cần lừa agent dùng đúng quyền hợp lệ để đọc file hoặc email rồi gửi ra ngoài. Đây cũng là lý do firewall hoặc micro-VM không đủ; phải kiểm soát trust level của dữ liệu, egress và tool approval.

Threat tôi chủ động loại khỏi scope

"Lộ system prompt" — vì việc lộ instruction thường có thiệt hại nhỏ hơn nhiều so với lộ dữ liệu người dùng hoặc thực hiện side effect; nó chỉ được xem là rủi ro phụ nếu prompt chứa secret hoặc thông tin nhạy cảm.

Một quan sát nối hai dòng lại Dòng injection từ website và dòng user đánh cắp dữ liệu nhìn khác nhau nhưng cùng đi qua một kênh: agent dùng quyền hợp lệ để đẩy dữ liệu ra domain ngoài. Vì vậy egress control, giới hạn dữ liệu và approval phải được áp dụng cho cả hai.

02Execution environment

Agent không trực tiếp chạy việc nặng. Nó tạo job, lưu metadata và enqueue job; worker mới thực thi bất đồng bộ.

Agent → Postgres job row → RabbitMQ → Worker → Ephemeral micro-VM

Điều này giúp tách phần ra quyết định khỏi phần thực thi. Nếu agent hoặc worker chết, job vẫn còn trong Postgres; worker khác có thể nhận lại message từ RabbitMQ và đọc lại payload để tiếp tục. MAX_RECEIVE_COUNT = 5 giới hạn số lần thử, tránh để một job lỗi lặp vô hạn.

03Security & isolation

Đây là luận điểm trung tâm của bài. Tôi tách phòng thủ thành hai tầng, vì một tầng không thay được tầng kia.

Tầng hạ tầng · tách theo hoạt động

Micro-VM cho code & file

Code runtime và browser chạy trong các micro-VM tạm thời, tách khỏi host và tenant khác. Tôi chọn micro-VM thay container cho code và file không tin cậy vì micro-VM có kernel riêng, giảm rủi ro từ container escape. Đổi lại, hệ thống tốn thêm RAM, chi phí và thời gian khởi động.

Tầng policy · tách theo trust level

Nội dung web = untrusted

Instruction của user được xem là mục tiêu; file upload và nội dung website là dữ liệu không tin cậy. Agent không được coi text trong website là instruction có quyền đổi mục tiêu hoặc cấp thêm quyền. Mọi hành động nhạy cảm vẫn đi qua tool policy, egress policy và human approval.

Browser nên có sandbox riêng, profile tạm, không được đọc workspace hoặc secret mặc định. Cách này giảm hậu quả nếu browser bị khai thác bởi malware, nhưng không tự chặn prompt injection.

Câu chốt Isolation bảo vệ tầng máy; egress control, giới hạn quyền và human approval bảo vệ tầng hành vi. Hai tầng bổ sung cho nhau, không thay thế nhau.

Prompt injection: chưa có cách chặn tuyệt đối

Nội dung web có thể vẫn lừa được agent ở tầng ngôn ngữ, nên thiết kế tập trung vào giảm hậu quả: không cấp quyền mới từ nội dung web, giới hạn tool, chặn private network, kiểm soát domain và duyệt trước side effect.

04State persistence

Có ba loại state cần phân biệt: filesystem, lịch sử hội thoại và job đang chạy. Filesystem và lịch sử có thể lưu vào persistent storage; tiến trình đang chạy thì không tự được lưu chỉ vì có một job row.

Job ngắn và idempotent

Khi VM chết, metadata job vẫn ở Postgres. Nếu worker crash trước khi ACK, RabbitMQ redeliver message cho worker khác — nhưng một job có thể đã hoàn tất một phần trước khi chết (ví dụ đã gửi email rồi mới crash trước khi kịp ACK), nên redeliver có thể vô tình chạy lại phần việc đó. Chính vì vậy retry chỉ an toàn khi job idempotent: chạy lại không tạo thêm hậu quả. PAM hỗ trợ điều này bằng creative ID cố định, để retry cập nhật cùng một định danh thay vì tạo creative mới. MAX_RECEIVE_COUNT = 5 ngăn retry vô hạn.

Job dài và code tùy ý

Với python train.py chạy ba tiếng, không thể retry mù từ đầu. Sandbox cần lưu logs, artifacts và checkpoint vào persistent storage; khi crash, sandbox mới khôi phục workspace và resume từ checkpoint nếu chương trình có hỗ trợ checkpoint. Hệ thống đảm bảo lưu và khôi phục dữ liệu đã checkpoint, chứ không hứa có thể khôi phục chính xác RAM hoặc mọi tiến trình tùy ý. Nếu chương trình không có checkpoint phù hợp, hệ thống phải báo lỗi hoặc yêu cầu user chạy lại.

05Human-in-the-loop UI

Ranh giới là hậu quả: hành động nội bộ, scope hẹp và có thể hoàn tác thì agent có thể tự làm; hành động có external side effect, khó hoàn tác hoặc nhạy cảm thì phải duyệt.

Agent tự làm

Nội bộ · reversible · scope hẹp

Đọc file trong workspace, chạy code không side-effect ra ngoài, thao tác có thể sửa / xóa / khôi phục.

Phải duyệt trước

External side effect · khó hoàn tác · nhạy cảm

Gửi email, upload dữ liệu, xóa vĩnh viễn, thanh toán, gọi API tốn tiền.

Nếu hệ thống không chứng minh được hành động hoàn tác an toàn, mặc định coi nó là irreversible và hỏi user.

Session-level control: bắt hại tích lũy

Duyệt từng hành động không bắt được hại tích lũy như đào coin. Vì vậy quota là xương sống: giới hạn CPU/GPU, RAM, disk, thời gian, network, process và chi phí ở cấp session. Khi vượt quota hoặc policy, hệ thống pause/terminate sandbox, thu hồi credential và ghi log. Đây là circuit breaker gắn với quota.

LuậtPolicy — hành động nào bị cấm / cần duyệt
Ngưỡng đoQuota — bao nhiêu là quá
Công tắcCircuit breaker — ngắt khi quota/policy bị vượt
Cảm biếnAnomaly — cảnh báo sớm, không phải hàng rào chính

Anomaly detection chỉ là lớp hỗ trợ bằng các tín hiệu cụ thể như CPU cao liên tục, tạo process/file quá nhanh, outbound request dồn dập hoặc liên tục thử lệnh bị từ chối. Nó không phải hàng rào chính, vì sandbox đa mục đích không có một baseline "bình thường" đáng tin cho mọi user.

Action preview: không chỉ là [Cho phép] [Từ chối]

Màn approve phải cho user biết:

  1. Agent làm gì và tác động lên ai / cái gì.
  2. Dữ liệu nào sẽ bị xóa, sửa hoặc rời khỏi sandbox.
  3. Hậu quả, chi phí và khả năng hoàn tác.

Preview thích ứng theo threat của hành động: email làm nổi recipient và nội dung gửi đi; xóa file làm nổi danh sách file / diff và khả năng khôi phục; API trả phí làm nổi chi phí và quota tiêu thụ.

Chỗ UX và security xung đột — và cách khóa lại Không có "always allow" cho hành động irreversible hoặc có external side effect. Quyền ghi nhớ chỉ áp dụng cho hành động nội bộ, reversible, scope hẹp và có thời hạn / quota. Nếu recipient, domain, loại dữ liệu hoặc mức chi phí thay đổi, hệ thống phải hỏi lại. Nhờ vậy, tối ưu UX không mở lại kênh exfiltration mà prompt injection có thể lợi dụng.

06Giới hạn & điều tôi không hứa

  1. Prompt injection chưa có lời giải hoàn chỉnh; thiết kế chỉ giảm khả năng và phạm vi thiệt hại bằng policy, egress control, giới hạn quyền và approval.
  2. Với code tùy ý chạy dài, hệ thống chỉ khôi phục được tới checkpoint mà chương trình đã ghi; không thể hứa resume chính xác mọi tiến trình đang nằm trong RAM.
  3. Anomaly detection không phải cơ chế bảo đảm an toàn chính. Quota và policy mới là phần chắc chắn; anomaly detection chỉ hỗ trợ cảnh báo và escalation.
  4. Micro-VM giảm rủi ro host/tenant escape nhưng không làm cho agent trở nên đáng tin tuyệt đối ở tầng suy luận.

Thiết kế này ưu tiên giới hạn blast radius và fail an toàn: khi không biết một hành động có hoàn tác được hay không, khi vượt quota, hoặc khi side effect ra ngoài chưa rõ, hệ thống dừng và hỏi người dùng.