Sandbox ให้ AI เขียนโค้ด: จำกัดไฟล์และเน็ตด้วย bubblewrap กับ Seatbelt
ให้ AI coding agent รันคำสั่งได้เองโดยไม่ต้องกดอนุมัติทุกครั้ง ด้วย sandbox ระดับ OS ตั้งขอบเขตไฟล์และเน็ตยังไง ค่าเริ่มต้นที่ต้องรู้ และส่วนที่ sandbox ไม่ครอบ
- sandbox ระดับ OS (bubblewrap บน Linux, Seatbelt บน macOS) ให้ AI รันคำสั่งได้เองภายในขอบเขต Anthropic รายงานว่าลดการขออนุมัติได้ 84% ในการใช้งานภายใน
- ต้องมีทั้งสองชั้น ไฟล์กับเน็ต มีแค่ชั้นเดียวยังรั่ว
- ค่าเริ่มต้นของ Claude Code อ่านไฟล์ได้เกือบทั้งเครื่องรวม ~/.ssh ต้องปิดการอ่านไฟล์ลับเอง
- sandbox ครอบแค่คำสั่ง shell เครื่องมือ Read/Edit, MCP server และ hook อยู่นอก sandbox
AI coding agent ที่ต้องขออนุมัติทุกคำสั่ง ทำให้คนกดอนุมัติจนชิน แล้วสุดท้ายกดผ่านโดยไม่อ่าน ซึ่งอันตรายกว่าไม่ถามเลย ทางออกที่ Anthropic ใช้กับ Claude Code คือ sandbox ระดับ OS: ให้ AI รันคำสั่งได้เองภายในขอบเขตไฟล์และเน็ตที่กำหนด ถามคนเฉพาะเมื่อจะออกนอกขอบเขต
ตรวจข้อเท็จจริงกับเอกสาร sandboxing ของ Claude Code, บทความวิศวกรรมของ Anthropic (ตุลาคม 2025) และ README ของ sandbox-runtime ณ ตุลาคม 2026 ชื่อ setting และค่าเริ่มต้นเปลี่ยนตามเวอร์ชัน ตรวจกับเอกสารของเวอร์ชันที่ใช้ก่อนเสมอ
ทำไม sandbox ดีกว่าการขออนุมัติ
การขออนุมัติทุกคำสั่งพึ่งความตั้งใจของคน ซึ่งหมดเร็ว sandbox ย้ายการตัดสินไปให้ OS: ภายในขอบเขตทำได้เลย ออกนอกขอบเขต OS ไม่ยอม ไม่ว่า AI จะถูกหลอกด้วย prompt injection หรือเขียนคำสั่งพลาดเอง
Anthropic รายงานว่าในการใช้งานภายใน sandbox ลดการขออนุมัติลง 84% (บทความไม่ได้อธิบายวิธีวัด)
ตัวอย่างคำนวณ: 84% แปลว่าอะไรในหนึ่งวัน
สมมติ session หนึ่งมีคำขออนุมัติ 100 ครั้ง ครั้งละ 5 วินาที (ตัวเลขสมมติเพื่อคิดตาม)
- ก่อนเปิด sandbox: 100 × 5 = 500 วินาที ราว 8 นาทีที่ต้องนั่งเฝ้า
- ลด 84%: 100 × (1 − 0.84) = 16 ครั้ง
- เวลาที่ใช้: 16 × 5 = 80 วินาที
ที่สำคัญกว่าเวลาคือ 16 ครั้งที่เหลือเป็นเรื่องที่ควรถามจริง เช่นจะต่อ domain ใหม่ หรือจะเขียนนอกโฟลเดอร์งาน คนจึงมีแรงอ่านทุกครั้ง
ทำงานยังไง
| ระบบ | กลไก | ต้องติดตั้ง |
|---|---|---|
| macOS | Seatbelt (มากับ OS) | ไม่ต้อง |
| Linux และ WSL2 | bubblewrap แยก namespace รวมถึง network namespace | bubblewrap, socat |
| Windows แบบ native | Claude Code รันคำสั่งไม่มี sandbox | ใช้ WSL2 แทน |
สองชั้นที่ทำงานคู่กัน
- ไฟล์ คำสั่งเขียนได้เฉพาะโฟลเดอร์งาน โฟลเดอร์ temp ของผู้ใช้ และโฟลเดอร์ที่เพิ่มไว้ ไฟล์ config ของ Claude Code เองถูกกันเขียนแม้อยู่ในโฟลเดอร์งาน เพราะถ้าแก้ได้ คำสั่งจะให้สิทธิ์ตัวเองหรือเพิ่ม hook ที่รันนอก sandbox ได้
- เน็ต คำสั่งไม่มีทางออกเน็ตตรง ทุกการเชื่อมต่อผ่าน proxy บนเครื่องที่อยู่นอก sandbox proxy ตรวจชื่อ host กับรายการ domain ที่อนุญาต ซึ่งเริ่มต้นว่าง
เอกสารเน้นว่าต้องมีทั้งสองชั้น ไม่มีชั้นเน็ต agent ที่ถูกหลอกส่งไฟล์อย่าง SSH key ออกไปได้ ไม่มีชั้นไฟล์ มันแก้ไฟล์ระบบเพื่อเปิดทางเน็ตให้ตัวเองได้
ค่าเริ่มต้นที่ต้องรู้
| ค่าเริ่มต้น | เปลี่ยนด้วย | |
|---|---|---|
| เขียน | โฟลเดอร์งาน, temp, โฟลเดอร์ที่เพิ่มไว้ | filesystem.allowWrite, filesystem.denyWrite |
| อ่าน | เกือบทั้งเครื่อง รวม ~/.ssh และ ~/.aws/credentials | filesystem.denyRead, credentials |
| เน็ต | ผ่าน proxy, domain ที่อนุญาตเริ่มต้นว่าง | network.allowedDomains, network.deniedDomains |
| ตัวแปร env | สืบทอดจาก Claude Code รวม secret ที่อยู่ใน env | credentials, CLAUDE_CODE_SUBPROCESS_ENV_SCRUB |
เปิด sandbox แล้วไม่ได้แปลว่าไฟล์ลับปลอดภัย ค่าเริ่มต้นยังอ่าน ~/.ssh ได้ ต้องปิดเอง
ตั้งค่า: Ubuntu หรือ WSL2
ติดตั้งของที่ต้องใช้ (Debian/Ubuntu ตามเอกสาร)
sudo apt-get install bubblewrap socat
เปิดใน session ด้วยคำสั่ง /sandbox แผงที่ขึ้นมาบอกด้วยว่าขาดอะไร หรือใส่ใน ~/.claude/settings.json:
{
"sandbox": {
"enabled": true,
"allowUnsandboxedCommands": false,
"filesystem": {
"denyRead": ["~/.ssh", "~/.aws", "~/.config/gcloud"]
},
"network": {
"allowedDomains": ["github.com", "*.npmjs.org", "registry.npmjs.org", "pypi.org", "files.pythonhosted.org"]
}
}
}
allowUnsandboxedCommands: falseปิดทางที่ AI จะขอรันคำสั่งที่ล้มใน sandbox ซ้ำแบบไม่มี sandbox (ปกติคำสั่งที่ล้มขอรันซ้ำนอก sandbox ได้ผ่านพารามิเตอร์dangerouslyDisableSandboxแล้วผ่านขั้นขออนุมัติตามปกติ)denyReadกันคำสั่ง shell อ่าน key และ credential- domain ใส่เท่าที่งานใช้จริง
ทดสอบว่าทำงาน: ให้ AI เป็นคนรัน touch ~/sandbox-probe (คำสั่งที่เราพิมพ์เองหลัง ! มักรันนอก sandbox จึงทดสอบไม่ได้) บน Linux/WSL2 ต้องได้ Read-only file system บน macOS ได้ Operation not permitted ถ้า touch สำเร็จ ให้ลบไฟล์ทิ้งแล้วเปิด /sandbox ดูว่าเปิดอยู่จริงไหม
ส่วนที่ sandbox ไม่ครอบ
นี่คือข้อที่คนเข้าใจผิดบ่อยที่สุด sandbox ห่อเฉพาะคำสั่ง shell (Bash, PowerShell, Monitor และ process ลูก) สิ่งเหล่านี้อยู่นอก sandbox:
- เครื่องมือในตัว Read, Edit, Write, WebFetch, WebSearch ใช้กฎ permission แทน
denyReadไม่หยุดเครื่องมือ Read และallowedDomainsไม่จำกัด WebFetch ต้องตั้ง deny rule ของ permission แยกอีกชุด - process อื่นที่ Claude Code เปิด hook, MCP server ที่รันบนเครื่อง, LSP server, คำสั่ง status line รันด้วยสิทธิ์เต็มของเรา
- คำสั่งที่พิมพ์เองหลัง
!ใน session ส่วนใหญ่ - คำสั่งใน
excludedCommandsและการรันซ้ำนอก sandbox ที่เราอนุมัติ
ถ้าต้องการขอบเขตเดียวครอบทุกอย่าง ให้รัน agent ทั้ง process ใน container, VM หรือใช้ sandbox-runtime (srt) ที่ Anthropic เปิดซอร์สไว้ ซึ่งห่อ process ใดก็ได้ รวมถึง agent ตัวอื่นและ MCP server สถานะ ณ ตุลาคม 2026 ยังเป็น beta research preview
npm install -g @anthropic-ai/sandbox-runtime
srt "curl example.com" # blocked unless example.com is in ~/.srt-settings.json
srt "cat ~/.ssh/id_rsa" # Operation not permitted, when ~/.ssh is in denyRead
ข้อจำกัดด้านความปลอดภัย
- proxy ตัดสินจากชื่อ host ไม่ได้เปิดดู TLS อนุญาต domain กว้าง ๆ อย่าง
github.comเปิดทางส่งข้อมูลออกได้ และเอกสารเตือนเรื่อง domain fronting ที่อาจใช้หลบ allowlist - Unix socket อนุญาต
/var/run/docker.sockเท่ากับให้คุมเครื่อง host ได้ทั้งเครื่อง (บทเรื่อง Docker hardening อธิบายว่าทำไม socket นี้เท่ากับ root) - เปิดเขียนกว้างเกิน เขียน
.bashrc,.zshrcหรือโฟลเดอร์ใน$PATHได้ คือเปิดทางให้โค้ดไปรันนอก sandbox ตอนเราเปิด shell ครั้งหน้า enableWeakerNestedSandboxทำให้ใช้ใน Docker ได้ แต่อ่อนลงมาก ใช้เมื่อมีชั้นแยกอื่นครอบอยู่แล้วเท่านั้น
ข้อผิดพลาดที่เจอบ่อย
- คิดว่าเปิด sandbox แล้ว key ปลอดภัย ค่าเริ่มต้นยังอ่าน
~/.sshได้ ต้องใส่denyReadหรือcredentialsและดีที่สุดคืออย่าเก็บ key ของ production ไว้บนเครื่องที่ AI ทำงาน - ใส่
docker *ใน excludedCommands เพราะ docker ใช้ใน sandbox ไม่ได้ เท่ากับให้ AI ใช้ docker ด้วยสิทธิ์เต็ม จำกัดให้แคบที่สุด - อนุญาต domain แบบ
*เพราะขี้เกียจตอบ prompt ชั้นเน็ตหายไปทั้งชั้น - ทดสอบด้วยการพิมพ์คำสั่งเอง คำสั่งหลัง
!มักไม่ผ่าน sandbox ผลทดสอบจึงหลอกตา - เปิด sandbox บน Windows native แล้วคิดว่าป้องกันอยู่ ไม่มี sandbox ต้องใช้ WSL2
- ลืมว่า
npm installก็เป็นคำสั่ง postinstall script จากแพ็กเกจรันใน sandbox ด้วย ซึ่งดี แต่ถ้า excluded ไว้ มันรันด้วยสิทธิ์เต็ม ดูบทเรื่อง supply chain
แหล่งอ้างอิง
คำถามที่พบบ่อย
ใช้บน Windows ได้ไหม
บน Windows แบบ native Claude Code รันคำสั่งโดยไม่มี sandbox ถ้าต้องการ sandbox ให้รัน Claude Code ใน WSL2 ซึ่งใช้ bubblewrap เหมือน Linux
ทำไม ssh หรือ client ฐานข้อมูลต่อไม่ได้ ทั้งที่ใส่ host ใน allowedDomains แล้ว
sandbox ส่งเน็ตผ่าน proxy ด้วยตัวแปร HTTP_PROXY/HTTPS_PROXY เครื่องมือที่ไม่อ่านตัวแปรเหล่านี้ เช่น ssh ธรรมดาและ driver ฐานข้อมูลส่วนใหญ่ จึงต่อไม่ได้ UDP และ ping ก็ออกไม่ได้
เปิด sandbox แล้วปลอดภัยพอให้ปล่อย AI ทำงานคนเดียวไหม
ลดความเสี่ยงได้มาก แต่เอกสารบอกเองว่าไม่ใช่ขอบเขตแยกที่สมบูรณ์ ถ้าต้องการขอบเขตครอบทั้ง process ให้รัน agent ทั้งตัวใน container, VM หรือ sandbox-runtime
คำสั่งและค่าตั้งในบทความทดสอบบนระบบตัวอย่าง ลองบนเครื่องทดสอบก่อนใช้กับระบบจริงเสมอ