SpyBara
Go Premium

sandboxing.md 2026-10-01 23:59 UTC to 2026-10-02 13:00 UTC

This page contains 596 additions and 297 deletions.

2026
Fri 2 13:58

Konfigurasikan tool Bash dengan sandbox

Batasi file dan host jaringan yang dapat dijangkau oleh perintah shell Claude Code dengan sandbox bawaan. Aktifkan, tetapkan batasnya, dan perbaiki hal-hal yang terganggu olehnya.

Sandbox Bash adalah batas yang diterapkan oleh sistem operasi di sekitar perintah shell yang dijalankan Claude di mesin Anda. Anda menetapkan file dan domain jaringan mana yang dapat dijangkau oleh perintah tersebut, dan batasan tersebut berlaku untuk perintah Bash, PowerShell, dan Monitor serta proses yang dimulainya. Karena sistem operasi menerapkan batasan tersebut saat perintah berjalan, Claude Code dapat menjalankan perintah dalam sandbox tanpa meminta Anda untuk menyetujui setiap perintah.

Sandbox hanya mencakup perintah shell. Tool file Claude, server MCP, dan hook berjalan di luarnya.

Sandbox berjalan di macOS, Linux, dan WSL2. Di Windows native, Claude Code menjalankan perintah tanpa sandbox. Untuk menggunakan sandbox di mesin Windows, jalankan Claude Code di dalam distribusi WSL2.

Apa yang dibatasi oleh sandbox

Saat sandbox aktif, perintah shell yang dijalankan Claude dimulai di dalam batasnya, demikian pula proses yang dimulai oleh perintah tersebut. Sandbox nonaktif secara default. Untuk mengaktifkannya, jalankan /sandbox dalam sebuah sesi, seperti yang ditunjukkan di Memulai, atau atur sandbox.enabled ke true dalam file pengaturan seperti ~/.claude/settings.json.

Tabel berikut menunjukkan apa yang dapat dijangkau oleh perintah yang berjalan di sandbox secara default dan pengaturan yang mengubah setiap default tersebut.

Akses Default Ubah dengan
Penulisan Direktori kerja, direktori temp per pengguna, dan direktori yang telah Anda tambahkan. Path yang dilindungi tetap ditolak untuk penulisan filesystem.allowWrite, filesystem.denyWrite
Pembacaan Sebagian besar mesin, termasuk file kredensial seperti ~/.ssh dan ~/.aws/credentials filesystem.denyRead, credentials
Jaringan Tidak ada rute keluar langsung. Koneksi melewati proxy di mesin Anda yang memeriksa setiap host terhadap domain yang Anda izinkan, yang awalnya kosong. Mode izin Anda menentukan apa yang terjadi pada host lain network.allowedDomains, network.deniedDomains
Environment variable Diwarisi dari Claude Code, termasuk rahasia apa pun di lingkungannya credentials, CLAUDE_CODE_SUBPROCESS_ENV_SCRUB

Claude Code membangun sandbox di atas paket open source @anthropic-ai/sandbox-runtime.

Apa yang berjalan di luar sandbox

Sandbox membungkus perintah shell. Tool dan proses berikut berjalan di luarnya:

  • Tool file dan web bawaan: tool seperti Read, Edit, Write, WebFetch, dan WebSearch mengikuti aturan izin sebagai gantinya. Entri denyRead tidak menghentikan tool Read, dan allowedDomains tidak membatasi WebFetch
  • Proses lain yang dimulai Claude Code: hook perintah, server MCP lokal, monitor plugin, server LSP, dan perintah pembantu seperti perintah baris status Anda dan apiKeyHelper berjalan dengan akses penuh Anda

Beberapa perintah shell juga berjalan di luar sandbox, tergantung pada pengaturan Anda:

Untuk menempatkan tool, proses, dan perintah di bagian ini di balik satu batas, jalankan proses Claude Code itu sendiri di dalam container, mesin virtual, atau sandbox runtime.

Memulai

Sandbox sudah terpasang di dalam Claude Code. Apa yang perlu Anda instal bergantung pada platform Anda:

  • macOS: sandboxing menggunakan framework Seatbelt bawaan, sehingga Anda dapat langsung menuju langkah-langkahnya
  • Linux dan WSL2: sandbox bergantung pada bubblewrap dan socat, yang dibahas di Menyiapkan Linux dan WSL2. Meskipun Anda belum menginstalnya, Anda dapat memulai dengan /sandbox, karena panelnya menunjukkan apakah ada yang belum terpasang
1

Jalankan /sandbox

Mulai sesi Claude Code dan jalankan perintah /sandbox:

/sandbox

Ini membuka panel sandbox dengan tiga tab, ditambah tab Dependencies di Linux ketika filter seccomp opsional belum terpasang:

  • Mode: pilih cara perintah yang di-sandbox disetujui, dibahas pada langkah berikutnya
  • Overrides: pilih apakah perintah yang gagal di bawah sandbox dapat kembali berjalan tanpa sandbox. Ini adalah pengaturan allowUnsandboxedCommands
  • Config: lihat pengaturan sandbox yang telah diselesaikan

Jika panel hanya menampilkan tab Dependencies, berarti ada paket wajib yang belum terpasang. Instal paket tersebut seperti yang dijelaskan di Menyiapkan Linux dan WSL2, mulai ulang Claude Code, lalu jalankan /sandbox lagi.

2

Pilih mode

Pada tab Mode, pilih auto-allow atau regular permissions. Auto-allow menjalankan perintah yang di-sandbox tanpa permintaan izin, sedangkan regular permissions tetap mempertahankan permintaan izin biasa bahkan ketika perintah di-sandbox. Lihat Mode sandbox untuk perintah mana saja yang tetap memunculkan permintaan izin dalam mode auto-allow.

3

Jalankan perintah Bash

Minta Claude menjalankan sebuah perintah, seperti build atau rangkaian pengujian. Secara default, perintah di dalam sandbox dapat menulis ke direktori kerja, direktori temp per pengguna, dan direktori apa pun yang telah Anda tambahkan dengan --add-dir, /add-dir, atau permissions.additionalDirectories.

Saat pertama kali sebuah perintah memerlukan domain jaringan baru, Claude Code meminta persetujuan; dalam auto mode, Claude justru menyebutkan host yang dibutuhkan perintah pada perintah itu sendiri agar pengklasifikasi meninjaunya bersama perintah tersebut.

Untuk memperluas atau mempersempit apa yang diizinkan sandbox, lihat Mengonfigurasi sandboxing.

Jika perintah yang di-sandbox gagal dengan Operation not permitted di dalam container, lihat Bubblewrap gagal dimulai di dalam container.

Ketika Anda memilih mode di panel, Claude Code menyimpannya ke pengaturan lokal proyek Anda di .claude/settings.local.json, yang berlaku untuk proyek saat ini. Claude Code menambahkan file tersebut ke gitignore global Anda ketika menyimpan pengaturan di sana. Untuk mengaktifkan sandbox di semua proyek Anda, atur sandbox.enabled ke true dalam pengaturan pengguna Anda di ~/.claude/settings.json. Untuk mewajibkan sandboxing bagi setiap developer dalam organisasi, gunakan pengaturan terkelola.

Untuk mengubah sandbox untuk satu sesi tanpa menulis ke file pengaturan, mulai Claude Code dengan --settings. Misalnya, perintah ini memulai sesi yang di-sandbox di mana Claude tidak dapat mencoba ulang perintah yang diblokir di luar sandbox:

claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'

Memastikan perintah berjalan di dalam sandbox

Untuk memeriksa apakah sandbox berfungsi, minta Claude menjalankan setiap baris dalam tabel. Apa yang Anda ketik di prompt ! biasanya berjalan di luar sandbox, sehingga mengetik baris tersebut sendiri tidak mengujinya.

Perintah Hasil di dalam sandbox
touch ~/sandbox-probe Gagal dengan Operation not permitted di macOS, atau Read-only file system di Linux dan WSL2
curl --noproxy '*' https://example.com Gagal dengan Could not resolve host, karena perintah tidak memiliki jalur untuk melewati proxy sandbox

Jika Claude meminta untuk mencoba ulang perintah yang gagal di luar sandbox, tolak retry tersebut. Jika touch berhasil dan direktori home Anda bukan salah satu direktori yang diizinkan sandbox untuk ditulisi oleh perintah, hapus ~/sandbox-probe. Kemudian jalankan /sandbox untuk memeriksa bahwa sandbox aktif dan dependensinya terinstal.

Menyiapkan Linux dan WSL2

Di Linux dan WSL2, sandbox bergantung pada paket-paket berikut:

  • bubblewrap: tool sandboxing tanpa hak istimewa yang menerapkan isolasi filesystem
  • socat: relay yang digunakan untuk merutekan lalu lintas jaringan melalui proxy sandbox

Instal paket-paket tersebut dengan package manager distribusi Anda:

sudo apt-get install bubblewrap socat

Ketika ada dependensi yang belum terpasang, tab Dependencies di /sandbox mencantumkan mana di antara ripgrep, bubblewrap, socat, dan filter seccomp yang tidak dimiliki platform Anda. Jika Anda tidak melihat tab tersebut setelah menginstal dan memulai ulang Claude Code, berarti semua dependensi sudah tersedia.

Ripgrep sudah dibundel dengan binary native Claude Code. Filter seccomp bersifat opsional dan menambahkan pemblokiran Unix domain socket. Instal dengan npm install -g @anthropic-ai/sandbox-runtime jika belum terpasang.

Ketika dependensi wajib belum terpasang, tab Dependencies adalah satu-satunya tab yang ditampilkan hingga Anda menginstalnya. Ketika hanya filter seccomp opsional yang belum terpasang, tab Dependencies muncul bersama tab lainnya. Pemeriksaan dependensi berjalan saat startup, jadi mulai ulang Claude Code setelah menginstal paket agar /sandbox dapat mendeteksinya.

Di Ubuntu 24.04 dan yang lebih baru, kebijakan AppArmor default mencegah bubblewrap membuat user namespace yang dibutuhkannya untuk isolasi.
Untuk memeriksa apakah lingkungan Anda menerapkan pembatasan ini, termasuk di dalam WSL2, jalankan `sysctl kernel.apparmor_restrict_unprivileged_userns`. Jika perintah mengembalikan `0`, lewati langkah ini. Jika perintah mencetak error `No such file or directory`, berarti key tersebut tidak ada dan Anda dapat melewati langkah ini. Jika mengembalikan `1`, tambahkan profil AppArmor yang memberikan kemampuan ini kepada `bwrap`:

```bash theme={null}
sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'
abi <abi/4.0>,
include <tunables/global>

profile bwrap /usr/bin/bwrap flags=(unconfined) {
  userns,
  include if exists <local/bwrap>
}
EOF
```

Profil ini hanya berlaku untuk `bwrap` itu sendiri, bukan untuk perintah yang dijalankannya di dalam sandbox. Muat ulang AppArmor untuk menerapkannya:

```bash theme={null}
sudo systemctl reload apparmor
```
Catatan WSL2

