Bạn để Claude Code chạy một task dài, và cứ vài giây lại phải bấm “Accept” cho một lệnh bash. Bực. Nên nhiều người bấm luôn --dangerously-skip-permissions cho khỏe, rồi lo ngay ngáy vì giờ Claude làm gì cũng được, kể cả rm -rf nhầm chỗ hay đọc file key.
Có một đường giữa: sandbox. Nó để Claude chạy phần lớn lệnh mà không hỏi, nhưng hệ điều hành khóa lại chỉ cho ghi trong thư mục dự án và chỉ cho ra những domain bạn duyệt. Bài này chỉ cách bật, cách chạy trên Windows, và quan trọng nhất là cái sandbox KHÔNG bảo vệ, để bạn khỏi tin nhầm.
TL;DR: Sandbox trong Claude Code cho Claude chạy phần lớn lệnh bash mà không hỏi phép; hệ điều hành (Seatbelt trên macOS, bubblewrap trên Linux/WSL2) chặn ghi ngoài thư mục làm việc và chặn domain chưa duyệt. Bật bằng lệnh
/sandbox. Chạy được trên macOS, Linux, WSL2; native Windows không hỗ trợ, phải dùng WSL2. Nó giảm rủi ro chứ không phải tường lửa tuyệt đối.
Đáng bật nếu: bạn muốn Claude chạy tự chủ hơn mà bớt bấm Accept. Coi chừng nếu: bạn tin nó là isolation hoàn chỉnh (không phải), hoặc chạy native Windows (cần WSL2).
Bài này cho: người đã quen terminal và cơ chế permission của Claude Code. Nếu chưa, đọc trước permission mode.
Sandbox trong Claude Code là gì, và giải quyết gì?
Trả lời nhanh: một lớp cho Claude chạy lệnh shell mà không dừng lại hỏi phép, đổi lại hệ điều hành ép ranh giới filesystem và network cho mọi lệnh bash và tiến trình con của nó. Trong Claude Code gọi là sandbox (lệnh /sandbox).
Hình dung như để đứa trẻ chơi trong một sân có rào. Bạn không phải đứng canh từng bước (không phải bấm Accept mỗi lệnh), nhưng cái rào giữ nó không chạy ra đường. Ở đây, cái rào là do hệ điều hành dựng, không phải do Claude tự hứa, nên nó giữ kể cả khi một lệnh làm nhiều hơn tên gọi.
Nó giải quyết ba việc cùng lúc. Một, hết cảnh bấm Accept liên tục cho lệnh bash. Hai, giảm blast radius: một lệnh sai chỉ phá được trong thư mục dự án, không đụng ~/.bashrc hay /bin. Ba, chống prompt-injection: nếu Claude đọc phải nội dung độc xúi nó gửi file ra ngoài, cái rào network chặn domain lạ. (Nguồn: tài liệu Claude Code, truy cập 01/07/2026.)
Lưu ý phân biệt: sandbox khác permission mode. Permission mode quyết định một lệnh có được chạy và có hỏi bạn không; sandbox quyết định lệnh đó chạm được gì một khi đã chạy. Hai lớp bổ sung nhau.
Bước 1: Bật sandbox bằng /sandbox
Cách nhanh nhất là gõ /sandbox trong một phiên Claude Code. Lệnh này mở một panel ba tab để bạn chọn cách hoạt động, không cần sửa file tay.
Ba tab:
- Mode: chọn auto-allow (lệnh trong sandbox chạy luôn, không hỏi) hoặc regular permissions (vẫn giữ hỏi như thường).
- Overrides: chọn có cho lệnh fail trong sandbox chạy lại ngoài sandbox không (setting
allowUnsandboxedCommands). - Config: xem cấu hình sandbox đang áp.
Chọn trong panel sẽ ghi vào .claude/settings.local.json của project (không commit lên git). Muốn bật cho MỌI project, đặt trong settings người dùng ~/.claude/settings.json:
{
"sandbox": {
"enabled": true
}
}
Một điểm cần nhớ về auto-allow: kể cả khi bật, Claude Code VẪN hỏi bạn với vài loại lệnh nguy hiểm. rm hay rmdir nhắm vào /, thư mục home, hay đường dẫn hệ thống vẫn bật prompt. Các ask rule như Bash(git push *) vẫn hỏi. Và deny rule thì luôn được tôn trọng. Sandbox không phải cái nút “bỏ qua mọi thứ”.
Chạy trên Windows thì sao? (WSL2)
Đây là chỗ dân Windows hay hụt hẫng: sandbox không chạy trên native Windows. Tài liệu ghi rõ chỉ hỗ trợ macOS, Linux, và WSL2. Trên Windows bạn phải chạy Claude Code bên trong một distro WSL2.
Cụ thể theo từng nền:
- macOS: không cần cài gì, sandbox dùng framework Seatbelt có sẵn.
- Linux và WSL2: cần hai gói.
bubblewrap(công cụ dựng rào filesystem) vàsocat(relay định tuyến network qua proxy):
# Ubuntu/Debian (trong WSL2)
sudo apt-get install bubblewrap socat
# Fedora
sudo dnf install bubblewrap socat
Sau khi cài, chạy lại /sandbox; tab Dependencies sẽ báo còn thiếu ripgrep, bubblewrap, socat, hay seccomp filter không. Kiểm tra WSL đúng version bằng wsl -l -v từ PowerShell; nếu là WSL1 thì phải nâng lên WSL2, sandbox không chạy trên WSL1.
Mình chạy Claude Code trên Windows qua WSL2, và đây đúng là bước hay làm nản người mới: lần đầu gõ /sandbox trong WSL2, panel chỉ hiện mỗi tab Dependencies vì chưa cài bubblewrap và socat. Cài hai gói đó rồi khởi động lại Claude Code là các tab kia hiện ra. Nếu bạn thử gõ thẳng trên native Windows thì sandbox không chạy, vì nó cần WSL2. Một lưu ý nữa trong WSL2: lệnh sandboxed không gọi được binary Windows như cmd.exe, powershell.exe, hay thứ gì dưới /mnt/c/; cần thì thêm vào excludedCommands.
Sandbox chặn và cho gì? (filesystem + network)
Hiểu đúng ranh giới mặc định giúp bạn biết khi nào cần nới. Sandbox khóa hai trục: filesystem và network, và mặc định khá chặt về ghi nhưng khá thoáng về đọc.
Filesystem. Mặc định lệnh sandboxed chỉ ghi được vào thư mục làm việc hiện tại và thư mục temp của phiên ($TMPDIR). Nó đọc được gần cả máy trừ vài chỗ bị deny. Muốn cho một tool ghi ra ngoài (ví dụ kubectl, terraform cần ghi ~/.kube), khai báo:
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["~/.kube", "/tmp/build"]
}
}
}
Các đường dẫn này ép ở cấp OS nên áp cho mọi tiến trình con, không chỉ công cụ của Claude.
Network. Không domain nào được cho sẵn. Lần đầu một lệnh cần một domain mới, Claude Code hỏi; từ bản v2.1.191, chọn Yes sẽ cho domain đó cả phiên. Muốn khỏi hỏi thì pre-allow trong allowedDomains. Có điều quan trọng: proxy chỉ chặn theo tên miền, không giải mã hay soi nội dung TLS, nên đừng coi nó là tường lửa soi gói.
Bảo vệ key và credential (bẫy mặc định)
Đây là bẫy nhiều người không để ý: mặc định sandbox VẪN cho lệnh đọc file credential. Tài liệu nói thẳng rằng default read vẫn cho phép đọc ~/.aws/credentials và ~/.ssh/. Cái rào chặn GHI ngoài dự án, nhưng không tự chặn ĐỌC key.
Từ bản v2.1.187, có khối sandbox.credentials để chặn đọc file và unset biến môi trường bí mật cho lệnh sandboxed:
{
"sandbox": {
"enabled": true,
"credentials": {
"files": [
{ "path": "~/.aws/credentials", "mode": "deny" },
{ "path": "~/.ssh", "mode": "deny" }
],
"envVars": [
{ "name": "GITHUB_TOKEN", "mode": "deny" },
{ "name": "NPM_TOKEN", "mode": "deny" }
]
}
}
}
Không có deny-list dựng sẵn, nên chỉ những file và biến bạn liệt kê mới bị chặn. Nếu để Claude chạy tự chủ nhiều, đây là khối đáng thêm ngay. Xem thêm bẫy API key trong Claude Code cho phần rò rỉ key.
Cái sandbox KHÔNG bảo vệ
Phần quan trọng nhất bài, vì đây là chỗ dễ tin nhầm. Tài liệu nói rõ: sandbox giảm rủi ro chứ không phải một ranh giới isolation hoàn chỉnh. Biết giới hạn trước khi giao việc lớn cho nó.
Sandbox KHÔNG lo được:
TLS không bị soi (domain rộng như github.com có thể thành đường tuồn dữ liệu qua domain-fronting) · chỉ bọc lệnh Bash (MCP server, hooks, file tool chạy NGOÀI rào) · mặc định đọc được credential file · chạy unattended thật sự cần container/VM, không phải chỉ Bash sandbox.
Cụ thể vài điểm:
- Network không soi nội dung. Proxy quyết định cho/chặn dựa trên tên miền client khai, không giải mã TLS. Cho phép một domain rộng có thể mở đường exfil. Anthropic từng phải vá một lỗ egress-bypass, và họ cảnh báo thẳng chuyện domain-fronting. Nên giữ
allowedDomainshẹp. - Chỉ Bash được bọc. MCP server và hooks là tiến trình riêng chạy thẳng trên máy, không qua sandbox. File tool (Read/Edit/Write) đi qua hệ permission, không qua sandbox. Muốn bọc cả những cái đó thì cần lên một rung cao hơn (phần dưới).
- Unattended cần rào ngoài. Nếu bạn định chạy
--dangerously-skip-permissions, Bash sandbox một mình KHÔNG đủ; phải chạy trong container, VM, hay sandbox runtime. Cờ này còn bị chặn khi chạy root.
Thang isolation: sandbox vs runtime vs devcontainer vs VM
Bash sandbox là rung nhẹ nhất. Khi cần bọc nhiều hơn hoặc chạy code không tin tưởng, có cả một thang isolation. Chọn đúng rung theo mức độ rủi ro.
| Cách | Bọc gì | Cần Docker | Khi nào |
|---|---|---|---|
Bash sandbox (/sandbox) |
Chỉ lệnh Bash + con | Không | Bớt Accept khi làm hằng ngày trên máy mình |
| Sandbox runtime | Cả process (Bash, file tool, MCP, hooks) | Không | Bọc cả MCP/hooks mà không cần Docker |
| Dev container | Cả môi trường dev | Có | Chạy unattended, chuẩn hóa cho team |
| Custom container / VM | Cả OS | Có / không | Code không tin tưởng, tách kernel |
| Claude Code on web | VM Anthropic host | Không | Không muốn tự dựng hạ tầng |
Vài lưu ý ghép cặp:
- Sandbox runtime (
@anthropic-ai/sandbox-runtime, còn beta) bọc cả process bằng chính Seatbelt/bubblewrap. Chạynpx @anthropic-ai/sandbox-runtime claude; mặc định deny hết, khai báo quyền trong~/.srt-settings.json. - Dev container chạy Claude Code trong Docker do VS Code quản, non-root, firewall default-deny. Vì chặn egress ở firewall, nó hợp cho
--dangerously-skip-permissionsunattended. Đây là chỗ keyword “devcontainer” thuộc về: copy.devcontainer/mẫu vào repo rồi chỉnh allowlist. - Với việc thật sự tự chủ, nhớ:
--dangerously-skip-permissionschỉ nên chạy TRONG container/VM/runtime, và nó bị chặn khi chạy root nên dùng devcontainer (chạy non-root).
Sửa lỗi và sai lầm hay mắc
Phần lớn lỗi đến từ vài công cụ không hợp sandbox, hoặc từ kỳ vọng sai về mức bảo vệ.
dockerchạy fail. Docker không tương thích sandbox. Thêmdocker *vàoexcludedCommands.jesttreo.watchmanxung khắc sandbox. Chạyjest --no-watchman.- CLI Go (gh, gcloud, terraform) fail TLS trên macOS. Seatbelt làm chúng fail verify TLS. Thêm vào
excludedCommandsđể chạy ngoài sandbox; nếu đang dùng MITM proxy kèm custom CA thì đặtenableWeakerNetworkIsolation: truethay vì loại trừ. - Bubblewrap fail trong container. Container unprivileged không mount được
/procmới; đặtenableWeakerNestedSandbox: true(chỉ khi container ngoài đã đủ cô lập).
Sai lầm hay mắc
- Tưởng sandbox là isolation hoàn chỉnh. Không. Nó giảm rủi ro, không thay container/VM cho code không tin tưởng.
- Quên chặn credential. Default vẫn đọc
~/.aws/~/.ssh. Thêmsandbox.credentials. - Cho
allowedDomainsquá rộng. Domain rộng = đường exfil. Giữ hẹp. - Chạy
--dangerously-skip-permissionsngoài container. Bash sandbox một mình không đủ; cờ này cần rào ngoài, và bị chặn khi root.
FAQ
Windows có dùng sandbox được không?
Không trực tiếp trên native Windows. Sandbox chỉ hỗ trợ macOS, Linux, và WSL2. Trên Windows bạn chạy Claude Code trong một distro WSL2 (kiểm tra bằng wsl -l -v, phải là WSL2), rồi cài bubblewrap và socat.
Sandbox có chặn Claude đọc key không?
Mặc định là KHÔNG. Default read vẫn cho đọc ~/.aws/credentials và ~/.ssh. Muốn chặn phải khai báo khối sandbox.credentials (từ v2.1.187) để deny file và unset biến môi trường bí mật.
Sandbox khác permission mode và auto mode chỗ nào?
Permission mode quyết định một lệnh có chạy và có hỏi không; sandbox quyết định lệnh chạm được gì khi đã chạy. Auto-allow của sandbox thay prompt bằng chính cái rào OS; auto mode thì thay prompt bằng một bộ phân loại xét từng hành động. Hai thứ độc lập, ghép được.
Devcontainer khác Bash sandbox thế nào?
Bash sandbox chỉ bọc lệnh bash, không cần Docker, nhẹ. Devcontainer bọc cả môi trường dev trong Docker, chạy Claude non-root với firewall, hợp chạy unattended và chuẩn hóa cho team. Devcontainer là rung nặng hơn trên cùng thang isolation.
Sandbox có an toàn tuyệt đối không?
Không. Tài liệu nói rõ nó giảm rủi ro chứ không phải ranh giới hoàn chỉnh: TLS không bị soi, chỉ Bash được bọc, và default vẫn đọc credential. Với code không tin tưởng hay chạy tự chủ hoàn toàn, dùng container hoặc VM.
Kết luận
Sandbox là cách hay để Claude Code chạy tự chủ hơn mà bớt rủi ro: hết bấm Accept từng lệnh, mà một lệnh sai chỉ phá được trong thư mục dự án và không ra được domain lạ. Bật bằng /sandbox, và nếu bạn ở Windows thì nhớ nó sống trong WSL2.
Nhưng đừng tin nó là bức tường tuyệt đối. Mặc định vẫn đọc được key, TLS không bị soi, và chỉ lệnh Bash được bọc. Thêm sandbox.credentials, giữ allowedDomains hẹp, và khi cần chạy thật sự tự chủ thì lên rung container hay VM.
Muốn đi tiếp, đọc permission mode trong Claude Code để hiểu lớp quyết định-có-chạy-không, và cấu hình Claude Code cho toàn bộ khóa sandbox trong settings.json.
