Claude Code

Sandbox cho Bash trong Claude Code: giới hạn file và mạng ở mức hệ điều hành

Tóm tắt

Sandbox giới hạn nơi lệnh shell được ghi và kết nối, do hệ điều hành cưỡng chế, nên vẫn bảo vệ sau khi bạn đã bấm Allow. Mặc định vẫn cho đọc gần hết máy: hãy chặn thư mục khoá và giữ excludedCommands thật hẹp.

Quyền hỏi-đáp chỉ bảo vệ bạn ở thời điểm duyệt. Một khi bạn cho phép npm install, script postinstall của một package lạ có thể đọc ~/.ssh hay gửi dữ liệu ra ngoài, và không ai hỏi lại. Sandboxed Bash tool thêm một ranh giới do hệ điều hành cưỡng chế quanh mọi lệnh shell Claude chạy: giới hạn nơi được ghi file và nơi được kết nối mạng. Dựng trên gói mã nguồn mở @anthropic-ai/sandbox-runtime.

Cơ chế theo hệ điều hành

Hệ điều hànhCơ chế
macOSSeatbelt, có sẵn
Linux, WSL2bubblewrap cho filesystem + network namespace, socat chuyển lưu lượng qua proxy
Windows thuầnKhông có sandbox, cần dùng WSL2

Sandbox áp cho lệnh Bash, PowerShell, Monitor và tiến trình con. Các tool có sẵn (Read, Edit, WebFetch…), hook và MCP server chạy ngoài sandbox.

Bật sandbox

/sandbox      # mở bảng Mode, Overrides, Config

// settings.json
{
  "sandbox": {
    "enabled": true,
    "failIfUnavailable": true,
    "allowUnsandboxedCommands": false,
    "network": { "allowedDomains": ["github.com", "*.npmjs.org"] }
  }
}

failIfUnavailable khiến Claude Code thoát thay vì lặng lẽ chạy không sandbox khi thiếu dependency. Sandbox mặc định tắt.

Mặc định cho phép gì?

  • Ghi: thư mục làm việc, thư mục tạm riêng, các thư mục thêm bằng --add-dir. Các đường dẫn được bảo vệ như settings trong .claude, .bashrc, .gitconfig, .git/hooks vẫn bị cấm ghi.
  • Đọc: gần như toàn máy, kể cả ~/.ssh và ~/.aws/credentials. Đây là điểm dễ hiểu nhầm nhất: bạn phải tự chặn bằng sandbox.filesystem.denyRead hoặc sandbox.credentials.
  • Mạng: không có đường ra trực tiếp. Mọi kết nối đi qua proxy trên máy, chỉ cho phép domain trong allowedDomains (mặc định rỗng).

Sandbox giúp bớt hỏi quyền

Ở chế độ auto-allow, lệnh chạy trong sandbox không cần hỏi vì ranh giới đã giới hạn tác hại. Ask rule (ví dụ Bash(git push *)) vẫn hỏi, deny rule vẫn chặn. Với domain ngoài danh sách, quyết định phụ thuộc chế độ quyền: Manual hỏi bạn, auto mode chỉ cho qua khi bộ phân loại đồng ý.

Lối thoát và cạm bẫy

  • Thử lại không sandbox: khi lệnh lỗi trong sandbox, Claude có thể thử lại với dangerouslyDisableSandbox. Tắt bằng allowUnsandboxedCommands: false.
  • excludedCommands (ví dụ "docker compose *") chạy với toàn quyền. Pattern rộng cho interpreter (python *) là lỗ hổng: Claude có thể viết script rồi chạy nó ngoài sandbox.
  • Không tương thích: Docker; jest cần --no-watchman; trên macOS git qua SSH lỗi; trên Linux Chromium và Podman rootless hay lỗi.
  • Lệnh bạn tự gõ ở prompt ! thường chạy ngoài sandbox. UDP, QUIC, ICMP không ra được.

Cấu hình gợi ý cho dự án web

{
  "sandbox": {
    "enabled": true,
    "allowUnsandboxedCommands": false,
    "network": { "allowedDomains": ["registry.npmjs.org", "github.com"] },
    "filesystem": { "denyRead": ["~/.ssh", "~/.aws"] }
  }
}

Áp dụng thế nào?

  • Dev: Bật sandbox kèm danh sách domain tối thiểu; nhớ chặn đọc thư mục chứa khoá.
  • Tech Lead: Đưa cấu hình sandbox vào managed settings cho cả team, dùng failIfUnavailable để không ai vô tình chạy không bảo vệ. Rà soát excludedCommands như rà quyền admin.
  • PM/Security: Kết hợp sandbox với auto mode: bộ phân loại lo "có nên làm không", sandbox lo "lỡ làm thì thiệt hại tới đâu".

Nguồn & tham khảo

  1. Configure the sandboxed Bash tool — Claude Code Docs