Periksa versi WSL Anda dengan wsl -l -v dari PowerShell. Jika Anda melihat Sandboxing requires WSL2, distribusi Anda berjalan di WSL1. Tingkatkan ke WSL2 atau jalankan Claude Code tanpa sandboxing.

Di WSL2, WSL menyerahkan peluncuran binary Windows seperti cmd.exe, powershell.exe, atau apa pun di bawah /mnt/c/ ke host Windows melalui Unix socket, sehingga apakah perintah yang di-sandbox dapat meluncurkannya mengikuti pengaturan Unix socket sandbox: filter seccomp opsional harus terinstal agar socket tersebut dapat diblokir sejak awal. Untuk mengizinkan peluncuran ini, atur allowAllUnixSockets, yang membuka setiap Unix socket bagi perintah yang di-sandbox.

Mode sandbox

Claude Code menawarkan dua mode sandbox. Pada keduanya, sandbox menerapkan pembatasan filesystem dan jaringan yang sama; perbedaannya hanya pada apakah perintah yang di-sandbox disetujui secara otomatis atau memerlukan izin eksplisit.

Mode auto-allow

Claude Code menyetujui perintah secara otomatis, tanpa permintaan izin, ketika perintah berjalan di dalam sandbox. Sebuah perintah melalui alur izin biasa ketika berjalan di luar sandbox karena cocok dengan excludedCommands atau karena Claude mencobanya ulang tanpa sandbox.

Perintah yang di-sandbox yang terhubung ke host yang belum Anda izinkan tetap berada di dalam sandbox. Host di luar domain yang Anda izinkan membahas siapa yang memutuskan apakah koneksi tersebut diteruskan.

Bahkan dalam mode auto-allow, hal-hal berikut tetap berlaku:

  • Aturan deny eksplisit selalu dipatuhi
  • Perintah rm atau rmdir yang menargetkan jalur kritis tetap melalui alur izin biasa
  • Aturan ask yang dibatasi konten seperti Bash(git push *) tetap memaksa munculnya permintaan izin bahkan untuk perintah yang di-sandbox
  • Aturan ask Bash polos, atau bentuk setaranya Bash(*), dilewati untuk perintah yang berjalan di-sandbox; aturan ini tetap berlaku untuk perintah yang kembali ke alur izin biasa. Dalam plan mode, aturan ini tidak dilewati: aturan ini memunculkan permintaan izin untuk perintah yang di-sandbox juga, termasuk yang read-only

Mode regular permissions

Semua perintah Bash melalui alur izin biasa, bahkan ketika di-sandbox. Ini memberikan kontrol lebih besar tetapi memerlukan lebih banyak persetujuan.

Jalan keluar retry tanpa sandbox

Retry tanpa sandbox adalah jalan keluar untuk perintah yang gagal di dalam sandbox, seperti tool yang tidak kompatibel dengannya. Ketika sandbox memblokir koneksi jaringan, Claude Code menyebutkan host yang ditolak dalam hasil perintah, sehingga Claude melihat apa yang diblokir. Claude menganalisis kegagalan tersebut dan dapat mencoba ulang perintah dengan parameter dangerouslyDisableSandbox.

Perintah yang dicoba ulang berjalan tanpa sandbox. Dalam sesi terminal interaktif, siapa yang menyetujuinya bergantung pada mode izin Anda:

  • Mode bypassPermissions: retry berjalan tanpa permintaan izin
  • Mode Manual dan mode acceptEdits: Anda mendapatkan permintaan izin berjudul "Bash command (unsandboxed)"
  • Auto mode: model pengklasifikasi terpisah mengevaluasi perintah yang mendasarinya
  • Mode dontAsk: Claude Code menolak retry tersebut
  • Plan mode: lihat cara Claude Code membatasi perintah saat Anda membuat rencana

Aturan dan pengaturan berikut mengubah siapa yang menyetujui retry:

  • Aturan allow yang cocok: jika aturan allow seperti Bash(curl *) cocok dengan perintah, aturan tersebut juga menyetujui retry, sehingga perintah berjalan di luar sandbox tanpa permintaan izin
  • Aturan ask untuk parameter: tambahkan aturan ask untuk Bash(dangerouslyDisableSandbox:true) agar Anda dimintai izin pada retry Bash. Anda juga mendapatkan permintaan izin dalam auto mode dan mode bypassPermissions, dan aturan ini diutamakan daripada aturan allow yang cocok
  • permissions.blockReadsOutsideWorkingDirectories: Tindakan yang tidak disetujui otomatis oleh mode mana pun membahas retry yang memunculkan permintaan izin saat pengaturan ini aktif

Matikan retry dengan strict sandbox mode

Anda dapat menonaktifkan retry tanpa sandbox dengan mengatur "allowUnsandboxedCommands": false dalam pengaturan sandbox Anda. Dengan retry dinonaktifkan, Claude Code mengabaikan parameter dangerouslyDisableSandbox. Selama sandbox berjalan, perintah yang dijalankan Claude kemudian di-sandbox kecuali cocok dengan entri excludedCommands. Untuk mencegah Claude Code menjalankan perintah tanpa sandbox ketika sandbox tidak dapat dimulai, atur juga failIfUnavailable. Tab Overrides di /sandbox menampilkan pengaturan ini sebagai Strict sandbox mode.

Nilai false dalam pengaturan pengguna Anda, --settings, atau pengaturan terkelola tetap berlaku bahkan ketika pengaturan proyek mengatur true. Nilai false dalam pengaturan pengguna Anda tidak membuat sandbox menjadi wajib oleh admin, sehingga pengaturan sandbox lain dari proyek tetap berlaku. Sebelum v2.1.285, nilai true dari proyek menimpa nilai false dalam pengaturan pengguna Anda.

Jika Anda atau administrator Anda menonaktifkan retry dalam pengaturan terkelola atau dengan flag --settings, sandbox menjadi wajib oleh admin. Claude Code kemudian mengabaikan pengaturan dalam file repositori yang melonggarkan sandbox, termasuk entri excludedCommands. Pengaturan repositori di bawah sandbox yang diwajibkan admin mencantumkan pengaturan tersebut.

Strict sandbox mode berlaku untuk perintah yang dijalankan Claude. Perintah yang Anda ketik sendiri di prompt shell-mode ! berjalan di luar sandbox kecuali sesinya merupakan salah satu dari berikut:

Sebelum v2.1.260, strict sandbox mode men-sandbox perintah shell-mode di setiap sesi.

Direktori sementara

Direktori temp per pengguna dapat ditulisi di dalam sandbox secara default, bersama dengan direktori kerja. Kecuali Anda menonaktifkan isolasi filesystem, Claude Code mengatur $TMPDIR ke direktori ini untuk perintah yang di-sandbox, sehingga tool yang menulis file sementara dapat bekerja tanpa konfigurasi tambahan.

Perintah tanpa sandbox mewarisi $TMPDIR dari shell Anda ketika variabel tersebut diatur, sehingga selama isolasi filesystem aktif, perintah yang di-sandbox dan yang tidak di-sandbox menyelesaikan $TMPDIR ke direktori yang berbeda. Jika shell Anda membiarkan $TMPDIR tidak diatur atau kosong, perintah tanpa sandbox yang mereferensikan $TMPDIR menerima override CLAUDE_CODE_TMPDIR Anda, atau direktori temp sistem operasi ketika Anda belum mengaturnya atau override tersebut berupa jalur yang panjang, sehingga variabel tersebut tidak diekspansi menjadi string kosong. Untuk meneruskan file sementara di antara keduanya, tuliskan file tersebut di bawah direktori kerja.

Mengonfigurasi sandboxing

Sesuaikan perilaku sandbox melalui file settings.json Anda. Lihat Pengaturan untuk referensi konfigurasi lengkap.

Secara default, perintah yang berjalan di sandbox dapat menulis ke direktori kerja saat ini, direktori temp per pengguna, dan direktori apa pun yang telah Anda tambahkan dengan --add-dir, /add-dir, atau permissions.additionalDirectories. Jika perintah subproses seperti kubectl, terraform, atau npm perlu menulis di luar direktori tersebut, gunakan sandbox.filesystem.allowWrite untuk memberikan akses ke path tertentu:

{
  "sandbox": {
    "enabled": true,
    "filesystem": {
      "allowWrite": ["~/.kube", "/tmp/build"]
    }
  }
}

Path ini diberlakukan di tingkat OS, sehingga semua perintah yang berjalan di dalam sandbox, termasuk proses turunannya, mematuhinya. Ini adalah pendekatan yang direkomendasikan ketika sebuah tool memerlukan akses tulis ke lokasi tertentu, alih-alih mengecualikan tool tersebut dari sandbox sepenuhnya dengan excludedCommands.

Ketika Anda mendefinisikan array filesystem yang sama di beberapa cakupan pengaturan, Claude Code menggabungkannya, yaitu mengombinasikan path dari setiap cakupan alih-alih mengganti array dari satu cakupan dengan array dari cakupan lain.

Jika Anda mengecualikan suatu sumber dengan --setting-sources di CLI atau settingSources di Agent SDK, Claude Code mengabaikan entri sandbox.filesystem, aturan izin Edit, dan aturan deny Read dari sumber tersebut saat membangun konfigurasi sandbox. Memerlukan Claude Code v2.1.246 atau lebih baru.

Ketika Anda mengedit daftar filesystem ini selama sesi, Claude Code menerapkan perubahan tersebut ke sesi yang sedang berjalan, sehingga perintah sandbox berikutnya berjalan dengan path yang baru.

Path filesystem sandbox menggunakan konvensi standar: /tmp/build adalah path absolut dan ~/.kube relatif terhadap direktori home Anda. Ini berbeda dari aturan izin Read dan Edit, yang menggunakan //path untuk path absolut dan /path untuk path relatif terhadap proyek. Untuk path relatif, garis miring di akhir, dan wildcard, lihat Prefiks path sandbox.

Anda juga dapat menolak akses tulis atau baca menggunakan sandbox.filesystem.denyWrite dan sandbox.filesystem.denyRead, dan mengizinkan kembali path tertentu di dalam wilayah yang ditolak menggunakan sandbox.filesystem.allowRead. Ketika aturan baca tumpang tindih, aturan dengan path yang lebih sempit yang berlaku:

Contoh aturan Hasil
"denyRead": ["~/"] dengan "allowRead": ["~/projects"] ~/projects dapat dibaca dan bagian lain dari direktori home tetap diblokir. Allow yang lebih sempit membuka kembali bagian tersebut dari wilayah yang ditolak
"allowRead": ["~/"] dengan "denyRead": ["~/.env"] ~/.env tetap diblokir dan bagian lain dari direktori home dapat dibaca. Deny tetap berlaku di dalam allow yang lebih luas, sehingga allow yang luas tidak dapat secara diam-diam mengekspos kembali sebuah rahasia
"allowRead": ["~/"] dengan "denyRead": ["~/**/.env"] Setiap .env di bawah direktori home tetap diblokir dan sisanya dapat dibaca. Deny dengan wildcard tetap berlaku di dalam allow yang lebih luas dengan cara yang sama seperti path yang persis

