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.
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.
Đọ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.
Đâ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.
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.
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ại | Kẻ gây hại | Nạn nhân | Kênh tấn công |
|---|---|---|---|
| abuse | Website chứa malware | Browser runtime, sandbox, host nếu exploit thành công | Khai thác lỗ hổng trình duyệt hoặc browser automation |
| abuse | Website chứa prompt injection | Dữ liệu người dùng, bên thứ ba, nền tảng | Agent đọc instruction giả trong nội dung web rồi tự gửi file hoặc gọi tool |
| abuse | File độc do user upload | Host, user khác, hạ tầng nội bộ, bên thứ ba | Malware escape khỏi sandbox, quét network hoặc truy cập credential |
| abuse | User dùng sandbox để đào coin | Hạ tầng cloud, ngân sách nền tảng | Chạy process chiếm CPU/GPU kéo dài |
| abuse | User dùng sandbox để DDoS hoặc scan | Website hoặc hệ thống bên ngoài | Gửi nhiều request hoặc quét port qua outbound network |
| abuse | User host phishing hoặc malware | Người truy cập, bên thứ ba, thương hiệu nền tảng | Mở public web server hoặc chia sẻ preview URL |
| abuse | User đánh cắp dữ liệu qua sandbox | Chủ sở hữu file, email hoặc API key | Đọc workspace rồi upload ra domain ngoài |
| failure | Agent tự xóa file thật | Người dùng | Tool gọi delete hoặc ghi đè file do hiểu nhầm yêu cầu |
| failure | Agent tự gửi email chưa duyệt | Người dùng, người nhận, tổ chức | Agent gọi email tool với nội dung hoặc recipient sai |
| failure | Agent chạy lệnh phá dữ liệu | Workspace, database, hệ thống liên quan | Shell/tool execution không có confirmation hoặc scope check |
| failure | Agent tự phát sinh chi phí | Chủ tài khoản hoặc nền tảng | Gọ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.
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.
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.
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.
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.
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.
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.
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:
- Agent làm gì và tác động lên ai / cái gì.
- Dữ liệu nào sẽ bị xóa, sửa hoặc rời khỏi sandbox.
- 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ụ.
06Giới hạn & điều tôi không hứa
- 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.
- 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.
- 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.
- 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.