Contoh di bawah ini memblokir pembacaan dari seluruh direktori home sambil tetap mengizinkan pembacaan dari proyek saat ini. Letakkan di .claude/settings.json proyek Anda, karena path relatif . di-resolve ke root proyek hanya ketika konfigurasi berada di pengaturan proyek:

{
  "sandbox": {
    "enabled": true,
    "filesystem": {
      "denyRead": ["~/"],
      "allowRead": ["."]
    }
  }
}

Jika Anda meletakkan konfigurasi yang sama di ~/.claude/settings.json, . akan di-resolve ke ~/.claude, dan file proyek akan tetap diblokir oleh aturan denyRead.

Untuk menolak akses baca perintah sandbox ke direktori home dan volume yang di-mount sambil menjaga direktori kerja tetap dapat dibaca, atur permissions.blockReadsOutsideWorkingDirectories alih-alih menulis aturan path.

Menjalankan perintah di luar sandbox dengan `excludedCommands`

Cantumkan pola perintah di sandbox.excludedCommands untuk menjalankan perintah yang cocok di luar sandbox, yang berarti tanpa pembatasan filesystem dan tanpa proxy jaringan. Gunakan ini untuk tool yang tidak dapat bekerja di dalam sandbox dan yang Anda percayai dengan akses penuh Anda. Tool yang memerlukan satu direktori atau satu host tambahan mungkin dapat bekerja dengan allowWrite atau allowedDomains, yang menjaga perintah tetap berada di dalam sandbox.

Contoh ini mengeluarkan perintah docker compose dari sandbox. Simpan di ~/.claude/settings.json untuk menerapkannya ke semua proyek Anda:

{
  "sandbox": {
    "enabled": true,
    "excludedCommands": ["docker compose *"]
  }
}

Claude Code memeriksa entri Anda terhadap setiap panggilan Bash dan Monitor. Sebuah panggilan adalah seluruh baris perintah yang dikirim Claude, yang dapat merangkai beberapa perintah. Aturan berikut menentukan apakah sebuah panggilan keluar dari sandbox:

  • Akhiri pola dengan *: entri menggunakan sintaks yang sama dengan aturan izin Bash(...), di mana pola tanpa wildcard merupakan kecocokan persis. docker hanya cocok dengan docker tanpa argumen. docker * cocok dengan docker dengan atau tanpa argumen
  • Setiap perintah dalam panggilan harus cocok: npm ci && docker compose build tetap berada di dalam sandbox kecuali ada entri lain yang mencakup npm ci
  • Claude Code mencocokkan teks panggilan: skrip atau target make yang memanggil docker secara internal tidak cocok, begitu pula /usr/local/bin/docker
  • Beberapa panggilan tetap berada di dalam sandbox: redirect ke file, cd, atau command substitution seperti $(...) membuat seluruh panggilan tetap berada di dalam sandbox. Entri referensi mencantumkan lebih banyak panggilan yang tetap berada di dalam sandbox
  • Lokasi penyimpanan entri dapat berpengaruh: selama sandbox diwajibkan oleh admin, Claude Code mengabaikan entri di .claude/settings.json dan .claude/settings.local.json

Perintah yang dikecualikan melewati alur izin biasa:

  • Perintah read-only dan perintah yang dicakup oleh aturan allow Anda berjalan tanpa permintaan izin
  • Dalam auto mode, pengklasifikasi meninjau perintah lain yang dikecualikan
  • Dalam mode bypassPermissions, perintah yang dikecualikan berjalan tanpa permintaan izin kecuali ada aturan ask yang cocok dengannya

Untuk memastikan sebuah entri cocok, beralihlah ke mode Manual dan minta Claude menjalankan perintah yang cocok yang mengubah sesuatu, seperti docker compose up -d. Dialog izin akan berjudul "Bash command (unsandboxed)".

Menonaktifkan isolasi filesystem

Atur sandbox.filesystem.disabled ke true untuk melewati isolasi filesystem sambil tetap mempertahankan isolasi jaringan. Contoh di bawah ini mematikan isolasi filesystem sambil tetap mempertahankan allowlist domain jaringan:

{
  "sandbox": {
    "enabled": true,
    "filesystem": {
      "disabled": true
    },
    "network": {
      "allowedDomains": ["github.com", "*.npmjs.org"]
    }
  }
}

Sandbox memiliki dua lapisan independen: isolasi filesystem mengontrol path mana yang dapat dibaca dan ditulis oleh perintah sandbox, dan isolasi jaringan mengontrol domain mana yang dapat mereka jangkau. Dengan lapisan filesystem dimatikan, perintah sandbox mendapatkan akses baca dan tulis tanpa batas ke filesystem host, sementara lalu lintas jaringan keluarnya tetap terbatas pada domain yang Anda izinkan. Matikan lapisan ini ketika Anda menggunakan sandbox untuk mengontrol ke mana perintah terhubung, bukan apa yang mereka tulis.

sandbox.filesystem.disabled default ke false. Memerlukan Claude Code v2.1.216 atau lebih baru.

Pengaturan mana yang dapat menonaktifkannya

Karena mematikan isolasi filesystem memperluas apa yang dapat dilakukan perintah sandbox, Claude Code hanya menghormati filesystem.disabled dari sumber pengaturan berikut:

  • Pengaturan pengguna, pengaturan terkelola, dan flag CLI --settings dapat mengaturnya. Pengaturan proyek di .claude/settings.json dan .claude/settings.local.json tidak dapat, sehingga proyek yang di-checkout tidak dapat mematikan isolasi filesystem.
  • Ketika pengaturan terkelola mengonfigurasi sandbox.filesystem sama sekali, atau mencantumkan entri sandbox.credentials.files apa pun dengan "mode": "deny", hanya pengaturan terkelola yang dapat mengatur kunci tersebut. Ini menjaga pembatasan filesystem yang di-deploy administrator tetap berlaku; untuk melonggarkan deployment semacam itu, atur "disabled": true di pengaturan terkelola.
  • Ketika CLAUDE_CODE_SUBPROCESS_ENV_SCRUB diatur, Claude Code mengabaikan filesystem.disabled dari setiap sumber, termasuk pengaturan terkelola, dan tetap mengaktifkan isolasi filesystem.

Entri mask yang valid tidak mengunci kunci tersebut, bahkan ketika Claude Code melakukan fallback ke deny untuk entri tersebut saat startup. Cantumkan path yang tidak dapat di-mask, seperti direktori kredensial, sebagai entri deny eksplisit di pengaturan terkelola, yang mengunci kunci tersebut.

Apa yang berubah saat isolasi filesystem dimatikan

Mengatur filesystem.disabled mencabut perlindungan yang diberlakukan oleh lapisan filesystem itu sendiri. Perlindungan yang diberlakukan oleh lapisan lain tetap berlaku:

Perlindungan Dengan isolasi filesystem dimatikan
filesystem.denyRead dan blokir baca deny credentials.files Tidak diberlakukan. Lapisan filesystem yang menerapkan keduanya
Entri deny dan mask credentials.envVars Diberlakukan. Pembersihan environment variable tidak bergantung pada lapisan filesystem
Entri mask credentials.files yang diterapkan sebagai mask Diberlakukan: masking tidak bergantung pada lapisan filesystem. Entri yang mengalami fallback ke deny tidak diberlakukan, seperti entri deny lainnya

Dua hal lain berubah:

  • Perintah sandbox mewarisi $TMPDIR shell Anda alih-alih direktori temp per pengguna, karena setiap direktori temp dapat ditulis dan Claude Code tidak lagi mengarahkan perintah ke direktori per pengguna.

    Di Linux, variabel ini sering kali tidak diatur di shell induk. Panduan tool Bash memberi tahu Claude untuk membuat direktori sementara dengan mktemp -d alih-alih mengandalkan $TMPDIR.

  • autoAllowBashIfSandboxed tetap default ke true, sehingga perintah sandbox tetap berjalan tanpa permintaan izin. Atur ke false untuk meminta izin bagi perintah sandbox.

Melindungi kredensial

Pengaturan sandbox.credentials mendeklarasikan file kredensial dan environment variable yang akan dilindungi dari perintah sandbox. Setiap entri menyebutkan path file atau environment variable dan sebuah mode. Blok credentials khusus ini menjaga aturan kredensial tetap terkelompok dan terpisah dari aturan filesystem umum.

Untuk entri dengan "mode": "deny", path file ditolak untuk dibaca di dalam sandbox, pembatasan yang sama dengan yang diterapkan filesystem.denyRead, dan environment variable dihapus sebelum setiap perintah sandbox dijalankan. Perlindungan file merupakan bagian dari lapisan filesystem, sehingga tidak berlaku jika Anda menonaktifkan isolasi filesystem; perlindungan environment variable tetap berlaku.

Contoh di bawah ini memblokir pembacaan file kredensial AWS dan direktori SSH serta menghapus GITHUB_TOKEN dan NPM_TOKEN dari environment perintah sandbox:

{
  "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" }
      ]
    }
  }
}

Entri environment variable dan entri file juga menerima "mode": "mask", yang dijelaskan di Melakukan mask kredensial.

Path file mengikuti aturan prefiks yang sama dengan pengaturan sandbox.filesystem.*.

Claude Code menggabungkan entri deny dari setiap cakupan pengaturan yang dimuat sesi. Entri deny hanya pernah mempersempit akses, sehingga cakupan mana pun dapat menambahkannya, tetapi tidak ada cakupan yang dapat menghapus entri yang ditambahkan oleh cakupan lain.

Ketika Anda mengecualikan sumber pengaturan:

  • Pengaturan proyek atau lokal: Claude Code tidak menerapkan satu pun entri credentials dari sumber tersebut. Memerlukan Claude Code v2.1.246 atau lebih baru.
  • Pengaturan pengguna: Claude Code tetap menerapkan entri deny di ~/.claude/settings.json dan mempertahankan entri mask file sebagai pembatasan yang tidak lagi memberi wewenang kepada proxy untuk mensubstitusi nilai sebenarnya, tetapi membuang entri mask environment variable.

Tidak ada daftar deny kredensial bawaan, sehingga hanya file dan variabel yang Anda cantumkan yang dibatasi.

sandbox.credentials hanya memengaruhi perintah Bash sandbox. Untuk menghapus kredensial dari semua subproses terlepas dari sandboxing, atur CLAUDE_CODE_SUBPROCESS_ENV_SCRUB.

Melakukan mask kredensial

Ketika Anda melakukan mask pada kredensial, Claude Code menampilkan placeholder per sesi yang disebut sentinel kepada perintah sandbox, dan proxy sandbox mensubstitusi nilai sebenarnya pada permintaan keluar ke host yang Anda izinkan. Entri deny di Melindungi kredensial justru memblokir kredensial. Untuk file di macOS, Claude Code memblokir file tersebut alih-alih melakukan mask.

Melakukan mask environment variable memerlukan Claude Code v2.1.199 atau lebih baru. Referensi sandbox.credentials mencantumkan setiap field.

Masking memerlukan hal berikut:

  • Terminasi TLS: proxy mensubstitusi nilai sebenarnya di dalam isi permintaan, sehingga proxy harus dapat melihatnya. Atur network.tlsTerminate agar proxy menghentikan TLS sendiri. Tanpanya, masking gagal tanpa mengekspos apa pun: perintah tetap hanya melihat sentinel, tetapi sentinel mencapai server tanpa perubahan dan autentikasi gagal. Claude Code melaporkan kesalahan konfigurasi ini saat startup.
  • Tujuan yang diizinkan: setiap entri mask dapat mencantumkan injectHosts, yaitu host yang diizinkan untuk dijangkau oleh nilai sebenarnya. Proxy hanya menyuntikkan pada koneksi yang diterima oleh allowlist domain, sehingga setiap host injectHosts juga harus dapat dijangkau melalui network.allowedDomains. Untuk entri mask tanpa injectHosts, proxy mensubstitusi nilai sebenarnya pada permintaan ke setiap host di network.allowedDomains.
  • Cakupan pengaturan tepercaya: masking memberi wewenang kepada proxy untuk mengirimkan kredensial sebenarnya Anda ke suatu tempat, sehingga Claude Code hanya menghormati entri mask, network.tlsTerminate, credentials.allowPlaintextInject, awsPairs, dan sigv4 dari pengaturan pengguna, pengaturan terkelola, dan flag --settings. Claude Code mengabaikannya di .claude/settings.json atau .claude/settings.local.json milik repositori. Ketika administrator Anda mengirimkan entri mask, network.tlsTerminate, atau credentials.allowPlaintextInject melalui pengaturan yang dikelola server, entri tersebut dihitung sebagai pengaturan yang memerlukan persetujuan.

Melakukan mask environment variable

Untuk melakukan mask pada environment variable, atur "mode": "mask" pada entri credentials.envVars-nya. Perintah tersebut dan apa pun yang dicatatnya ke log tidak pernah memegang kredensial sebenarnya, tetapi permintaannya tetap terautentikasi. Ketika variabel yang sama dicantumkan dengan deny di cakupan mana pun, deny diutamakan.

Contoh ini melakukan mask pada dua token. GH_TOKEN disubstitusi hanya pada permintaan ke api.github.com, sedangkan NPM_TOKEN tidak memiliki injectHosts dan disubstitusi pada permintaan ke setiap host di network.allowedDomains:

{
  "sandbox": {
    "enabled": true,
    "network": {
      "tlsTerminate": {},
      "allowedDomains": ["*.github.com", "registry.npmjs.org"]
    },
    "credentials": {
      "envVars": [
        { "name": "GH_TOKEN", "mode": "mask", "injectHosts": ["api.github.com"] },
        { "name": "NPM_TOKEN", "mode": "mask" }
      ]
    }
  }
}

Masking mengganti seluruh nilai secara default. Untuk nilai yang memiliki struktur, seperti string koneksi DATABASE_URL atau JWT, gunakan field extract, decode, maskClaims, dan onExtractNoMatch agar tool yang mem-parse nilai tersebut tetap berfungsi.

Untuk tujuan IPv6, tuliskan alamat secara berbeda di kedua daftar:

  • network.allowedDomains: bentuk dalam kurung siku, seperti "[::1]"
  • injectHosts: alamat polos dalam bentuk terkompresi kanonisnya, seperti "::1"

Proxy mencocokkan setiap entri injectHosts dengan alamat tujuan polos koneksi, dengan mengabaikan port, sehingga penulisan dengan kurung siku, zone-ID, atau kompresi yang berbeda tidak pernah cocok. claude doctor menandai entri yang tidak akan pernah cocok dengan peringatan Sandbox credential injectHosts entries can never match their destination. Pemeriksaan ini memerlukan Claude Code v2.1.229 atau lebih baru.

Menandatangani ulang permintaan AWS

Permintaan AWS membawa tanda tangan SigV4 atas isi permintaan, jadi lakukan mask pada AWS_ACCESS_KEY_ID dan AWS_SECRET_ACCESS_KEY secara bersamaan. Proxy mendeteksi permintaan SigV4 melalui sentinel access key dan menandatangani ulang permintaan dengan nilai sebenarnya, yang memerlukan Claude Code v2.1.221 atau lebih baru. Jika Anda hanya melakukan mask pada secret, permintaan ditandatangani dengan placeholder yang tidak dapat dideteksi oleh proxy, sehingga permintaan tersebut gagal di AWS.

Claude Code secara otomatis menautkan variabel konvensional AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, dan AWS_SESSION_TOKEN menjadi satu kredensial ketika Anda melakukan mask pada seluruh nilainya. Jika kredensial AWS Anda berada di variabel dengan nama lain, kelompokkan dengan credentials.awsPairs, yang memerlukan Claude Code v2.1.224 atau lebih baru.

Unggahan streaming, URL presigned, dan permintaan SigV4A membawa tanda tangan yang tidak dapat dihitung ulang oleh proxy. Ketika salah satu permintaan ini ditandatangani dengan placeholder dari pasangan yang di-mask, proxy menggagalkannya alih-alih meneruskan tanda tangan yang rusak. Permintaan yang ditandatangani dengan kredensial yang tidak di-mask tidak terpengaruh. Gunakan credentials.sigv4, yang memerlukan Claude Code v2.1.224 atau lebih baru, untuk meneruskan salah satu bentuk permintaan ini sebagai gantinya. AWS tetap menolak permintaan tersebut, sehingga tool pemanggil menerima respons penolakan dari AWS sendiri alih-alih error proxy.

Melakukan mask file kredensial

Untuk melakukan mask pada file kredensial, atur "mode": "mask" pada entri credentials.files-nya. Melakukan mask file memerlukan Claude Code v2.1.221 atau lebih baru. Apa yang dilihat perintah sandbox bergantung pada platform:

  • Linux dan WSL2: perintah sandbox membaca salinan sentinel dari file, dan proxy mensubstitusi nilai sebenarnya pada permintaan keluar.
  • macOS: perintah sandbox sama sekali tidak dapat membaca file tersebut. Claude Code tidak membuat salinan sentinel, sehingga tool yang melakukan autentikasi dengan file tersebut tidak berfungsi di dalam sandbox, efek yang sama dengan deny. Blokir baca tetap berlaku bahkan ketika Anda menonaktifkan isolasi filesystem.

Contoh ini melakukan mask pada token GitHub yang disimpan di ~/.config/gh/hosts.yml. Pola extract menandai bagian mana dari file yang merupakan rahasia, sehingga di Linux dan WSL2 gh tetap dapat mem-parse bagian lain dari konfigurasinya:

{
  "sandbox": {
    "enabled": true,
    "network": {
      "tlsTerminate": {},
      "allowedDomains": ["*.github.com"]
    },
    "credentials": {
      "files": [
        {
          "path": "~/.config/gh/hosts.yml",
          "mode": "mask",
          "extract": "oauth_token:\\s*(\\S+)",
          "injectHosts": ["api.github.com"]
        }
      ]
    }
  }
}

Untuk memastikan mask aktif, minta Claude menjalankan cat ~/.config/gh/hosts.yml dalam perintah sandbox. Di Linux dan WSL2 output menampilkan sentinel sebagai pengganti token, dan di macOS pembacaan gagal.

Tanpa extract atau decode, Claude Code mengganti seluruh file dengan satu sentinel, yang cocok untuk file yang berisi satu rahasia polos. Gunakan field extract, decode, maskClaims, onExtractNoMatch, dan maskDuplicates untuk mengontrol masking parsial dan apa yang terjadi ketika pola tidak cocok dengan apa pun.

mask berlaku untuk satu file, jadi cantumkan setiap file kredensial secara individual. Claude Code melakukan fallback ke deny untuk entri mask yang tidak dapat di-mask dengan aman: path direktori, pola glob, file yang lebih besar dari 8 MiB, atau file yang bukan teks UTF-8.

Cara kerja sandboxing

Isolasi sistem file

Tool Bash yang di-sandbox membatasi akses sistem file ke direktori tertentu:

  • Perilaku tulis default: akses baca dan tulis ke direktori kerja saat ini dan subdirektorinya, direktori apa pun yang telah Anda tambahkan dengan --add-dir, /add-dir, atau permissions.additionalDirectories, ditambah direktori temp per pengguna yang ditunjuk oleh $TMPDIR
  • Perilaku baca default: akses baca ke seluruh komputer, kecuali direktori tertentu yang ditolak. Default ini tetap mengizinkan pembacaan file kredensial, jadi lindungi kredensial yang tidak ingin Anda biarkan dibaca oleh perintah.
  • Pemblokiran baca: dengan permissions.blockReadsOutsideWorkingDirectories diaktifkan, perintah yang di-sandbox juga kehilangan akses baca ke direktori home Anda dan direktori lain yang menyimpan file pengguna, kecuali jalur yang dicantumkan dalam Perintah yang di-sandbox di bawah pemblokiran. Bagian tersebut juga menjelaskan kapan bagian pemblokiran ini tidak berlaku.
  • Git worktree: ketika direktori kerja adalah git worktree yang ditautkan, sandbox juga mengizinkan penulisan ke direktori .git bersama milik repositori utama sehingga perintah seperti git commit dapat memperbarui ref dan index. Penulisan ke hooks/ dan config di dalam direktori tersebut tetap ditolak.

Untuk melewati isolasi sistem file sepenuhnya sambil tetap mempertahankan isolasi jaringan, atur sandbox.filesystem.disabled.

Jalur yang dilindungi

Di dalam direktori yang dapat ditulisi oleh perintah yang di-sandbox, sandbox tetap menolak penulisan ke file tempat Claude Code memuat konfigurasi dan kode. Perintah yang dapat mengedit file tersebut dapat memberikan izin kepada dirinya sendiri, atau menambahkan hook atau server MCP yang dijalankan Claude Code di luar sandbox. Sistem izin memiliki jalur yang dilindungi tersendiri, yang mengontrol apa yang disetujui Claude Code sebelum sebuah tool berjalan; daftar milik sandbox berlaku untuk perintah yang sudah berjalan. Daftar ini mencakup empat kelompok jalur:

  • Di direktori kerja Anda dan direktori di atasnya: file pengaturan .claude, direktori .claude/skills, .claude/agents, .claude/commands, dan .claude/hooks, .mcp.json, serta file yang dijalankan Claude Code dengan sendirinya, seperti .claude/workflows dan .claude/scheduled_tasks.json
  • Hanya di direktori kerja Anda: file startup shell seperti .bashrc dan .zshrc, .gitconfig, direktori .vscode dan .idea, serta hooks dan config di dalam .git
  • File yang akan mengubah direktori kerja Anda menjadi repositori git bare: HEAD, objects, dan refs di tingkat teratas, ditambah entri config dan hooks yang sudah ada di sana ketika terdapat HEAD di sampingnya. File bernama config ditolak bahkan tanpa HEAD. Di Linux dan WSL2, sandbox menghapus file HEAD atau direktori objects atau refs di tingkat teratas yang muncul saat perintah yang di-sandbox sedang berjalan
  • Di ~/.claude, atau direktori yang ditunjuk oleh CLAUDE_CONFIG_DIR: sebagian besar isinya, ditambah ~/.claude.json dan penyimpanan kredensial .credentials.json

Jika sebuah symlink muncul di jalur file pengaturan yang dilindungi selama sesi, sandbox juga menolak penulisan ke file yang ditunjuknya, dimulai dari perintah berikutnya.

Tidak ada cara untuk mengecualikan salah satu jalur ini: entri allowWrite atau aturan izin Edit yang mencakup jalur tersebut tidak mencabut perlindungannya. Satu-satunya cara untuk mematikan perlindungan adalah filesystem.disabled, yang mematikan isolasi sistem file untuk setiap jalur. Untuk melihat sebagian besar jalur ini sebagaimana diterapkan di mesin Anda, jalankan /sandbox dan buka tab Config, yang mencantumkannya di bawah Denied within allowed, bercampur dengan entri denyWrite Anda sendiri.

Jika git merge atau git checkout gagal dengan unable to unlink old pada salah satu jalur ini, lihat Perintah git gagal dengan unable to unlink old.

Isolasi jaringan

Perintah yang di-sandbox tidak memiliki rute langsung ke jaringan:

  • Linux dan WSL2: perintah berjalan di network namespace terpisah yang tidak memiliki koneksi ke jaringan Anda
  • macOS: framework sandbox Seatbelt secara default memblokir koneksi selain koneksi ke proxy sandbox

Claude Code menjalankan proxy sandbox di mesin Anda, di luar sandbox, dan mengarahkan perintah ke proxy tersebut dengan HTTP_PROXY, HTTPS_PROXY, ALL_PROXY, dan environment variable terkait. Proxy memeriksa hostname setiap koneksi terhadap domain yang diizinkan dan ditolak milik Anda.

Apa yang dapat dijangkau oleh sebuah tool bergantung pada apakah tool tersebut menggunakan proxy:

  • Tool yang membaca variabel proxy: curl, npm, git melalui HTTPS, dan tool serupa dapat terhubung setelah host-nya diizinkan. Entri allowedDomains tanpa port mengizinkan setiap port pada host tersebut
  • Tool yang mengabaikan variabel proxy: ssh biasa, sebagian besar driver database, dan tool serupa tidak dapat terhubung, bahkan ke host yang diizinkan. Lihat Klien database atau tool non-HTTP lainnya gagal menjangkau host yang diizinkan
  • Apa pun yang bukan TCP: UDP, HTTP/3 melalui QUIC, dan tool ICMP seperti ping tidak dapat keluar dari sandbox

Pengaturan dan perilaku berikut mengontrol host mana yang diizinkan oleh proxy:

  • Pembatasan domain: domain yang diizinkan milik Anda awalnya kosong. Host di luar domain yang diizinkan menjelaskan apa yang terjadi saat pertama kali sebuah perintah memerlukan domain baru.
  • Pilihan persetujuan: jika Anda memilih Yes saat diminta, Claude Code mengizinkan host tersebut selama sisa sesi saat ini. Jika Anda memilih "Yes, and don't ask again", Claude Code menyimpan aturan izin WebFetch(domain:...) ke pengaturan lokal Anda, sehingga host tetap diizinkan di sesi mendatang. Selama sandbox bersifat wajib oleh admin, Claude Code menyimpan aturan tersebut ke pengaturan pengguna Anda, yang berlaku di setiap proyek.
  • Domain yang diizinkan sebelumnya: izinkan domain terlebih dahulu dengan allowedDomains untuk menghindari permintaan persetujuan sepenuhnya. Claude Code juga mengizinkan terlebih dahulu domain dari aturan izin WebFetch(domain:...), seperti yang dijelaskan dalam Aturan izin.
  • Allowlist ketat: jika Anda mengatur strictAllowlist ke true di pengaturan pengguna, pengaturan terkelola, atau pengaturan CLI --settings, Claude Code menolak akses perintah yang di-sandbox ke host apa pun di luar allowlist alih-alih meminta persetujuan. Allowlist terdiri dari allowedDomains ditambah domain dari aturan izin WebFetch(domain:...), atau hanya entri pengaturan terkelola ketika allowManagedDomainsOnly diatur. Penguncian yang berlaku tanpa sandbox wajib oleh admin menjelaskan entri milik repositori. Claude Code hanya menerapkan ini untuk perintah yang di-sandbox; tool dalam proses seperti WebFetch tetap mengikuti aturan izin masing-masing. Mengaturnya di .claude/settings.json atau .claude/settings.local.json milik repositori tidak berpengaruh. Memerlukan Claude Code v2.1.219 atau yang lebih baru.
  • Penguncian terkelola: jika allowManagedDomainsOnly diatur di pengaturan terkelola, domain yang tidak diizinkan diblokir secara otomatis alih-alih meminta persetujuan, dan hanya aturan izin allowedDomains dan WebFetch(domain:...) dari pengaturan terkelola yang dipatuhi.
  • Proxy perusahaan: ketika jaringan Anda mengharuskan lalu lintas keluar melewati proxy perusahaan, atur HTTPS_PROXY, HTTP_PROXY, dan NO_PROXY seperti yang dijelaskan dalam konfigurasi proxy, di blok env pengaturan Anda agar agent latar belakang juga mendapatkannya, atau di environment tempat Anda meluncurkan Claude Code. Claude Code menerapkan allowlist domain lalu meneruskan koneksi yang diizinkan melalui proxy upstream tersebut. URL proxy http:// dan https:// dapat digunakan, dengan autentikasi basic di URL jika Anda memerlukannya.

Dalam aturan WebFetch(domain:...), sandbox mematuhi dua bentuk wildcard: *. di awal, seperti *.example.com, dan * tunggal. Bentuk * tunggal memerlukan Claude Code v2.1.186 atau yang lebih baru. Wildcard di posisi lain, seperti WebFetch(domain:example.*), tetap cocok dengan pengambilan tetapi tidak berpengaruh pada perintah yang di-sandbox.

Host di luar domain yang diizinkan

Ketika perintah yang di-sandbox terhubung ke host yang tidak ada dalam domain yang diizinkan milik Anda, perintah tetap berada di sandbox dan menunggu keputusan. Dalam sesi terminal interaktif, keputusan bergantung pada mode izin Anda:

Mode izin Apa yang terjadi pada koneksi
Mode bypassPermissions, dan plan mode dengan bypass permissions tersedia Diizinkan tanpa permintaan persetujuan
Mode manual, mode acceptEdits, dan plan mode dalam kondisi lainnya Anda mendapatkan permintaan persetujuan
Auto mode Ditolak kecuali perintah tersebut mencantumkan host dan pengklasifikasi menyetujui daftarnya
Mode dontAsk Ditolak

Dengan strictAllowlist atau allowManagedDomainsOnly diaktifkan, proxy sandbox bawaan menolak koneksi di setiap mode izin. Dalam mode bypassPermissions, host di luar domain yang diizinkan milik Anda diizinkan kecuali salah satu pengaturan tersebut diaktifkan. Jalan keluar retry tanpa sandbox menjelaskan kapan sebuah perintah dapat keluar dari sandbox dalam mode tersebut. Koneksi ke host di deniedDomains juga ditolak di setiap mode izin.

Hostname yang di-resolve ke alamat lokal

Setelah sebuah hostname lolos allowlist, proxy sandbox me-resolve-nya dan menolak koneksi ketika nama tersebut hanya di-resolve ke alamat lokal. Alamat lokal mencakup alamat loopback seperti 127.0.0.1, alamat link-local seperti endpoint metadata cloud 169.254.169.254, dan alamat yang ditetapkan ke mesin Anda sendiri. Nama localhost dan *.localhost diizinkan untuk di-resolve ke loopback.

Hostname intranet yang diizinkan yang di-resolve ke rentang privat seperti 10.0.0.0/8 dapat terhubung. Untuk membiarkan sebuah nama di-resolve ke alamat yang ditolak, tambahkan alamat IP tersebut ke allowedDomains, seperti "127.0.0.1:8080".

Pemeriksaan ini berlaku untuk hostname. Domain yang diizinkan dan mode izin Anda menentukan koneksi ke alamat IP. Proxy juga melewati pemeriksaan untuk koneksi yang dikirimkannya melalui proxy perusahaan upstream, karena proxy tersebut yang me-resolve nama.

Domain yang diizinkan per perintah dalam auto mode

Dalam auto mode dengan sandboxing aktif, Claude menyebutkan host yang diperlukan sebuah perintah pada perintah itu sendiri alih-alih memicu persetujuan jaringan untuk setiap koneksi. Setiap perintah Bash, PowerShell, atau Monitor yang berjalan di sandbox dapat membawa daftar host di luar allowlist sandbox: domain seperti registry.npmjs.org, wildcard seperti *.pythonhosted.org, atau alamat IP, masing-masing dengan :port opsional. Pengklasifikasi meninjau host tersebut bersama dengan perintahnya. Memerlukan Claude Code v2.1.271 atau yang lebih baru.

Daftar yang disetujui membuka host tersebut hanya untuk satu perintah itu, selama perintah tersebut berjalan. Tidak ada yang ditambahkan ke host yang diizinkan dalam sesi Anda atau ke pengaturan Anda; perintah berikutnya menyebutkan host-nya sendiri.

Perintah yang membawa host dikirim ke pengklasifikasi alih-alih disetujui oleh aturan izin atau mode auto-allow milik sandbox. Jika sebuah aturan ask memaksa permintaan persetujuan untuk perintah tersebut, dialog izin di terminal Anda mencantumkan host di sampingnya, dan menyetujui di sana mencakup keduanya.

Daftar per perintah hanya memperluas apa yang ditolak sandbox secara default. Entri deniedDomains tetap memblokir. Ketika strictAllowlist atau allowManagedDomainsOnly mengunci allowlist, Claude Code menolak daftar per perintah.

Selama daftar per perintah berlaku, Claude Code menolak koneksi ke host yang tidak dicantumkan oleh perintah mana pun yang disetujui, tanpa permintaan persetujuan atau pemeriksaan pengklasifikasi. Penolakan tersebut menyebutkan host dalam hasil perintah, dan Claude menjalankan ulang perintah dengan host tersebut ditambahkan.

Alamat IPv6 dalam daftar domain

Untuk mencocokkan alamat IPv6 di allowedDomains, deniedDomains, atau aturan WebFetch(domain:...), tulis alamat tersebut dalam kurung siku: "[::1]" cocok dengan alamat tersebut di setiap port, dan "[::1]:443" hanya cocok dengannya di port 443. Bentuk berkurung siku memerlukan Claude Code v2.1.229 atau yang lebih baru.

Entri tanpa kurung siku seperti ::1:443 bersifat ambigu antara sebuah alamat dan alamat yang diikuti port:

  • Daftar penolakan: Claude Code menolak setiap pembacaan yang dapat di-parse dari entri tersebut, sehingga pembacaan mana pun yang Anda maksud akan diblokir. Untuk entri tanpa pembacaan yang dapat di-parse, Claude Code tidak memblokir apa pun
  • Daftar izin: Claude Code tidak pernah mengizinkan lebih dari yang Anda tulis. Claude Code menulis ulang entri ambigu ke pembacaan host-dan-port ketika pembacaan tersebut dapat di-parse dengan bersih, dan dapat membuang entri tersebut sepenuhnya alih-alih memperluas allowlist

Untuk menemukan entri yang ambigu, jalankan claude doctor di terminal Anda dan cari peringatan Sandbox network domain entries have unreliable spellings. Tulis ulang setiap entri yang ambigu dalam bentuk berkurung siku.

Penerapan tingkat OS

Tool Bash yang di-sandbox menggunakan primitif keamanan sistem operasi:

  • macOS: menggunakan Seatbelt untuk penerapan sandbox
  • Linux: menggunakan bubblewrap untuk isolasi
  • WSL2: menggunakan bubblewrap, sama seperti Linux

Anda juga dapat menjalankan paket @anthropic-ai/sandbox-runtime secara mandiri untuk membungkus proses Claude Code. Lihat Sandbox runtime.

Bagaimana sandboxing berhubungan dengan izin dan mode izin

Sandboxing, permission rules, dan permission modes adalah lapisan komplementer. Bagian di bawah mencakup bagaimana sandbox berinteraksi dengan masing-masing.

Aturan izin

Aturan izin dan sandboxing mengontrol hal yang berbeda:

  • Aturan izin mengontrol alat mana yang dapat digunakan Claude Code dan dievaluasi sebelum alat apa pun berjalan. Mereka berlaku untuk semua alat: Bash, Read, Edit, WebFetch, MCP, dan lainnya, kecuali bahwa aturan deny atau ask tidak dapat memblokir EndConversation sementara alat lain tetap ada.
  • Sandboxing menyediakan penegakan tingkat OS yang membatasi apa yang dapat diakses perintah Bash pada tingkat filesystem dan jaringan. Ini hanya berlaku untuk perintah Bash, PowerShell, dan Monitor serta proses anak mereka.

Kedua lapisan juga berbeda dalam cara penegakan mereka. Claude Code mengevaluasi keputusan izin sebelum perintah berjalan, berdasarkan string perintah dan, dalam mode auto, penilaian classifier terpisah tentang apakah perintah aman. Sistem operasi memberlakukan batas sandbox pada proses yang berjalan, sehingga berlaku terlepas dari apa yang dipilih model untuk dijalankan dan bahkan jika perintah yang diizinkan melakukan lebih dari nama yang disarankan.

Pembatasan filesystem dan jaringan dikonfigurasi melalui pengaturan sandbox dan aturan izin:

Pengaturan atau aturan Apa yang dilakukannya
sandbox.filesystem.allowWrite Memberikan akses tulis subprocess ke jalur di luar direktori kerja
sandbox.filesystem.denyWrite dan sandbox.filesystem.denyRead Memblokir akses subprocess ke jalur tertentu
sandbox.filesystem.allowRead Mengizinkan kembali pembacaan jalur tertentu dalam wilayah denyRead
sandbox.filesystem.disabled Mematikan lapisan filesystem sepenuhnya sambil mempertahankan isolasi jaringan
Aturan izin Edit Memberikan akses tulis ke jalur tertentu, dengan cara yang sama seperti sandbox.filesystem.allowWrite
Aturan tolak Read dan Edit Memblokir akses ke file atau direktori tertentu
Aturan izin dan tolak WebFetch(domain:...) Mengontrol akses domain
Sandbox allowedDomains Mengontrol domain mana yang dapat dijangkau perintah Bash
Sandbox deniedDomains Memblokir domain tertentu bahkan ketika wildcard allowedDomains yang lebih luas akan sebaliknya mengizinkannya

Jalur dan domain dari pengaturan sandbox dan aturan izin digabungkan bersama ke dalam konfigurasi sandbox akhir.

Direktori contoh repositori claude-code mencakup konfigurasi pengaturan pemula untuk skenario penyebaran umum, termasuk contoh khusus sandbox. Gunakan ini sebagai titik awal dan sesuaikan dengan kebutuhan Anda.

Mode izin

/sandbox bukan permission mode. Mode izin memutuskan apakah panggilan alat berjalan dan apakah Anda diminta terlebih dahulu, sementara sandbox membatasi apa yang dapat diakses perintah Bash setelah berjalan. Mereka berbeda dalam apa yang mereka kontrol dan apa yang menggantikan prompt per-aksi:

Apa yang dikontrol Apa yang menggantikan prompt
/sandbox Apa yang dapat diakses perintah Bash setelah berjalan Batas sandbox itu sendiri, dalam mode auto-allow
Auto mode Apakah setiap panggilan alat berjalan Classifier yang meninjau tindakan
--dangerously-skip-permissions Apakah setiap panggilan alat berjalan Tidak ada. Pemeriksaan Protected path juga dilewati; tindakan yang tidak ada mode auto-approve masih berlaku

Mode auto-allow sandbox terpisah dari auto mode: auto-allow menyetujui perintah Bash karena batas sandbox memuatnya, sementara auto mode menggunakan classifier untuk meninjau tindakan. Keduanya bekerja secara independen dan dapat dikombinasikan, dengan pengecualian yang tercantum di bawah Sandbox modes. Untuk memilih batas isolasi untuk run tanpa pengawasan, lihat Sandbox environments. Untuk tabel pasangan mode izin dan sandbox umum dengan flag yang memulai masing-masing, lihat Common setups.

Konfigurasi sandbox untuk organisasi Anda

Administrator dapat memerlukan sandboxing untuk setiap pengguna, mencegah pengembang memperluas kebijakan, dan merutekan lalu lintas sandbox melalui proxy perusahaan.

Memberlakukan sandboxing dengan pengaturan terkelola

Untuk memerlukan sandbox untuk setiap pengembang, berikan kunci sandbox melalui managed settings, baik sebagai file yang dikelola oleh MDM Anda atau melalui server-managed settings di claude.ai.

Konfigurasi pengaturan terkelola berikut mengaktifkan sandbox, menolak untuk memulai Claude Code ketika platform tidak didukung atau ada dependensi yang hilang, dan mencegah model mencoba ulang perintah di luar sandbox:

{
  "sandbox": {
    "enabled": true,
    "failIfUnavailable": true,
    "allowUnsandboxedCommands": false
  }
}

Dua kunci di luar enabled mengontrol apa yang terjadi ketika sandbox tidak dapat menjalankan perintah:

  • failIfUnavailable: dependensi yang hilang seperti bubblewrap di Linux memblokir Claude Code dari memulai alih-alih kembali ke eksekusi unsandboxed
  • allowUnsandboxedCommands: false: Claude Code mengabaikan escape hatch dangerouslyDisableSandbox, sehingga ketika perintah gagal di bawah sandbox, Claude tidak dapat mencoba ulangnya tanpa sandbox

Pertimbangkan penambahan berikut bersama keduanya:

Konfigurasi ini melakukan sandboxing pada perintah yang dijalankan Claude. Pengembang masih dapat mengetik perintah di prompt shell-mode ! dan menjalankannya di luar sandbox, dengan akses yang sama yang mereka miliki di terminal apa pun di luar Claude Code. Lihat mode sandbox ketat untuk sesi di mana perintah yang diketik dijalankan dengan sandbox.

Sandbox tidak berjalan di Windows asli, sehingga dengan failIfUnavailable diatur, Claude Code keluar saat startup di mesin tersebut. Jika armada Anda mencakup host Windows, Anda dapat:

  • Memberikan konfigurasi berdasarkan sistem operasi: terapkan melalui MDM Anda atau sebagai file pengaturan terkelola hanya di mesin macOS dan Linux. Server-managed settings berlaku untuk semua pengguna di organisasi
  • Memindahkan pengguna Windows ke lingkungan yang didukung: minta mereka menjalankan Claude Code di dalam WSL2 atau container

Cegah pengembang memperluas kebijakan

Ketika pengaturan terkelola menetapkan kunci Boolean seperti enabled atau failIfUnavailable, Claude Code menggunakan nilai terkelola dan mengabaikan apa pun yang ditetapkan pengembang secara lokal. Untuk kunci array seperti allowRead, Claude Code menggabungkan entri dari cakupan yang dimuat sesi, sehingga pengembang dapat menambahkan entri yang memperluas kebijakan kecuali ada kunci pengunci yang mencakup kunci tersebut.

Kecuali pengaturan terkelola menetapkannya, pengaturan pengguna milik pengembang atau --settings dapat mengaktifkan kunci berikut. .claude/settings.json milik repositori juga dapat melakukannya, kecuali sandbox bersifat diwajibkan admin. Masing-masing melemahkan sandbox, jadi atur ke false dalam pengaturan terkelola jika Anda tidak ingin kunci tersebut digunakan:

Atur allowManagedReadPathsOnly ke true dalam pengaturan terkelola sehingga hanya entri allowRead dari pengaturan terkelola yang dihormati. Ini mencegah pengembang memperluas akses baca di luar jalur yang disetujui organisasi.

Untuk mengunci domain jaringan ke nilai terkelola dengan cara yang sama, atur allowManagedDomainsOnly. Dengan penguncian ini aktif, hanya pengaturan terkelola yang dapat menetapkan port proxy.

Ketika pengaturan terkelola mengonfigurasi sandbox.filesystem atau mencantumkan entri sandbox.credentials.files apa pun dengan "mode": "deny", hanya pengaturan terkelola yang dapat mengatur filesystem.disabled, sehingga pengembang tidak dapat mematikan pembatasan filesystem yang diterapkan administrator. Entri mask yang valid tidak mengunci kunci tersebut. Lihat Which settings can disable it.

Pengaturan repositori di bawah sandbox yang diwajibkan admin

Sandbox bersifat diwajibkan admin selama salah satu pengaturan berikut berlaku:

Pengaturan ini tidak mengaktifkan sandbox, jadi atur juga enabled.

Selama sandbox diwajibkan admin, Claude Code mengambil pengaturan yang melonggarkannya hanya dari pengaturan terkelola, flag --settings, dan ~/.claude/settings.json milik setiap pengembang. Claude Code mengabaikan pengaturan berikut di .claude/settings.json dan .claude/settings.local.json milik repositori:

Pengaturan repositori Apa yang diabaikan Claude Code
excludedCommands, ignoreViolations, network.allowedDomains, network.allowUnixSockets, network.allowMachLookup, network.httpProxyPort, network.socksProxyPort Setiap entri
filesystem.allowWrite, aturan izinkan Edit(...), permissions.additionalDirectories Akses tulis yang diberikan setiap entri kepada perintah yang di-sandbox. Tool file Claude tetap mengikuti aturan Edit(...) dan direktori tambahan
Aturan izinkan WebFetch(domain:...) Host yang ditambahkan setiap aturan ke allowlist sandbox. Tool WebFetch tetap mengikuti aturan tersebut
enableWeakerNestedSandbox, enableWeakerNetworkIsolation, network.allowAllUnixSockets, network.allowLocalBinding true. Nilai false tetap berlaku
enabled, failIfUnavailable false, ketika ~/.claude/settings.json milik pengembang menetapkan true
filesystem.allowRead Entri pada atau di bawah jalur yang dilarang untuk dibaca oleh pengaturan terkelola, --settings, atau pengaturan pengguna, atau glob yang dapat mencocokkan salah satunya

Pengaturan berikut tetap berlaku selama sandbox diwajibkan admin:

  • Di file repositori: entri deny dan nilai autoAllowBashIfSandboxed. Atur kunci tersebut dalam pengaturan terkelola untuk mencegah repositori mengubahnya
  • Di pengaturan milik pengembang sendiri: pengaturan dalam tabel tetap berlaku dari ~/.claude/settings.json atau --settings, kecuali penguncian khusus terkelola seperti allowManagedDomainsOnly mencakupnya. Sebagian besar di antaranya, seperti excludedCommands dan filesystem.allowWrite, tidak memiliki penguncian khusus terkelola

Konfigurasi di bawah Memberlakukan sandboxing dengan pengaturan terkelola membuat sandbox diwajibkan admin. Tambahkan entri excludedCommands, allowWrite, dan socket yang dibutuhkan alat yang Anda setujui ke pengaturan terkelola, karena repositori tidak dapat menyediakannya.

Memerlukan Claude Code v2.1.285 atau lebih baru. Dari v2.1.282 hingga v2.1.284, pengaturan yang sama membuat Claude Code mengabaikan entri excludedCommands milik repositori.

Penguncian yang berlaku tanpa sandbox yang diwajibkan admin

Beberapa pengaturan membuat Claude Code mengabaikan kunci repositori yang secara langsung menimpa satu pembatasan, bahkan ketika sandbox tidak diwajibkan admin. Masing-masing memiliki efek ini hanya ketika Anda mengaturnya di file yang disebutkan dalam barisnya, dan pengaturan sandbox lain milik repositori tetap berlaku. Memerlukan Claude Code v2.1.285 atau lebih baru.

Pengaturan Tempat Anda mengaturnya Apa yang diabaikan Claude Code dalam pengaturan repositori
network.deniedDomains atau aturan deny WebFetch(domain:...) Pengaturan terkelola, --settings httpProxyPort dan socksProxyPort
network.strictAllowlist Pengaturan terkelola, --settings, pengaturan pengguna Port proxy, allowedDomains, dan aturan izinkan WebFetch(domain:...)
filesystem.denyRead, aturan deny Read(...), atau entri credentials.files Pengaturan terkelola, --settings Entri allowRead, allowWrite, izinkan Edit(...), atau additionalDirectories pada atau di bawah jalur yang dilarang untuk dibaca oleh pengaturan terkelola, --settings, atau pengaturan pengguna, atau glob yang dapat mencocokkan salah satunya

Penguncian ini mengubah apa yang dapat dijangkau oleh perintah yang di-sandbox. Tool WebFetch dan tool file Claude tetap mengikuti aturan dan direktori tambahan milik repositori.

Konfigurasi proxy khusus

Untuk memeriksa, memfilter, atau mencatat lalu lintas sandbox dengan alat Anda sendiri, ganti proxy sandbox bawaan dengan proxy yang Anda jalankan di mesin yang sama.

Untuk merutekan lalu lintas sandbox melalui proxy perusahaan di tempat lain dalam jaringan Anda, atur HTTPS_PROXY sebagai gantinya, seperti yang dijelaskan entri Corporate proxy di bawah Network isolation. Dengan cara itu, allowlist Claude Code tetap berlaku.

Untuk mengarahkan perintah yang di-sandbox ke proxy Anda, atur port localhost yang didengarkannya dalam sandbox settings:

{
  "sandbox": {
    "network": {
      "httpProxyPort": 8080,
      "socksProxyPort": 8081
    }
  }
}

Jika Anda mengatur port dan juga mengatur HTTPS_PROXY atau HTTP_PROXY, Claude Code tidak meneruskan apa yang dikirim perintah yang di-sandbox ke proxy Anda kepada proxy yang disebutkan oleh variabel tersebut. Untuk menjangkau proxy perusahaan, konfigurasikan proxy Anda sendiri agar meneruskan ke sana.

File mana yang dapat mengatur port bergantung pada pengaturan sandbox Anda yang lain:

Claude Code mengabaikan port yang diatur di tempat lain. Sebelum v2.1.285, file pengaturan apa pun dapat mengatur port.

Pemecahan masalah

Beberapa perintah gagal di dalam sandbox meskipun bekerja di luar itu. Temukan judul yang sesuai dengan gejala atau pesan kesalahan Anda.

Jika sandbox organisasi Anda bersifat wajib oleh admin, Claude Code mengabaikan pengaturan yang disebutkan oleh perbaikan ini di file pengaturan proyek, jadi simpan pengaturan tersebut di ~/.claude/settings.json, tempat pengaturan itu berlaku di setiap proyek. Jika suatu perbaikan tetap tidak berpengaruh, pengaturan terkelola organisasi Anda mungkin menetapkan kunci tersebut.

Perbaikan yang menambahkan pola excludedCommands menghapus sandbox dari perintah yang cocok dengan pola tersebut. Lihat apa yang dapat dilakukan perintah yang dikecualikan.

Perintah gagal dengan kesalahan host-not-allowed

Banyak tool CLI perlu menjangkau host tertentu. Setujui host saat diminta, atau tambahkan ke allowedDomains. Jika organisasi Anda mengunci allowlist dengan allowManagedDomainsOnly, tidak ada permintaan izin, jadi minta administrator Anda untuk menambahkan host tersebut.

`jest` hang atau gagal

watchman tidak kompatibel dengan sandbox. Jalankan jest --no-watchman sebagai gantinya.

Go-based CLIs gagal verifikasi TLS di macOS

Tool seperti gh, gcloud, dan terraform mungkin gagal verifikasi TLS di bawah Seatbelt. Untuk menjalankan tool ini di luar sandbox, tambahkan pola untuk setiap tool, seperti gh *, ke excludedCommands. Tool tersebut kemudian berjalan dengan akses penuh Anda dan kredensial yang tersimpan. Jika Anda menggunakan httpProxyPort dengan proxy MITM dan CA khusus, atur enableWeakerNetworkIsolation ke true sebagai gantinya.

`open`, `osascript`, atau alur autentikasi berbasis browser gagal dengan kesalahan `-600` di macOS

Sandbox memblokir Apple Events secara default. Atur allowAppleEvents ke true dalam pengaturan pengguna, terkelola, atau CLI Anda untuk mengizinkannya. Claude Code mengabaikan kunci ini dalam pengaturan proyek.

Mengaktifkan allowAppleEvents menghilangkan isolasi eksekusi kode, karena perintah sandboxed kemudian dapat meluncurkan aplikasi lain tanpa sandbox tanpa permintaan izin pengguna, dan dapat mengirim perintah AppleScript ke aplikasi yang berjalan, tunduk pada permintaan persetujuan otomasi macOS (TCC). Alternatifnya, tambahkan pola seperti open * ke excludedCommands. Setiap panggilan open kemudian melalui alur izin, dan open dapat meluncurkan file atau aplikasi apa pun, termasuk yang ditulis oleh Claude.

Perintah `docker` gagal

docker tidak kompatibel dengan sandbox. Keluarkan perintah docker yang Anda butuhkan dari sandbox dengan pola excludedCommands seperti docker compose *. Menjalankan perintah di luar sandbox dengan excludedCommands menjelaskan apa yang dapat dijangkau oleh perintah docker yang dikecualikan. Pola yang lebih sempit mengeluarkan lebih sedikit perintah dari sandbox.

`pbcopy`, `xclip`, atau `wl-copy` tidak memperbarui clipboard

Utilitas clipboard pbcopy, xclip, dan wl-copy dapat gagal menjangkau clipboard sistem dari dalam sandbox, dalam hal ini teks yang dialirkan ke dalamnya tidak tiba.

Untuk menempatkan output Claude di clipboard Anda, minta Claude untuk mencetaknya dalam responsnya, kemudian jalankan /copy. /copy menulis ke clipboard dari proses Claude Code daripada dari perintah sandboxed.

Ketika Claude mengalirkan teks ke salah satu tool ini, menambahkan tool ke excludedCommands tidak mengeluarkan panggilan itu dari sandbox dengan sendirinya.

git merge, git checkout, dan perintah serupa gagal dengan unable to unlink old ketika mereka perlu mengganti file yang penulisannya ditolak oleh sandbox. Di Linux dan WSL2 kesalahan berakhir dengan Read-only file system. File tersebut dapat berada di salah satu lokasi berikut:

  • Di bawah jalur yang dilindungi seperti .claude/skills
  • Di bawah salah satu entri denyWrite Anda
  • Di luar direktori yang sama sekali diizinkan sandbox untuk ditulisi oleh perintah

Setelah kegagalan, Claude mungkin menawarkan untuk menjalankan kembali perintah di luar sandbox. Setujui retry itu, atau jalankan perintah git sendiri di terminal lain. Jika Anda telah menetapkan allowUnsandboxedCommands ke false, Claude tidak dapat menawarkan retry, jadi jalankan perintah sendiri.

Bubblewrap gagal memulai di dalam container

Dalam container tanpa privilege, bubblewrap tidak dapat memasang filesystem /proc baru, sehingga perintah sandboxed gagal dengan kesalahan bwrap seperti Can't mount proc on /newroot/proc: Operation not permitted. Atur enableWeakerNestedSandbox ke true sehingga sandbox melakukan bind-mount terhadap /proc yang sudah ada milik container sebagai gantinya. Hanya gunakan pengaturan ini ketika container luar sudah menyediakan batas isolasi yang Anda butuhkan, karena pengaturan ini mengekspos informasi proses ke perintah sandboxed yang akan disembunyikan oleh mount /proc baru.

File read-only 0-byte muncul di jalur pengaturan `.claude`, dan "Ya, dan jangan tanya lagi" tidak menyimpan

Di Linux dan WSL2, sandbox menahan penolakan penulisan pada file yang belum ada dengan membuat placeholder read-only 0-byte di sana sementara perintah sandboxed berjalan. Sandbox menghapus placeholder setelahnya. Jika sesi dihentikan paksa sebelum pembersihan itu berjalan, misalnya oleh SIGKILL, placeholder tetap tertinggal. Sesi berikutnya mengikat placeholder tersebut sebagai read-only lagi pada setiap awal, sehingga penulisan pengaturan seperti menyimpan pilihan izin gagal di jalur tempat placeholder masih ada.

Jalankan claude doctor di terminal Anda untuk membuat daftar file placeholder yang tersisa. Peringatan Stale sandbox mask files left by a killed session menyebutkan beberapa di antaranya dan menghitung sisanya. Hapus setiap file dengan rm sementara tidak ada sesi Claude Code lain yang berjalan di proyek itu. Sebelum v2.1.257, Claude Code meninggalkan placeholder yang sama tanpa menandainya.

`git` melalui SSH gagal saat sandbox aktif

Di macOS, git fetch, git pull, dan git push terhadap remote SSH gagal di dalam sandbox bahkan ketika host diizinkan. Di Linux dan WSL2, perintah tersebut berfungsi setelah host diizinkan. Claude Code menyalurkan koneksi SSH git melalui proxy sandbox, dan tunnel macOS tidak dapat melakukan autentikasi ke proxy tersebut.

Di Linux dan WSL2, periksa hal-hal berikut jika koneksi masih gagal:

  • Host diizinkan pada port 22: entri allowedDomains tanpa port, seperti "git.example.com", mencakupnya
  • Proxy perusahaan Anda mengizinkan port 22: jika jaringan Anda memerlukan proxy upstream, tunnel juga melewatinya
  • Kunci dapat dibaca sebagai file: sandbox dapat memblokir socket ssh-agent, dan entri denyRead atau credentials untuk ~/.ssh menyembunyikan file kunci Anda

Di macOS, ubah remote ke HTTPS, yang memerlukan kredensial HTTPS seperti personal access token:

git remote set-url origin https://git.example.com/example-org/example-repo.git

Jika Anda harus mempertahankan remote SSH, keluarkan perintah jaringan git dari sandbox dengan excludedCommands:

{
  "sandbox": {
    "excludedCommands": ["git fetch *", "git pull *", "git push *"]
  }
}

Entri ini cocok dengan git push origin main. Panggilan yang menambahkan cd, menggunakan git -C, atau berisi command substitution tetap berada di dalam sandbox. Perintah git yang dikecualikan dapat menjangkau host mana pun, tidak hanya yang ada di allowedDomains.

ssh, scp, dan rsync biasa melalui SSH gagal karena alasan yang diberikan oleh entri klien database.

Klien database atau tool non-HTTP lainnya gagal menjangkau host yang diizinkan

Tool yang mengabaikan environment variable proxy tidak dapat terhubung dari dalam sandbox, bahkan ke host yang ada di allowedDomains. Perintah sandboxed tidak memiliki rute langsung ke jaringan, sehingga tool yang membuka koneksinya sendiri akan gagal. Sebagian besar driver database, ssh biasa, dan tool yang menggunakan UDP berperilaku seperti ini.

Kegagalan tampak seperti kesalahan jaringan atau resolusi nama:

  • macOS: Operation not permitted, atau kesalahan resolusi nama seperti Could not resolve host
  • Linux dan WSL2: Network is unreachable, atau kesalahan resolusi nama seperti Temporary failure in name resolution

Tool yang menggunakan proxy gagal dengan cara berbeda ketika host-nya tidak diizinkan. Anda mendapatkan permintaan izin jaringan, atau tool menerima respons 403 dari proxy.

Untuk memungkinkan tool terhubung, jalankan perintah yang memerlukannya di luar sandbox dengan excludedCommands. Contoh ini mengecualikan satu skrip dan menambahkan aturan ask sehingga Anda menyetujui setiap eksekusi:

{
  "sandbox": {
    "excludedCommands": ["python scripts/load_orders.py *"]
  },
  "permissions": {
    "ask": ["Bash(python scripts/load_orders.py *)"]
  }
}

Skrip berjalan dengan akses penuh Anda, dan Claude dapat mengedit skrip yang berada di dalam direktori kerja Anda, jadi tinjau skrip tersebut saat permintaan izin muncul.

Perintah gagal menjangkau server di localhost

Secara default, perintah sandboxed tidak dapat terhubung langsung ke server yang berjalan di mesin Anda di luar sandbox, seperti dev server atau database dalam container. Apa yang dapat Anda ubah bergantung pada platform Anda:

  • macOS: atur network.allowLocalBinding ke true. Perintah sandboxed kemudian dapat mendengarkan pada port jaringan dan terhubung ke port mana pun di localhost, yang mencakup setiap layanan lain yang mendengarkan di sana. Layanan localhost yang tidak memerlukan autentikasi, seperti debugger, kemudian dapat bertindak atas nama perintah di luar sandbox, dan perintah yang mendengarkan pada alamat non-loopback menerima koneksi dari mesin lain
  • Linux dan WSL2: localhost milik perintah sandboxed bersifat privat untuk perintah tersebut. Perintah dapat mendengarkan pada port dan menjangkau server yang dimulainya sendiri. Koneksi langsung ke localhost atau 127.0.0.1 tidak menjangkau server di host, dan allowLocalBinding tidak berpengaruh. Jalankan perintah yang memerlukan server host di luar sandbox dengan excludedCommands, tempat perintah tersebut tidak memiliki batasan filesystem atau jaringan. Untuk koneksi yang melalui proxy sandbox, lihat Hostname yang di-resolve ke alamat lokal

Contoh ini mengaktifkan pengaturan untuk macOS:

{
  "sandbox": {
    "network": {
      "allowLocalBinding": true
    }
  }
}

Entri allowedDomains untuk localhost berlaku untuk koneksi yang melalui proxy, sehingga tidak mengubah koneksi langsung. Claude Code menetapkan NO_PROXY untuk perintah sandboxed sehingga perintah tersebut terhubung ke localhost secara langsung alih-alih melalui proxy. Entri tersebut juga mengekspos setiap port di localhost mesin Anda ke perintah yang memang menggunakan proxy. Untuk hostname pengembangan yang mengarah ke 127.0.0.1, lihat Hostname yang diizinkan ditolak dengan resolved to a loopback address.

Hostname yang diizinkan ditolak dengan `resolved to a loopback address`

Proxy sandbox menolak hostname yang diizinkan yang di-resolve ke alamat lokal, yang memengaruhi nama pengembangan seperti myapp.test yang mengarah ke 127.0.0.1. Perintah melihat respons 403 yang isinya menyebutkan jenis alamat, seperti Connection to myapp.test blocked: resolved to a loopback address.

Tambahkan alamat IP tempat nama tersebut di-resolve bersama hostname di allowedDomains, masing-masing dengan port tempat server Anda mendengarkan:

{
  "sandbox": {
    "network": {
      "allowedDomains": ["myapp.test:3000", "127.0.0.1:3000"]
    }
  }
}

Entri alamat IP tanpa port memungkinkan perintah sandboxed menjangkau setiap layanan yang mendengarkan pada alamat tersebut.

Sebelum v2.1.284, proxy terhubung ke alamat apa pun tempat hostname yang diizinkan di-resolve.

`/sandbox` gagal dengan `Sandbox settings are overridden by a higher-priority configuration`

/sandbox mencetak Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally. alih-alih membuka panelnya ketika tingkat pengaturan yang lebih tinggi menetapkan sandbox.enabled, sandbox.autoAllowBashIfSandboxed, atau sandbox.allowUnsandboxedCommands. Panel menyimpan pilihan Anda ke .claude/settings.local.json, dan nilai yang disimpan di sana tidak dapat menimpa tingkat-tingkat tersebut.

Pengaturan terkelola dan --settings memiliki peringkat di atas pengaturan lokal. Untuk melihat mana di antaranya yang dimuat oleh sesi ini, jalankan /status dan baca baris Setting sources:

  • Command line arguments: jika Anda memulai Claude Code dengan --settings, periksa apakah file atau JSON yang Anda berikan menetapkan salah satu kunci tersebut. Jika ya, ubah nilainya di sana, atau mulai Claude Code lagi tanpa kunci-kunci tersebut.
  • Enterprise managed settings: pengaturan terkelola organisasi Anda dimuat. Jika pengaturan tersebut menetapkan salah satu kunci tersebut, Anda tidak dapat mengubah kunci itu dari /sandbox atau dari file pengaturan apa pun yang Anda kendalikan, jadi tanyakan kepada administrator Anda.

Keterbatasan

Sandboxing mengurangi risiko tetapi bukan batas isolasi lengkap. Tinjau keterbatasan di bawah sebelum mengandalkannya sebagai kontrol keamanan keras.

Keterbatasan keamanan

  • Penyaringan jaringan: sandbox membatasi domain mana yang dapat terhubung oleh proses. Secara default, proxy bawaan tidak menghentikan atau melakukan inspeksi TLS pada lalu lintas keluar, sehingga isi koneksi terenkripsi tidak diperiksa. Pengaturan eksperimental network.tlsTerminate menghentikan TLS di proxy untuk substitusi kredensial mask tetapi tidak menambahkan penyaringan konten. Anda bertanggung jawab untuk memastikan bahwa hanya domain tepercaya yang diizinkan dalam kebijakan Anda.
  • Eskalasi privilege melalui soket Unix: konfigurasi allowUnixSockets dapat secara tidak sengaja memberikan akses ke layanan sistem yang dapat menyebabkan bypass sandbox. Misalnya, mengizinkan akses ke /var/run/docker.sock secara efektif memberikan akses ke sistem host melalui soket Docker. Pertimbangkan dengan hati-hati soket Unix apa pun yang Anda izinkan melalui sandbox.
  • Eskalasi izin filesystem: izin penulisan filesystem yang terlalu luas dapat memungkinkan serangan eskalasi privilege. Mengizinkan penulisan ke direktori yang berisi executable dalam $PATH, direktori konfigurasi sistem, atau file konfigurasi shell pengguna seperti .bashrc atau .zshrc dapat menyebabkan eksekusi kode dalam konteks keamanan yang berbeda ketika pengguna lain atau proses sistem mengakses file ini.
  • Kekuatan sandbox Linux: implementasi Linux menyediakan isolasi filesystem dan jaringan yang kuat tetapi mencakup mode enableWeakerNestedSandbox yang memungkinkannya bekerja di dalam lingkungan Docker tanpa namespace istimewa. Opsi ini secara konsiderabel melemahkan keamanan dan hanya boleh digunakan ketika isolasi tambahan sebaliknya diberlakukan.
  • Apple Events pada macOS: sandbox macOS memblokir Apple Events secara default. Pengaturan allowAppleEvents menghapus pembatasan ini sehingga alat seperti open dan osascript berfungsi, tetapi menghilangkan isolasi eksekusi kode: perintah sandboxed dapat meluncurkan aplikasi lain tanpa sandbox tanpa prompt pengguna, dan dapat mengirim perintah AppleScript ke aplikasi yang sedang berjalan, tunduk pada prompt persetujuan otomasi macOS per-aplikasi (TCC). Ini hanya dihormati dari pengaturan pengguna, terkelola, atau CLI. Pengaturan proyek tidak dapat mengaktifkannya.

Cakupan

Sandbox mengisolasi perintah shell dan proses turunannya. Apa yang berjalan di luar sandbox mencantumkan tool dan proses pembantu yang tidak dicakupnya. Penggunaan komputer dan subagent berkaitan dengan sandbox sebagai berikut:

  • Penggunaan komputer: ketika Claude membuka aplikasi dan mengontrol layar Anda, itu berjalan di desktop aktual Anda daripada di lingkungan terisolasi. Prompt izin per-aplikasi membatasi setiap aplikasi. Lihat computer use in the CLI atau computer use in Desktop.
  • Subagents: subagents berjalan dalam proses yang sama dengan sesi induk dan menggunakan konfigurasi sandbox yang sama. Perintah Bash di dalam subagent di-sandbox ketika sandboxing diaktifkan dalam sesi induk.
  • Mods: mod adalah plugin yang menjalankan kodenya sendiri di dalam Claude Code, dan proses yang dimulai oleh mod berjalan di luar sandbox. Lihat Apa yang dapat dijangkau mod.

Lihat juga