Configura la herramienta Bash en el sandbox
Restringe los archivos y hosts de red a los que pueden acceder los comandos de shell de Claude Code con el sandbox integrado. Actívalo, define el límite y corrige lo que deje de funcionar.
El sandbox de Bash es un límite que el sistema operativo impone alrededor de los comandos de shell que Claude ejecuta en tu máquina. Tú defines a qué archivos y dominios de red pueden acceder esos comandos, y los límites se aplican a los comandos de Bash, PowerShell y Monitor, y a los procesos que estos inician. Como el sistema operativo aplica los límites mientras se ejecuta un comando, Claude Code puede ejecutar comandos en el sandbox sin pedirte que apruebes cada uno.
El sandbox cubre solo los comandos de shell. Las herramientas de archivos de Claude, los servidores MCP y los hooks se ejecutan fuera de él.
El sandbox funciona en macOS, Linux y WSL2. En Windows nativo, Claude Code ejecuta los comandos fuera del sandbox. Para usar el sandbox en una máquina con Windows, ejecuta Claude Code dentro de una distribución de WSL2.
Esta página trata sobre el sandbox alrededor de los comandos de shell en tu propia máquina. Otras páginas abordan temas relacionados:
- Para saber cómo se aísla una sesión en la nube, consulta Seguridad y aislamiento
- Para comparar otros enfoques de aislamiento, como dev containers, contenedores personalizados y máquinas virtuales, consulta Entornos de sandbox
- Para reducir las solicitudes de permiso de herramientas distintas de Bash, consulta modos de permisos
Qué restringe el sandbox
Mientras el sandbox está activado, los comandos de shell que Claude ejecuta se inician dentro de sus límites, y lo mismo ocurre con los procesos que esos comandos inician. El sandbox está desactivado de forma predeterminada. Para activarlo, ejecuta /sandbox en una sesión, como se muestra en Primeros pasos, o establece sandbox.enabled en true en un archivo de configuración como ~/.claude/settings.json.
La tabla muestra a qué puede acceder un comando en el sandbox de forma predeterminada y los ajustes que cambian cada valor predeterminado.
| Acceso | Predeterminado | Cámbialo con |
|---|---|---|
| Escrituras | El directorio de trabajo, un directorio temporal por usuario y los directorios que hayas agregado. Las rutas protegidas siguen con la escritura denegada | filesystem.allowWrite, filesystem.denyWrite |
| Lecturas | La mayor parte de la máquina, incluidos archivos de credenciales como ~/.ssh y ~/.aws/credentials |
filesystem.denyRead, credentials |
| Red | Sin ruta directa hacia el exterior. Las conexiones pasan por un proxy en tu máquina que verifica cada host contra tus dominios permitidos, que inicialmente están vacíos. Tu modo de permisos decide qué ocurre con los demás hosts | network.allowedDomains, network.deniedDomains |
| Variables de entorno | Heredadas de Claude Code, incluidos los secretos que haya en su entorno | credentials, CLAUDE_CODE_SUBPROCESS_ENV_SCRUB |
Claude Code construye el sandbox sobre el paquete de código abierto @anthropic-ai/sandbox-runtime.
Qué se ejecuta fuera del sandbox
El sandbox envuelve los comandos de shell. Estas herramientas y procesos se ejecutan fuera de él:
- Herramientas integradas de archivos y web: herramientas como Read, Edit, Write, WebFetch y WebSearch siguen, en cambio, las reglas de permisos. Una entrada
denyReadno detiene la herramienta Read, yallowedDomainsno limita WebFetch - Otros procesos que inicia Claude Code: los hooks de comando, los servidores MCP locales, los monitores de plugins, los servidores LSP y los comandos auxiliares, como el comando de tu línea de estado y
apiKeyHelper, se ejecutan con tu acceso completo
Algunos comandos de shell también se ejecutan fuera del sandbox, según tu configuración:
- Comandos que escribes tú mismo: un comando que introduces en el prompt del modo shell
!se ejecuta fuera del sandbox en la mayoría de las sesiones. El modo sandbox estricto enumera las sesiones en las que un comando que escribes se ejecuta dentro del sandbox - Comandos excluidos: los comandos que coinciden con
excludedCommandsse ejecutan fuera del sandbox - Reintentos fuera del sandbox: Claude puede pedir ejecutar un comando fuera del sandbox, normalmente después de que falle dentro del sandbox
Para poner las herramientas, los procesos y los comandos de esta sección detrás de un único límite, ejecuta el propio proceso de Claude Code en un contenedor, una máquina virtual o el sandbox runtime.
Primeros pasos
El sandbox está integrado en Claude Code. Lo que instalas depende de tu plataforma:
- macOS: el sandboxing usa el framework Seatbelt integrado, así que puedes ir directamente a los pasos
- Linux y WSL2: el sandbox depende de
bubblewrapysocat, que se explican en Configurar Linux y WSL2. Aunque todavía no los hayas instalado, puedes empezar con/sandbox, porque su panel muestra si falta algo
Ejecuta /sandbox
Inicia una sesión de Claude Code y ejecuta el comando /sandbox:
/sandbox
Esto abre el panel del sandbox con tres pestañas, más una pestaña Dependencies en Linux cuando falta el filtro seccomp opcional:
- Mode: elige cómo se aprueban los comandos ejecutados en el sandbox, lo que se explica en el siguiente paso
- Overrides: elige si los comandos que fallan dentro del sandbox pueden recurrir a ejecutarse fuera de él. Este es el ajuste
allowUnsandboxedCommands - Config: consulta la configuración resuelta del sandbox
Si el panel muestra solo una pestaña Dependencies, falta un paquete obligatorio. Instálalo como se describe en Configurar Linux y WSL2, reinicia Claude Code y vuelve a ejecutar /sandbox.
Elige un modo
En la pestaña Mode, selecciona auto-allow o permisos regulares. Auto-allow ejecuta los comandos del sandbox sin pedir confirmación, y los permisos regulares mantienen las solicitudes de permiso habituales incluso cuando los comandos se ejecutan en el sandbox. Consulta Modos del sandbox para ver qué comandos siguen pidiendo confirmación en el modo auto-allow.
Ejecuta un comando de Bash
Pídele a Claude que ejecute un comando, como una compilación o un conjunto de pruebas. De forma predeterminada, los comandos dentro del sandbox pueden escribir en el directorio de trabajo, en un directorio temporal por usuario y en cualquier directorio que hayas agregado con --add-dir, /add-dir o permissions.additionalDirectories.
La primera vez que un comando necesita un nuevo dominio de red, Claude Code pide aprobación; en el modo automático, Claude, en cambio, indica los hosts que necesita un comando en el propio comando para que el clasificador los revise junto con él.
Para ampliar o restringir lo que permite el sandbox, consulta Configurar el sandboxing.
Si los comandos del sandbox fallan con Operation not permitted dentro de un contenedor, consulta la entrada de Bubblewrap en Solución de problemas.
Cuando seleccionas un modo en el panel, Claude Code lo guarda en la configuración local de tu proyecto en .claude/settings.local.json, que se aplica al proyecto actual. Claude Code agrega ese archivo a tu gitignore global cuando guarda un ajuste en él. Para habilitar el sandbox en todos tus proyectos, establece sandbox.enabled en true en tu configuración de usuario en ~/.claude/settings.json. Para imponer el sandboxing a todos los desarrolladores de una organización, usa la configuración administrada.
Para cambiar el sandbox durante una sesión sin escribir en un archivo de configuración, inicia Claude Code con --settings. Por ejemplo, este comando inicia una sesión en el sandbox en la que Claude no puede reintentar un comando bloqueado fuera del sandbox:
claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'
De forma predeterminada, si el sandbox no puede iniciarse porque falta una dependencia o la plataforma no es compatible, Claude Code ejecuta los comandos sin sandboxing. Para que Claude Code se cierre al iniciar en su lugar, establece sandbox.failIfUnavailable en true. Los despliegues administrados que exigen el sandboxing como barrera de seguridad pueden usar este ajuste.
Confirmar que los comandos se ejecutan dentro del sandbox
Para comprobar que el sandbox funciona, pídele a Claude que ejecute cada línea de la tabla. Lo que escribes en el prompt ! normalmente se ejecuta fuera del sandbox, así que escribir una línea tú mismo no lo pone a prueba.
| Comando | Resultado dentro del sandbox |
|---|---|
touch ~/sandbox-probe |
Falla con Operation not permitted en macOS, o Read-only file system en Linux y WSL2 |
curl --noproxy '*' https://example.com |
Falla con Could not resolve host, porque el comando no tiene ninguna ruta que evite el proxy del sandbox |
Si Claude pide reintentar un comando fallido fuera del sandbox, rechaza el reintento. Si touch tiene éxito y tu directorio home no es uno de los directorios en los que el sandbox permite escribir a los comandos, elimina ~/sandbox-probe. Luego ejecuta /sandbox para comprobar que el sandbox está activado y que sus dependencias están instaladas.
Configurar Linux y WSL2
En Linux y WSL2, el sandbox depende de estos paquetes:
bubblewrap: la herramienta de sandboxing sin privilegios que aplica el aislamiento del sistema de archivossocat: el relé que se usa para enrutar el tráfico de red a través del proxy del sandbox
Instálalos con el gestor de paquetes de tu distribución:
sudo apt-get install bubblewrap socat
sudo dnf install bubblewrap socat
Cuando falta una dependencia, la pestaña Dependencies de /sandbox indica cuáles de ripgrep, bubblewrap, socat y el filtro seccomp le faltan a tu plataforma. Si no ves la pestaña después de instalarlos y reiniciar Claude Code, todas las dependencias están presentes.
Ripgrep viene incluido con el binario nativo de Claude Code. El filtro seccomp es opcional y añade el bloqueo de sockets de dominio Unix. Instálalo con npm install -g @anthropic-ai/sandbox-runtime si falta.
Cuando falta una dependencia obligatoria, la pestaña Dependencies es la única que se muestra hasta que la instales. Cuando solo falta el filtro seccomp opcional, la pestaña Dependencies aparece junto con las demás pestañas. La comprobación de dependencias se ejecuta al iniciar, así que reinicia Claude Code después de instalar paquetes para que /sandbox los detecte.
Para comprobar si tu entorno aplica esta restricción, incluso dentro de WSL2, ejecuta `sysctl kernel.apparmor_restrict_unprivileged_userns`. Si el comando devuelve `0`, omite este paso. Si muestra un error `No such file or directory`, la clave no existe y puedes omitir este paso. Si devuelve `1`, agrega un perfil de AppArmor que le otorgue esta capacidad a `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
```
El perfil se aplica solo a `bwrap`, no a los comandos que ejecuta dentro del sandbox. Recarga AppArmor para aplicarlo:
```bash theme={null}
sudo systemctl reload apparmor
```
Notas sobre WSL2
Comprueba tu versión de WSL con wsl -l -v desde PowerShell. Si ves Sandboxing requires WSL2, tu distribución está ejecutando WSL1. Actualízala a WSL2 o ejecuta Claude Code sin sandboxing.
En WSL2, WSL transfiere el lanzamiento de un binario de Windows, como cmd.exe, powershell.exe o cualquier cosa bajo /mnt/c/, al host de Windows a través de un socket Unix, por lo que que un comando del sandbox pueda lanzar uno depende de los ajustes de sockets Unix del sandbox: el filtro seccomp opcional tiene que estar instalado para que el socket se bloquee en primer lugar. Para permitir estos lanzamientos, establece allowAllUnixSockets, que abre todos los sockets Unix a los comandos del sandbox.
Modos del sandbox
Claude Code ofrece dos modos del sandbox. En ambos, el sandbox aplica las mismas restricciones de sistema de archivos y de red; la diferencia está solo en si los comandos del sandbox se aprueban automáticamente o requieren permiso explícito.
Modo auto-allow
Claude Code aprueba un comando automáticamente, sin pedir confirmación, cuando el comando se ejecuta dentro del sandbox. Un comando pasa por el flujo de permisos habitual cuando se ejecuta fuera del sandbox porque coincide con excludedCommands o porque Claude lo reintenta fuera del sandbox.
Un comando del sandbox que se conecta a un host que no has permitido permanece en el sandbox. Hosts fuera de tus dominios permitidos explica quién decide si la conexión se realiza.
Incluso en el modo auto-allow, sigue aplicándose lo siguiente:
- Las reglas de denegación explícitas siempre se respetan
- Los comandos
rmormdirque apuntan a una ruta crítica siguen pasando por el flujo de permisos habitual - Las reglas de consulta limitadas por contenido, como
Bash(git push *), siguen forzando una solicitud de permiso incluso para los comandos del sandbox - Una regla de consulta
Bashsin más, o la forma equivalenteBash(*), se omite para los comandos que se ejecutan en el sandbox; sigue aplicándose a los comandos que recurren al flujo de permisos habitual. En el modo plan, la regla no se omite: también pide confirmación para los comandos del sandbox, incluidos los de solo lectura. Antes de la v2.1.212, la omisión también se aplicaba en el modo plan
El modo auto-allow funciona de forma independiente de tu ajuste de modo de permisos, con tres excepciones: el modo plan, un comando del modo automático que lleva dominios permitidos por comando y la revisión del clasificador del lado del servidor de los comandos del sandbox en el modo automático. Aunque no estés en el modo "accept edits", los comandos de Bash del sandbox se ejecutan automáticamente cuando auto-allow está habilitado. Esto significa que los comandos de Bash que modifican archivos dentro de los límites del sandbox se ejecutan sin pedir confirmación, incluso en el modo Manual, donde las herramientas de edición de archivos sí la pedirían.
En el modo plan, auto-allow no amplía las aprobaciones; consulta el modo plan para ver cómo Claude Code controla los comandos mientras planificas. Antes de la v2.1.212, auto-allow también ejecutaba los comandos del sandbox sin pedir confirmación en el modo plan.
Modo de permisos regulares
Todos los comandos de Bash pasan por el flujo de permisos habitual, incluso cuando se ejecutan en el sandbox. Esto proporciona más control, pero requiere más aprobaciones.
La vía de escape del reintento fuera del sandbox
El reintento fuera del sandbox es una vía de escape para los comandos que fallan dentro del sandbox, como las herramientas que son incompatibles con él. Cuando el sandbox bloquea una conexión de red, Claude Code indica el host denegado en el resultado del comando, así Claude ve qué se bloqueó. Claude analiza el fallo y puede reintentar el comando con el parámetro dangerouslyDisableSandbox.
El comando reintentado se ejecuta fuera del sandbox. En una sesión interactiva de la terminal, quién lo aprueba depende de tu modo de permisos:
- Modo
bypassPermissions: el reintento se ejecuta sin pedir confirmación - Modo Manual y modo
acceptEdits: recibes una solicitud titulada "Bash command (unsandboxed)" - Modo automático: un modelo clasificador independiente evalúa el comando subyacente
- Modo
dontAsk: Claude Code deniega el reintento - Modo plan: consulta cómo Claude Code controla los comandos mientras planificas
Estas reglas y ajustes cambian quién aprueba el reintento:
- Una regla de permiso que coincida: si una regla de permiso como
Bash(curl *)coincide con el comando, también aprueba el reintento, por lo que el comando se ejecuta fuera del sandbox sin pedir confirmación - Una regla de consulta para el parámetro: agrega una regla de consulta para
Bash(dangerouslyDisableSandbox:true)para que se te pida confirmación en los reintentos de Bash. También recibes la solicitud en el modo automático y en el modobypassPermissions, y la regla tiene precedencia sobre una regla de permiso que coincida permissions.blockReadsOutsideWorkingDirectories: Acciones que ningún modo aprueba automáticamente explica los reintentos que piden confirmación mientras está activado
Desactivar el reintento con el modo estricto del sandbox
Puedes desactivar el reintento fuera del sandbox estableciendo "allowUnsandboxedCommands": false en tu configuración del sandbox. Con el reintento desactivado, Claude Code ignora el parámetro dangerouslyDisableSandbox. Mientras el sandbox está en ejecución, los comandos que ejecuta Claude se ejecutan entonces en el sandbox, a menos que coincidan con una entrada de excludedCommands. Para evitar que Claude Code ejecute comandos fuera del sandbox cuando este no puede iniciarse, establece también failIfUnavailable. La pestaña Overrides de /sandbox muestra este ajuste como Strict sandbox mode.
Un false en tu configuración de usuario, en --settings o en la configuración administrada se mantiene incluso cuando la configuración de un proyecto establece true. Un false en tu configuración de usuario no convierte el sandbox en obligatorio por parte del administrador, por lo que los demás ajustes del sandbox de un proyecto siguen aplicándose. Antes de la v2.1.285, el true de un proyecto sobrescribía un false de tu configuración de usuario.
Si tú o tu administrador desactivan el reintento en la configuración administrada o con el flag --settings, el sandbox pasa a ser obligatorio por parte del administrador. Claude Code entonces ignora los ajustes de los archivos de un repositorio que relajan el sandbox, incluidas las entradas de excludedCommands. Configuración del repositorio con un sandbox obligatorio por parte del administrador los enumera.
El modo estricto del sandbox se aplica a los comandos que ejecuta Claude. Los comandos que escribes tú mismo en el prompt ! del modo shell se ejecutan fuera del sandbox, a menos que la sesión sea una de estas:
- Una sesión en segundo plano: el modo estricto del sandbox también cubre los comandos del modo shell
- Una sesión de Linux con
CLAUDE_CODE_SUBPROCESS_ENV_SCRUBestablecida: todos los comandos se ejecutan en el sandbox, incluidos los del modo shell
Antes de la v2.1.260, el modo estricto del sandbox ejecutaba en el sandbox los comandos del modo shell en todas las sesiones.
Directorios temporales
Un directorio temporal por usuario es escribible dentro del sandbox de forma predeterminada, junto con el directorio de trabajo. A menos que desactives el aislamiento del sistema de archivos, Claude Code establece $TMPDIR en este directorio para los comandos del sandbox, de modo que las herramientas que escriben archivos temporales funcionan sin configuración adicional.
Los comandos fuera del sandbox heredan el $TMPDIR de tu shell cuando está establecido, así que, mientras el aislamiento del sistema de archivos está activado, los comandos dentro y fuera del sandbox resuelven $TMPDIR en directorios distintos. Si tu shell deja $TMPDIR sin establecer o vacío, un comando fuera del sandbox que hace referencia a $TMPDIR recibe tu sobrescritura de CLAUDE_CODE_TMPDIR, o el directorio temporal del sistema operativo cuando no has establecido ninguna o la sobrescritura es una ruta larga, para que la variable no se expanda a una cadena vacía. Para pasar archivos temporales entre ambos, escríbelos en el directorio de trabajo.
Configurar el sandboxing
Personaliza el comportamiento del sandbox a través de tu archivo settings.json. Consulta Configuración para ver la referencia completa de configuración.
De forma predeterminada, los comandos aislados en el sandbox pueden escribir en el directorio de trabajo actual, en el directorio temporal por usuario y en cualquier directorio que hayas agregado con --add-dir, /add-dir o permissions.additionalDirectories. Si comandos de subprocesos como kubectl, terraform o npm necesitan escribir fuera de esos directorios, usa sandbox.filesystem.allowWrite para conceder acceso a rutas específicas:
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["~/.kube", "/tmp/build"]
}
}
}
Estas rutas se aplican a nivel del sistema operativo, por lo que todos los comandos que se ejecutan dentro del sandbox, incluidos sus procesos hijos, las respetan. Este es el enfoque recomendado cuando una herramienta necesita acceso de escritura a una ubicación específica, en lugar de excluir la herramienta del sandbox por completo con excludedCommands.
Cuando defines el mismo arreglo de sistema de archivos en varios alcances de configuración, Claude Code los combina, uniendo las rutas de todos los alcances en lugar de reemplazar el arreglo de un alcance con el de otro.
Si excluyes una fuente con --setting-sources en la CLI o con settingSources en el Agent SDK, Claude Code ignora sus entradas de sandbox.filesystem, sus reglas de permisos de Edit y sus reglas de denegación de Read al construir la configuración del sandbox. Requiere Claude Code v2.1.246 o posterior.
Cuando editas estas listas del sistema de archivos durante una sesión, Claude Code aplica el cambio a la sesión en ejecución, por lo que el siguiente comando aislado en el sandbox se ejecuta con las nuevas rutas.
Los prefijos de ruta controlan cómo se resuelven las rutas:
| Prefijo | Significado | Ejemplo |
|---|---|---|
/ |
Ruta absoluta desde la raíz del sistema de archivos | /tmp/build sigue siendo /tmp/build |
~/ |
Relativa al directorio home | ~/.kube se convierte en $HOME/.kube |
./ o sin prefijo |
Relativa a la raíz del proyecto en la configuración del proyecto, o a ~/.claude en la configuración de usuario |
./output en .claude/settings.json se resuelve como <project-root>/output |
Esta sintaxis difiere de las reglas de permisos de Read y Edit, que usan //path para rutas absolutas y /path para rutas relativas al proyecto. Las rutas del sistema de archivos del sandbox usan las convenciones estándar: /tmp/build es absoluta. Para saber cómo trata Claude Code una barra final o un comodín en estas rutas, consulta Prefijos de ruta del sandbox.
También puedes denegar el acceso de escritura o lectura con sandbox.filesystem.denyWrite y sandbox.filesystem.denyRead, y volver a permitir rutas específicas dentro de una región denegada con sandbox.filesystem.allowRead. Cuando las reglas de lectura se superponen, se aplica la regla con la ruta más específica:
| Reglas de ejemplo | Resultado |
|---|---|
"denyRead": ["~/"] con "allowRead": ["~/projects"] |
~/projects se puede leer y el resto del directorio home sigue bloqueado. El permiso más específico vuelve a abrir esa parte de la región denegada |
"allowRead": ["~/"] con "denyRead": ["~/.env"] |
~/.env sigue bloqueado y el resto del directorio home se puede leer. La denegación se mantiene dentro de un permiso más amplio, de modo que un permiso general no puede volver a exponer un secreto sin que lo notes |
"allowRead": ["~/"] con "denyRead": ["~/**/.env"] |
Todos los .env dentro del directorio home siguen bloqueados y el resto se puede leer. Una denegación con comodín se mantiene dentro de un permiso más amplio de la misma forma que una ruta exacta |
El siguiente ejemplo bloquea la lectura de todo el directorio home y a la vez permite las lecturas del proyecto actual. Colócalo en el .claude/settings.json de tu proyecto, porque la ruta relativa . se resuelve como la raíz del proyecto solo cuando la configuración está en la configuración del proyecto:
{
"sandbox": {
"enabled": true,
"filesystem": {
"denyRead": ["~/"],
"allowRead": ["."]
}
}
}
Si colocaras la misma configuración en ~/.claude/settings.json, . se resolvería como ~/.claude, y los archivos del proyecto seguirían bloqueados por la regla denyRead.
Para denegar a los comandos aislados en el sandbox el acceso de lectura a los directorios home y a los volúmenes montados, manteniendo legibles los directorios de trabajo, configura permissions.blockReadsOutsideWorkingDirectories en lugar de escribir reglas de rutas.
Ejecutar comandos fuera del sandbox con `excludedCommands`
Agrega un patrón de comando a sandbox.excludedCommands para ejecutar los comandos que coincidan fuera del sandbox, lo que significa sin restricciones del sistema de archivos y sin proxy de red. Úsalo para una herramienta que no puede funcionar dentro del sandbox y a la que le confías todo tu acceso. Una herramienta que necesita un directorio más o un host más puede funcionar con allowWrite o allowedDomains, que mantienen el comando dentro del sandbox.
Este ejemplo saca del sandbox los comandos docker compose. Guárdalo en ~/.claude/settings.json para aplicarlo a todos tus proyectos:
{
"sandbox": {
"enabled": true,
"excludedCommands": ["docker compose *"]
}
}
Claude Code compara tus entradas con cada llamada a Bash y Monitor. Una llamada es la línea de comandos completa que envía Claude, que puede encadenar varios comandos. Las siguientes reglas deciden si una llamada sale del sandbox:
- Termina el patrón con
*: las entradas usan la misma sintaxis que una regla de permisosBash(...), donde un patrón sin comodín es una coincidencia exacta.dockercoincide solo condockersin argumentos.docker *coincide condockercon o sin argumentos - Todos los comandos de la llamada deben coincidir:
npm ci && docker compose buildsigue dentro del sandbox a menos que otra entrada cubranpm ci - Claude Code compara el texto de la llamada: un script o un objetivo de
makeque llama adockerinternamente no coincide, y tampoco/usr/local/bin/docker - Algunas llamadas permanecen en el sandbox: una redirección a un archivo, un
cdo una sustitución de comandos como$(...)mantiene toda la llamada dentro del sandbox. La entrada de referencia enumera más llamadas que permanecen en el sandbox - Dónde guardas la entrada puede importar: mientras el sandbox sea obligatorio por el administrador, Claude Code ignora las entradas de
.claude/settings.jsony.claude/settings.local.json
Un comando excluido pasa por el flujo de permisos habitual:
- Los comandos de solo lectura y los comandos que cubren tus reglas de permiso se ejecutan sin pedir confirmación
- En modo automático, el clasificador revisa los demás comandos excluidos
- En modo
bypassPermissions, un comando excluido se ejecuta sin pedir confirmación a menos que coincida con una regla de consulta
Para confirmar que una entrada coincide, cambia al modo Manual y pídele a Claude que ejecute un comando coincidente que cambie algo, como docker compose up -d. La solicitud de permiso se titula "Bash command (unsandboxed)".
Un comando excluido se ejecuta con todo tu acceso. Una entrada amplia como docker * cubre todo lo que esa herramienta puede hacer. Si escribes un patrón que cubre un intérprete, un script dentro de tu directorio de trabajo o una herramienta que actúa sobre un archivo de ese directorio, como hace docker compose con su archivo compose, Claude puede escribir ese archivo y luego ejecutarlo fuera del sandbox. Un patrón más específico deja menos cosas que Claude pueda ejecutar fuera del sandbox.
Desactivar el aislamiento del sistema de archivos
Establece sandbox.filesystem.disabled en true para omitir el aislamiento del sistema de archivos y mantener el aislamiento de red. El siguiente ejemplo desactiva el aislamiento del sistema de archivos y mantiene una lista de dominios de red permitidos:
{
"sandbox": {
"enabled": true,
"filesystem": {
"disabled": true
},
"network": {
"allowedDomains": ["github.com", "*.npmjs.org"]
}
}
}
El sandbox tiene dos capas independientes: el aislamiento del sistema de archivos controla qué rutas pueden leer y escribir los comandos aislados en el sandbox, y el aislamiento de red controla a qué dominios pueden acceder. Con la capa del sistema de archivos desactivada, los comandos aislados en el sandbox obtienen acceso de lectura y escritura sin restricciones al sistema de archivos del host, mientras que su tráfico de red saliente sigue limitado a tus dominios permitidos. Desactiva esta capa cuando uses el sandbox para controlar a dónde se conectan los comandos y no lo que escriben.
El ajuste está desactivado de forma predeterminada y se aplica en las plataformas donde se ejecuta el sandbox: macOS, Linux y WSL2. Requiere Claude Code v2.1.216 o posterior.
Con el aislamiento del sistema de archivos desactivado y los comandos permitidos automáticamente, un comando aislado en el sandbox puede escribir archivos que comandos posteriores ejecutan o leen, como archivos de inicio del shell, ejecutables en $PATH o ~/.claude/settings.json, y usarlos para ampliar su propio acceso en la siguiente ejecución. Establece filesystem.disabled en true solo para cargas de trabajo en las que confíes que no ampliarán su propio acceso. Bloquear los dominios de red con allowManagedDomainsOnly reduce el riesgo, pero no lo elimina, ya que ese bloqueo se aplica solo a los comandos que se ejecutan dentro del sandbox.
Qué configuraciones pueden desactivarlo
Como desactivar el aislamiento del sistema de archivos amplía lo que pueden hacer los comandos aislados en el sandbox, Claude Code respeta filesystem.disabled solo desde estas fuentes de configuración:
- La configuración de usuario, la configuración administrada y el flag de CLI
--settingspueden establecerlo. La configuración del proyecto en.claude/settings.jsony.claude/settings.local.jsonno puede, de modo que un proyecto descargado no puede desactivar el aislamiento del sistema de archivos. - Cuando la configuración administrada configura
sandbox.filesystemde cualquier forma, o incluye alguna entrada desandbox.credentials.filescon"mode": "deny", solo la configuración administrada puede establecer la clave. Esto mantiene vigentes las restricciones del sistema de archivos desplegadas por el administrador; para flexibilizar un despliegue así, establece"disabled": trueen la configuración administrada. - Cuando
CLAUDE_CODE_SUBPROCESS_ENV_SCRUBestá establecida, Claude Code ignorafilesystem.disableddesde cualquier fuente, incluida la configuración administrada, y mantiene activado el aislamiento del sistema de archivos.
Si una entrada administrada de credentials.files fija filesystem.disabled, bloqueando la clave a la configuración administrada para que los desarrolladores no puedan desactivar el aislamiento del sistema de archivos, depende del mode de la entrada y de lo que le ocurre a la entrada cuando se inicia el sandbox:
| Entrada administrada | Fija filesystem.disabled |
Qué protege el archivo cuando el aislamiento está desactivado |
|---|---|---|
"mode": "deny" |
Sí | Nada: el bloqueo de lectura forma parte de la capa del sistema de archivos |
"mode": "mask", aplicada como máscara |
No | El propio enmascaramiento: la copia centinela y el proxy en Linux y WSL2, y las propias reglas de lectura del sandbox en macOS |
"mode": "mask", que recurrió a deny durante la configuración |
No | Nada, igual que deny. Incluye una ruta que no se puede enmascarar, como un directorio, como una entrada deny explícita, que fija la clave |
"mode": "mask", degradada a deny por la validación |
Sí, como un deny explícito |
Nada, igual que deny |
El recurso a deny ocurre cuando se inicia el sandbox, después de que Claude Code ya leyó la configuración sobre la que se ejecuta la comprobación de fijación, por lo que una entrada que recurrió a deny nunca fija la clave. La validación reescribe una entrada no válida como deny mientras se carga la configuración, por lo que una entrada degradada fija la clave igual que una que escribiste como deny.
Qué cambia cuando el aislamiento del sistema de archivos está desactivado
Establecer filesystem.disabled elimina las protecciones que aplica la propia capa del sistema de archivos. Las protecciones que aplican otras capas siguen vigentes:
| Protección | Con el aislamiento del sistema de archivos desactivado |
|---|---|
Bloqueos de lectura de filesystem.denyRead y de deny en credentials.files |
No se aplican. La capa del sistema de archivos aplica ambos |
Entradas deny y mask de credentials.envVars |
Se aplican. La limpieza de variables de entorno es independiente de la capa del sistema de archivos |
Entradas mask de credentials.files aplicadas como máscaras |
Se aplican: el enmascaramiento es independiente de la capa del sistema de archivos. Una entrada que recurrió a deny no se aplica, como cualquier entrada deny |
Cambian otras dos cosas:
-
Los comandos aislados en el sandbox heredan el
$TMPDIRde tu shell en lugar del directorio temporal por usuario, porque todos los directorios temporales se pueden escribir y Claude Code ya no redirige los comandos al directorio por usuario.En Linux, la variable a menudo no está establecida en el shell principal. Las indicaciones de la herramienta Bash le dicen a Claude que cree directorios temporales con
mktemp -den lugar de depender de$TMPDIR. -
autoAllowBashIfSandboxedsigue teniendotruecomo valor predeterminado, por lo que los comandos aislados en el sandbox siguen ejecutándose sin pedir confirmación. Establécelo enfalsepara que se pida confirmación para los comandos aislados en el sandbox.
Proteger credenciales
El ajuste sandbox.credentials declara los archivos de credenciales y las variables de entorno que se deben proteger de los comandos aislados en el sandbox. Cada entrada indica una ruta de archivo o una variable de entorno y un mode. El bloque dedicado credentials mantiene las reglas de credenciales agrupadas y separadas de las reglas generales del sistema de archivos.
En las entradas con "mode": "deny", se deniega la lectura de las rutas de archivo dentro del sandbox, la misma restricción que aplica filesystem.denyRead, y las variables de entorno se eliminan antes de que se ejecute cada comando aislado en el sandbox. La protección de archivos forma parte de la capa del sistema de archivos, por lo que no se aplica si desactivas el aislamiento del sistema de archivos; la protección de variables de entorno sí se sigue aplicando.
El siguiente ejemplo bloquea la lectura del archivo de credenciales de AWS y del directorio SSH, y elimina GITHUB_TOKEN y NPM_TOKEN del entorno de los comandos aislados en el 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" }
]
}
}
}
Las entradas de variables de entorno y de archivos también aceptan "mode": "mask", que se describe en Enmascarar credenciales.
Las rutas de archivo siguen las mismas reglas de prefijos que los ajustes sandbox.filesystem.*.
Claude Code combina las entradas deny de todos los alcances de configuración que carga la sesión. Una entrada deny solo restringe el acceso, por lo que cualquier alcance puede agregar una, pero ningún alcance puede eliminar una que haya agregado otro alcance.
Cuando excluyes una fuente de configuración:
- Configuración del proyecto o local: Claude Code no aplica ninguna de sus entradas de
credentials. Requiere Claude Code v2.1.246 o posterior. - Configuración de usuario: Claude Code sigue aplicando las entradas
denyde~/.claude/settings.jsony mantiene sus entradasmaskde archivos como restricciones, pero descarta sus entradasmaskde variables de entorno.
No hay una lista de denegación de credenciales integrada, por lo que solo se restringen los archivos y las variables que indiques.
sandbox.credentials afecta solo a los comandos Bash aislados en el sandbox. Para quitar credenciales de todos los subprocesos independientemente del sandboxing, establece CLAUDE_CODE_SUBPROCESS_ENV_SCRUB.
Enmascarar credenciales
El enmascaramiento va más allá de una entrada deny de Proteger credenciales. En lugar de bloquear una credencial, Claude Code muestra a los comandos aislados en el sandbox un marcador, el centinela, y el proxy del sandbox lo sustituye por el valor real en las solicitudes salientes a los hosts que permitas. En el caso de los archivos, la sustitución es el comportamiento de Linux y WSL2; macOS bloquea el archivo en su lugar.
Enmascarar variables de entorno
"mode": "mask" protege una credencial y mantiene funcionando las herramientas que se autentican con ella. deny elimina la variable por completo, lo que también rompe las herramientas que la necesitan, como gh o npm. Requiere Claude Code v2.1.199 o posterior.
Con mask, el comando aislado en el sandbox ve un valor centinela por sesión en lugar del real. Cada entrada mask puede incluir injectHosts, los hosts a los que puede llegar el valor real. Cuando una solicitud sale del sandbox hacia uno de ellos, el proxy del sandbox reemplaza el centinela por el valor real. El comando y todo lo que registra nunca contienen la credencial real, pero sus solicitudes se siguen autenticando.
El proxy sustituye la credencial dentro del contenido de la solicitud, por lo que necesita verlo. Configura network.tlsTerminate para que el proxy termine TLS por sí mismo.
Sin esto, el enmascaramiento falla sin exponer nada: el comando sigue viendo solo el centinela, pero el centinela llega al servidor sin cambios y la autenticación falla. Claude Code informa de esta configuración incorrecta al iniciar.
La sustitución abarca los encabezados y los cuerpos de las solicitudes. Las solicitudes que se autentican con una firma derivada de la credencial, en lugar de con la credencial misma, necesitan volver a firmarse en el proxy; Volver a firmar solicitudes de AWS explica cómo funciona esto para AWS.
El proxy solo inyecta en las conexiones que admite la lista de dominios permitidos, por lo que cada destino de injectHosts también debe ser accesible a través de network.allowedDomains.
El siguiente ejemplo enmascara dos tokens. GH_TOKEN se sustituye solo en las solicitudes a api.github.com, mientras que NPM_TOKEN no tiene injectHosts y se sustituye en las solicitudes a todos los hosts de 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" }
]
}
}
}
Escribe un destino IPv6 de forma distinta en las dos listas, porque cada lista tiene su propio matcher:
network.allowedDomains: la forma entre corchetes que usan las listas de dominios, como"[::1]". El proxy comprueba esta lista para admitir la conexión.injectHosts: la dirección sin corchetes en su forma canónica comprimida, como"::1"o"2001:db8::1". El proxy compara cada entrada con la dirección de destino sin corchetes de la conexión, ignorando los puertos, por lo que una forma entre corchetes, con ID de zona o comprimida de otra manera nunca coincide y el proxy nunca inyecta la credencial allí.
claude doctor marca las entradas de injectHosts que nunca pueden coincidir con la advertencia Sandbox credential injectHosts entries can never match their destination. Esta comprobación requiere Claude Code v2.1.229 o posterior.
A diferencia de deny, el enmascaramiento autoriza al proxy a enviar tu credencial real a los hosts indicados, por lo que Claude Code lo respeta solo desde configuraciones que tú o tu administrador controlan: la configuración de usuario, la configuración administrada y el flag de CLI --settings. Claude Code ignora las entradas mask en el .claude/settings.json o el .claude/settings.local.json de un repositorio. En esos archivos también ignora network.tlsTerminate y credentials.allowPlaintextInject, el ajuste que permite al proxy inyectar credenciales en solicitudes sin cifrar. Si excluyes la configuración de usuario, Claude Code también descarta las entradas mask de variables de entorno en ~/.claude/settings.json.
Cuando tu administrador entrega entradas mask, network.tlsTerminate o credentials.allowPlaintextInject a través de la configuración administrada por el servidor, cuentan como configuraciones que requieren aprobación.
Cuando la misma variable aparece con deny en cualquier alcance, deny tiene precedencia.
De forma predeterminada, el enmascaramiento reemplaza el valor completo de la variable, lo que es adecuado para un token simple. Los campos opcionales de la entrada, que requieren Claude Code v2.1.224 o posterior, manejan valores con estructura:
extract: una expresión regular que Claude Code aplica a todo el valor y que reemplaza solo el texto capturado por el grupo 1 de cada coincidencia, de modo que una herramienta que analiza el valor, como una cadena de conexiónDATABASE_URL, sigue funcionando dentro del sandbox. El patrón debe contener al menos un grupo de captura.onExtractNoMatchcontrola qué ocurre cuando el patrón no coincide con nada:warn, el valor predeterminado, muestra una advertencia y deja pasar la variable sin enmascarardenyelimina la variable dentro del sandboxerrordetiene la configuración del sandbox hasta que corrijas la configuración
decode: "jwt": para una variable que contiene un JSON Web Token (JWT). Claude Code verifica que el valor sea un JWT y lo reemplaza con un token falso estructuralmente válido, de modo que el código dentro del sandbox que decodifica el token sigue funcionando. AgregamaskClaimspara indicar claims de nivel superior del payload que se deben enmascarar individualmente en lugar de reemplazar todo el token; los demás claims siguen siendo legibles. Cuando el valor no se verifica como JWT, o ningún claim indicado coincide, Claude Code deja pasar la variable sin enmascarar con una advertencia.decodeno se puede combinar conextract.
Consulta las filas de credentials.envVars[] en la referencia de configuración para ver la lista completa de campos.
Volver a firmar solicitudes de AWS
Las solicitudes de AWS llevan firmas SigV4 sobre el contenido de la solicitud, así que enmascara AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY juntas. El proxy detecta una solicitud SigV4 por el centinela de la clave de acceso y la vuelve a firmar después de sustituir los valores reales. Enmascarar solo el secreto deja las solicitudes firmadas con el marcador, que el proxy no puede detectar, por lo que fallan en AWS; Claude Code advierte sobre este caso al iniciar, pero no cuando solo se enmascara el ID de la clave de acceso. Una solicitud detectada que el proxy no puede volver a firmar, como una a la que le falta el encabezado x-amz-date, falla con un error del proxy en lugar de llegar al servidor con una firma rota.
Claude Code vincula automáticamente las variables convencionales AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY y AWS_SESSION_TOKEN en una sola credencial cuando enmascaras sus valores completos. Si tu credencial de AWS está en variables con otros nombres, agrúpalas tú mismo con credentials.awsPairs, que requiere Claude Code v2.1.224 o posterior. Este ejemplo agrega el emparejamiento a una configuración que ya enmascara los valores completos de MY_KEY_ID, MY_SECRET_KEY y MY_SESSION_TOKEN, como en la configuración de enmascaramiento anterior:
{
"sandbox": {
"credentials": {
"awsPairs": [
{
"accessKeyIdVar": "MY_KEY_ID",
"secretAccessKeyVar": "MY_SECRET_KEY",
"sessionTokenVar": "MY_SESSION_TOKEN"
}
]
}
}
}
Cada entrada sigue estas reglas:
accessKeyIdVarysecretAccessKeyVarindican las entradas enmascaradas deenvVarsque contienen el ID de la clave de acceso y la clave secreta. El campo opcionalsessionTokenVarindica la entrada que contiene el token de sesión para credenciales temporales; cuando se establece, el proxy envía el token real comox-amz-security-tokenen las solicitudes que vuelve a firmar.- Cada variable indicada debe ser una entrada
maskque enmascare su valor completo, sinextractnidecode. - El proxy vuelve a firmar las solicitudes en los hosts indicados en el
injectHostsde la entrada del ID de la clave de acceso. - Indicar cualquiera de las variables convencionales en un par reemplaza el emparejamiento automático.
Al igual que las entradas mask, awsPairs solo se respeta desde la configuración de usuario, la configuración administrada y el flag de CLI --settings.
Tres formas de solicitud de AWS llevan firmas que el proxy no puede recalcular. Cuando una solicitud de ese tipo está firmada con el marcador de un par enmascarado, el proxy la hace fallar en lugar de reenviar una firma rota; las solicitudes firmadas con credenciales sin enmascarar nunca se ven afectadas. El ajuste credentials.sigv4, que requiere Claude Code v2.1.224 o posterior, flexibiliza esto para cada forma: establecer la clave de una forma en passthrough reenvía la solicitud con su firma derivada del marcador, de modo que la herramienta que llama recibe la respuesta de rechazo propia de AWS en lugar de un error del proxy. Al igual que awsPairs, sigv4 solo se respeta desde la configuración de usuario, la configuración administrada y el flag de CLI --settings.
| Forma de solicitud | Clave de sigv4 |
Por qué el proxy no puede volver a firmarla |
|---|---|---|
| Cargas en streaming aws-chunked | streaming |
Las firmas por fragmento se encadenan a partir de la firma inicial, por lo que volver a firmar requeriría reescribir el cuerpo |
| URL prefirmadas | presigned |
La firma está en la propia URL, sin encabezado Authorization |
| Firmas asimétricas SigV4A | sigv4a |
No hay un HMAC de clave compartida que recalcular |
Enmascarar archivos de credenciales
Las entradas de archivos también aceptan "mode": "mask", que requiere Claude Code v2.1.221 o posterior. Lo que ve un comando aislado en el sandbox depende de la plataforma:
- Linux y WSL2: los comandos aislados en el sandbox leen una copia centinela del archivo, un sustituto en el que el secreto se reemplaza con un valor de marcador, y el proxy del sandbox sustituye el valor real en el tráfico saliente.
- macOS: los comandos aislados en el sandbox no pueden leer el archivo indicado en absoluto. Claude Code no crea ninguna copia centinela ni sustituye nada en el tráfico saliente, por lo que las herramientas que se autentican con el archivo no funcionan dentro del sandbox, el mismo efecto que
deny. A diferencia de una entradadeny, el bloqueo de lectura se mantiene incluso cuando desactivas el aislamiento del sistema de archivos.
En todas las plataformas, Claude Code aplica el requisito de network.tlsTerminate y injectHosts de la misma forma que para las variables de entorno enmascaradas, e ignora la configuración del repositorio de la misma forma. Si excluyes la configuración de usuario, Claude Code mantiene las entradas mask de archivos de ~/.claude/settings.json como restricciones, pero las entradas ya no autorizan al proxy a sustituir el valor real.
El siguiente ejemplo enmascara un token de GitHub almacenado en ~/.config/gh/hosts.yml; el patrón extract, que se explica más abajo, le indica a Claude Code qué parte del archivo es el secreto. En Linux y WSL2, los comandos aislados en el sandbox que leen el archivo obtienen un centinela en lugar del token, y el proxy sustituye el token real en las solicitudes a api.github.com:
{
"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"]
}
]
}
}
}
Para confirmar que la máscara está activa, pídele a Claude que ejecute cat ~/.config/gh/hosts.yml en un comando aislado en el sandbox: en Linux y WSL2 la salida muestra un valor centinela en lugar del token, y en macOS la lectura falla.
En Linux y WSL2, el patrón extract es lo que mantiene legible el resto de hosts.yml. Claude Code aplica la expresión regular a todo el archivo y reemplaza solo el texto capturado por el grupo 1 de cada coincidencia, de modo que gh sigue analizando su configuración y solo el token es un marcador. Usa extract para cualquier archivo estructurado que analicen las herramientas, como .netrc, JSON o YAML; el patrón debe contener al menos un grupo de captura. Sin extract, Claude Code reemplaza todo el contenido del archivo con un único valor centinela, lo que es adecuado para un archivo que contiene un único secreto simple y nada más.
Para un archivo que contiene un JSON Web Token (JWT), establece decode: "jwt" en lugar de extract, o junto con él. decode requiere Claude Code v2.1.224 o posterior. Claude Code encuentra candidatos a JWT con un patrón integrado, o con tu patrón extract cuando está establecido, verifica que cada candidato sea un JWT y lo reemplaza con un token falso estructuralmente válido, de modo que el código que decodifica el token dentro del sandbox sigue funcionando. Agrega maskClaims para enmascarar solo los claims de nivel superior del payload indicados dentro de cada token verificado y dejar legibles los demás claims. Cuando ningún candidato se verifica, o ningún claim indicado coincide, el campo onExtractNoMatch que se describe más abajo determina el resultado, como lo hace para un patrón que no coincide con nada.
Dos campos opcionales ajustan el comportamiento de la búsqueda de coincidencias. Ambos se aplican solo cuando mode es mask y extract o decode está establecido. En macOS, Claude Code aplica las entradas mask como deny antes de que se ejecute el patrón siempre que el aislamiento del sistema de archivos esté activado, por lo que estos campos, y los resultados sin coincidencia que se describen a continuación, solo tienen efecto allí cuando el aislamiento del sistema de archivos está desactivado:
-
onExtractNoMatchcontrola qué ocurre cuando la búsqueda no encuentra nada que enmascarar en el archivo:warn, el valor predeterminado, muestra una advertencia y omite la entrada, de modo que los comandos aislados en el sandbox pueden leer el archivo real sin enmascarar. El valor predeterminado es adecuado para credenciales que pueden estar ausentes legítimamente; si el secreto podría estar presente pero el patrón podría no detectarlo, usadenydenyhace que el archivo no se pueda leererrordetiene la configuración del sandbox hasta que corrijas la configuración
Claude Code trata
denycomoerrorsiempre que el bloqueo de lectura no se aplicaría: cuando desactivas el aislamiento del sistema de archivos y cuando una entrada defilesystem.allowReadvuelve a abrir la ruta del archivo. -
maskDuplicatestambién reemplaza las copias literales de cada valor de credencial enmascarado, una captura deextracto un token verificado pordecode, que se encuentren fuera de los tramos coincidentes, para un secreto que se repite donde la búsqueda no llega. Busca subcadenas sin procesar, por lo que un valor corto o común se reemplazaría en todos los lugares donde aparece; resérvalo para secretos largos y de alta entropía. Valor predeterminado: false.
mask se aplica a un único archivo, así que indica cada archivo de credenciales por separado. Claude Code recurre a deny para una entrada mask que no puede enmascarar de forma segura: una ruta de directorio, un patrón glob, un archivo de más de 8 MiB o un archivo que no es texto UTF-8. Escribe los directorios como entradas deny explícitas; la tabla de Qué configuraciones pueden desactivarlo explica si cada forma fija filesystem.disabled y cómo se comporta con el aislamiento del sistema de archivos desactivado.
Cómo funciona el sandboxing
Aislamiento del sistema de archivos
La herramienta Bash en el sandbox restringe el acceso al sistema de archivos a directorios específicos:
- Comportamiento de escritura predeterminado: acceso de lectura y escritura al directorio de trabajo actual y sus subdirectorios, a cualquier directorio que hayas agregado con
--add-dir,/add-diropermissions.additionalDirectories, además del directorio temporal por usuario al que apunta$TMPDIR - Comportamiento de lectura predeterminado: acceso de lectura a toda la computadora, excepto ciertos directorios denegados. Este valor predeterminado aún permite leer archivos de credenciales, así que protege las credenciales que no quieras que los comandos lean.
- Bloqueo de lectura: con
permissions.blockReadsOutsideWorkingDirectoriesactivado, los comandos en el sandbox también pierden el acceso de lectura a tu directorio home y a los demás directorios que contienen archivos de usuario, salvo las rutas que enumera Comandos en el sandbox bajo el bloqueo. Esa sección también indica cuándo no se aplica esta parte del bloqueo. - Git worktrees: cuando el directorio de trabajo es un worktree de git vinculado, el sandbox también permite escrituras en el directorio
.gitcompartido del repositorio principal para que comandos comogit commitpuedan actualizar las refs y el índice. Las escrituras enhooks/yconfigdentro de ese directorio siguen denegadas.
Para omitir por completo el aislamiento del sistema de archivos y mantener el aislamiento de red, configura sandbox.filesystem.disabled.
Rutas protegidas
Dentro de los directorios en los que los comandos en el sandbox pueden escribir, el sandbox sigue denegando escrituras en los archivos desde los que Claude Code carga configuración y código. Un comando que pudiera editar esos archivos podría otorgarse permisos a sí mismo, o agregar un hook o un servidor MCP que Claude Code ejecute fuera del sandbox. El sistema de permisos tiene sus propias rutas protegidas, que controlan lo que Claude Code aprueba antes de que se ejecute una herramienta; la lista del sandbox se aplica a un comando que ya se está ejecutando. Abarca cuatro grupos de rutas:
- En tu directorio de trabajo y los directorios superiores: los archivos de configuración de
.claude, los directorios.claude/skills,.claude/agents,.claude/commandsy.claude/hooks,.mcp.json, y los archivos que Claude Code ejecuta por sí mismo, como.claude/workflowsy.claude/scheduled_tasks.json - Solo en tu directorio de trabajo: archivos de inicio del shell como
.bashrcy.zshrc,.gitconfig, los directorios.vscodey.idea, yhooksyconfigdentro de.git - Archivos que convertirían tu directorio de trabajo en un repositorio git bare:
HEAD,objectsyrefsen el nivel superior, además de las entradasconfigyhooksexistentes allí cuando hay unHEADjunto a ellas. Un archivo llamadoconfigse deniega incluso sinHEAD. En Linux y WSL2, el sandbox elimina un archivoHEADo un directorioobjectsorefsde nivel superior que aparezca mientras se ejecuta un comando en el sandbox - En
~/.claude, o el directorio al que apuntaCLAUDE_CONFIG_DIR: la mayor parte de su contenido, además de~/.claude.jsony el almacén de credenciales.credentials.json
Si aparece un enlace simbólico en la ruta de un archivo de configuración protegido durante la sesión, el sandbox también deniega las escrituras en el archivo al que apunta, a partir del siguiente comando.
No hay forma de exceptuar una de estas rutas: una entrada allowWrite o una regla de permiso Edit que cubra la ruta no elimina la protección. La única forma de desactivar la protección es filesystem.disabled, que desactiva el aislamiento del sistema de archivos para todas las rutas. Para ver la mayoría de estas rutas resueltas para tu máquina, ejecuta /sandbox y abre la pestaña Config, que las enumera en Denied within allowed, mezcladas con tus propias entradas denyWrite.
Si git merge o git checkout falla con unable to unlink old en una de estas rutas, consulta Solución de problemas.
Aislamiento de red
Un comando en el sandbox no tiene una ruta directa a la red:
- Linux y WSL2: el comando se ejecuta en un espacio de nombres de red separado que no tiene conexión con tu red
- macOS: el framework de sandbox Seatbelt bloquea de forma predeterminada las conexiones distintas de la que va al proxy del sandbox
Claude Code ejecuta el proxy del sandbox en tu máquina, fuera del sandbox, y dirige los comandos hacia él con HTTP_PROXY, HTTPS_PROXY, ALL_PROXY y variables de entorno relacionadas. El proxy compara el nombre de host de cada conexión con tus dominios permitidos y denegados.
Lo que una herramienta puede alcanzar depende de si usa el proxy:
- Herramientas que leen las variables del proxy:
curl,npm,gitsobre HTTPS y herramientas similares se conectan una vez que su host está permitido. Una entrada deallowedDomainssin puerto permite todos los puertos de ese host - Herramientas que ignoran las variables del proxy:
sshsimple, la mayoría de los controladores de bases de datos y herramientas similares no pueden conectarse, ni siquiera a un host permitido. Consulta Un cliente de base de datos u otra herramienta que no es HTTP no logra alcanzar un host permitido - Todo lo que no sea TCP: UDP, HTTP/3 sobre QUIC y herramientas ICMP como
pingno pueden salir del sandbox
Los siguientes ajustes y comportamientos controlan qué hosts permite el proxy:
- Restricciones de dominio: tus dominios permitidos empiezan vacíos. Hosts fuera de tus dominios permitidos explica qué sucede la primera vez que un comando necesita un dominio nuevo.
- Opciones de aprobación: si eliges Yes cuando se te solicita, Claude Code permite el host durante el resto de la sesión actual. Si eliges "Yes, and don't ask again", Claude Code guarda una regla de permiso
WebFetch(domain:...)en tu configuración local, de modo que el host sigue permitido en sesiones futuras. Mientras el sandbox sea obligatorio por el administrador, Claude Code guarda la regla en tu configuración de usuario, donde se aplica en todos los proyectos. - Dominios permitidos previamente: permite dominios previamente con
allowedDomainspara evitar la solicitud por completo. Claude Code también permite previamente los dominios de las reglas de permisoWebFetch(domain:...), como se describe en Reglas de permisos. - Lista de permitidos estricta: si configuras
strictAllowlistentrueen la configuración de usuario, administrada o de--settingsde la CLI, Claude Code deniega a los comandos en el sandbox el acceso a cualquier host fuera de la lista de permitidos en lugar de pedir confirmación. La lista de permitidos esallowedDomainsmás los dominios de las reglas de permisoWebFetch(domain:...), o solo las entradas de la configuración administrada cuandoallowManagedDomainsOnlyestá configurado. Bloqueos que se aplican sin un sandbox obligatorio por el administrador cubre las entradas de un repositorio. Claude Code aplica esto solo a los comandos en el sandbox; las herramientas en proceso comoWebFetchsiguen sus reglas de permisos. Configurarlo en.claude/settings.jsono.claude/settings.local.jsonde un repositorio no tiene efecto. Requiere Claude Code v2.1.219 o posterior. - Bloqueo administrado: si
allowManagedDomainsOnlyestá configurado en la configuración administrada, los dominios no permitidos se bloquean automáticamente en lugar de pedir confirmación, y solo se respetanallowedDomainsy las reglas de permisoWebFetch(domain:...)de la configuración administrada. - Proxy corporativo: cuando tu red requiere que el tráfico saliente pase por un proxy corporativo, configura
HTTPS_PROXY,HTTP_PROXYyNO_PROXYcomo se describe en configuración del proxy, en el bloqueenvde tu configuración para que los agentes en segundo plano también las reciban, o en el entorno desde el que inicias Claude Code. Claude Code aplica la lista de dominios permitidos y luego canaliza las conexiones permitidas a través de ese proxy upstream. Funcionan las URL de proxyhttp://yhttps://, con autenticación básica en la URL si la necesitas.
En una regla WebFetch(domain:...), el sandbox respeta dos formas de comodín: un *. inicial, como *.example.com, y un * solo. La forma * sola requiere Claude Code v2.1.186 o posterior. Un comodín en cualquier otra posición, como WebFetch(domain:example.*), sigue coincidiendo con las solicitudes de fetch pero no tiene efecto en los comandos en el sandbox.
El proxy integrado aplica la lista de permitidos según el nombre de host solicitado y, de forma predeterminada, no termina ni inspecciona el tráfico TLS. El ajuste experimental network.tlsTerminate, disponible en Claude Code v2.1.199 y posterior, hace que el proxy integrado termine TLS por sí mismo, lo cual requieren las entradas de credenciales mask. Consulta Limitaciones de seguridad para conocer las implicaciones del comportamiento predeterminado, y Configuración de proxy personalizado si tu modelo de amenazas requiere inspección de TLS.
Hosts fuera de tus dominios permitidos
Cuando un comando en el sandbox se conecta a un host que no está en tus dominios permitidos, el comando permanece en el sandbox y espera una decisión. En una sesión interactiva de terminal, la decisión depende de tu modo de permisos:
| Modo de permisos | Qué sucede con la conexión |
|---|---|
Modo bypassPermissions, y modo plan con bypass de permisos disponible |
Se permite sin solicitud |
Modo manual, modo acceptEdits y modo plan en otros casos |
Recibes una solicitud |
| Modo automático | Se rechaza a menos que el comando haya listado el host y el clasificador haya aprobado la lista |
Modo dontAsk |
Se rechaza |
Con strictAllowlist o allowManagedDomainsOnly activado, el proxy integrado del sandbox rechaza la conexión en todos los modos de permisos. En el modo bypassPermissions, los hosts fuera de tus dominios permitidos se permiten a menos que uno de ellos esté activado. La vía de escape de reintento sin sandbox explica cuándo un comando puede salir del sandbox en ese modo. Una conexión a un host en deniedDomains también se rechaza en todos los modos de permisos.
Nombres de host que se resuelven en direcciones locales
Después de que un nombre de host pasa la lista de permitidos, el proxy del sandbox lo resuelve y rechaza la conexión cuando el nombre se resuelve solo en direcciones locales. Las direcciones locales incluyen direcciones de loopback como 127.0.0.1, direcciones de enlace local como el endpoint de metadatos en la nube 169.254.169.254, y direcciones asignadas a tu propia máquina. Los nombres localhost y *.localhost pueden resolverse en loopback.
Un nombre de host de intranet permitido que se resuelve en un rango privado como 10.0.0.0/8 se conecta. Para permitir que un nombre se resuelva en una dirección rechazada, agrega esa dirección IP a allowedDomains, como "127.0.0.1:8080".
La comprobación se aplica a nombres de host. Tus dominios permitidos y tu modo de permisos deciden una conexión a una dirección IP. El proxy también omite la comprobación para las conexiones que envía a través de un proxy corporativo upstream, porque ese proxy resuelve el nombre.
Dominios permitidos por comando en el modo automático
En el modo automático con el sandboxing activado, Claude indica en el propio comando los hosts que este necesita en lugar de activar una aprobación de red para cada conexión. Cada comando Bash, PowerShell o Monitor que se ejecuta en el sandbox puede llevar una lista de hosts más allá de la lista de permitidos del sandbox: un dominio como registry.npmjs.org, un comodín como *.pythonhosted.org o una dirección IP, cada uno con un :port opcional. El clasificador revisa los hosts junto con el comando. Requiere Claude Code v2.1.271 o posterior.
Una lista aprobada abre esos hosts solo para ese comando, mientras se ejecute. No se agrega nada a los hosts permitidos de tu sesión ni a tu configuración; el siguiente comando indica sus propios hosts.
Un comando que lleva hosts pasa al clasificador en lugar de ser aprobado por una regla de permisos o por el modo de permiso automático del sandbox. Si una regla ask fuerza una solicitud para el comando, el diálogo de permisos en tu terminal enumera los hosts junto a él, y aprobar allí cubre ambos.
Una lista por comando amplía solo lo que el sandbox deniega de forma predeterminada. Las entradas de deniedDomains siguen bloqueando. Cuando strictAllowlist o allowManagedDomainsOnly bloquea la lista de permitidos, Claude Code rechaza las listas por comando.
Mientras se aplican las listas por comando, Claude Code rechaza una conexión a un host que ningún comando aprobado haya listado, sin solicitud ni comprobación del clasificador. El rechazo indica el host en el resultado del comando, y Claude vuelve a ejecutar el comando con el host agregado.
Direcciones IPv6 en listas de dominios
Las listas de dominios del sandbox son allowedDomains, deniedDomains y las reglas WebFetch(domain:...) que las alimentan. Para que coincida una dirección IPv6 en cualquiera de ellas, escribe el literal entre corchetes: "[::1]" coincide con esa dirección en todos los puertos, y "[::1]:443" coincide con ella solo en el puerto 443. Escribe el puerto como un número de 1 a 65535 sin ceros a la izquierda. La forma entre corchetes requiere Claude Code v2.1.229 o posterior. Antes de v2.1.229, cuando el texto después de los últimos dos puntos de una entrada sin corchetes era un número de puerto, Claude Code lo leía como tal, por lo que ::1:443 indicaba la dirección ::1 en el puerto 443.
Cuando eliges "Yes, and don't ask again" en la solicitud de aprobación de red para una dirección IPv6, Claude Code guarda la regla WebFetch(domain:...) con la dirección entre corchetes, de modo que la regla siga coincidiendo con la dirección en sesiones futuras.
Una entrada sin corchetes con dos o más signos de dos puntos es ambigua: ::1:443 es a la vez una dirección IPv6 completa y una dirección seguida de un puerto. Claude Code aplica las escrituras ambiguas de forma conservadora en lugar de adivinar qué interpretación quisiste decir:
- Listas de denegación: Claude Code deniega todas las interpretaciones con las que se puede analizar la entrada, de modo que se bloquea la interpretación que hayas querido decir. Para una entrada sin ninguna interpretación analizable, Claude Code no bloquea nada.
- Listas de permitidos: Claude Code nunca permite más de lo que escribiste. Reescribe una entrada ambigua a su interpretación de host y puerto cuando esa interpretación se analiza correctamente, y puede descartar la entrada por completo en lugar de ampliar la lista de permitidos.
Ejecuta claude doctor en tu terminal para encontrar las entradas afectadas: la advertencia Sandbox network domain entries have unreliable spellings indica hasta tres de ellas y cuenta el resto. Reescribe cada una en la forma entre corchetes para eliminar la advertencia. La advertencia también indica entradas cuya escritura no es confiable por otros motivos, como @, caracteres de ruta o de consulta, o comodines dentro de corchetes.
Aplicación a nivel del sistema operativo
La herramienta Bash en el sandbox usa primitivas de seguridad del sistema operativo:
- macOS: usa Seatbelt para aplicar el sandbox
- Linux: usa bubblewrap para el aislamiento
- WSL2: usa bubblewrap, igual que Linux
WSL1 no es compatible porque bubblewrap requiere funciones del kernel disponibles solo en WSL2.
También puedes ejecutar el paquete @anthropic-ai/sandbox-runtime por sí solo para envolver el proceso de Claude Code. Consulta Sandbox runtime.
Cómo se relaciona el sandboxing con los permisos y modos de permiso
El sandboxing, las reglas de permiso y los modos de permiso son capas complementarias. Las secciones a continuación cubren cómo el sandbox interactúa con cada una.
Reglas de permiso
Las reglas de permiso y el sandboxing controlan cosas diferentes:
- Reglas de permiso controlan qué herramientas puede usar Claude Code y se evalúan antes de que se ejecute cualquier herramienta. Se aplican a todas las herramientas: Bash, Read, Edit, WebFetch, MCP y otras, excepto que una regla de denegación o solicitud no puede bloquear
EndConversationmientras que cualquier otra herramienta permanezca. - Sandboxing proporciona aplicación a nivel del sistema operativo que restringe lo que los comandos Bash pueden acceder a nivel del sistema de archivos y la red. Se aplica solo a comandos Bash, PowerShell y Monitor y sus procesos secundarios.
Las dos capas también difieren en cómo se aplican. Claude Code evalúa las decisiones de permiso antes de que se ejecute un comando, basándose en la cadena de comando y, en modo automático, el juicio de un clasificador separado sobre si el comando es seguro. El sistema operativo aplica el límite del sandbox en el proceso en ejecución, por lo que se mantiene independientemente de lo que el modelo eligió ejecutar e incluso si un comando permitido hace más de lo que su nombre sugiere.
Las restricciones del sistema de archivos y la red se configuran tanto a través de la configuración del sandbox como de las reglas de permiso:
| Configuración o regla | Qué hace |
|---|---|
sandbox.filesystem.allowWrite |
Otorga acceso de escritura de subproceso a rutas fuera del directorio de trabajo |
sandbox.filesystem.denyWrite y sandbox.filesystem.denyRead |
Bloquea el acceso de subproceso a rutas específicas |
sandbox.filesystem.allowRead |
Permite nuevamente la lectura de rutas específicas dentro de una región denyRead |
sandbox.filesystem.disabled |
Desactiva la capa del sistema de archivos por completo mientras mantiene el aislamiento de red |
Reglas de permitir Edit |
Otorga acceso de escritura a rutas específicas, de la misma manera que sandbox.filesystem.allowWrite |
Reglas de denegar Read y Edit |
Bloquea el acceso a archivos o directorios específicos |
Reglas de permitir y denegar WebFetch(domain:...) |
Controla el acceso al dominio |
allowedDomains del sandbox |
Controla qué dominios pueden alcanzar los comandos Bash |
deniedDomains del sandbox |
Bloquea dominios específicos incluso cuando un comodín allowedDomains más amplio de otra manera los permitiría |
Las rutas y dominios de ambas configuraciones del sandbox y reglas de permiso se fusionan en la configuración final del sandbox.
El directorio de ejemplos del repositorio claude-code incluye configuraciones de configuración de inicio para escenarios de implementación comunes, incluidos ejemplos específicos del sandbox. Úselos como puntos de partida y ajústelos para que se adapten a sus necesidades.
Modos de permiso
/sandbox no es un modo de permiso. Los modos de permiso deciden si se ejecuta una llamada de herramienta y si se le solicita primero, mientras que el sandbox restringe lo que un comando Bash puede acceder una vez que se ejecuta. Difieren en lo que controlan y qué reemplaza la solicitud por acción:
| Qué controla | Qué reemplaza la solicitud | |
|---|---|---|
/sandbox |
Lo que un comando Bash puede acceder una vez que se ejecuta | El límite del sandbox en sí, en modo auto-allow |
| Modo automático | Si se ejecuta cada llamada de herramienta | Un clasificador que revisa acciones |
--dangerously-skip-permissions |
Si se ejecuta cada llamada de herramienta | Nada. Las verificaciones de ruta protegida también se omiten; las acciones que ningún modo auto-aprueba aún se aplican |
El modo auto-allow del sandbox es separado del modo automático: auto-allow aprueba comandos Bash porque el límite del sandbox los contiene, mientras que el modo automático usa un clasificador para revisar acciones. Los dos funcionan independientemente y pueden combinarse, con las excepciones enumeradas en Modos sandbox. Para elegir un límite de aislamiento para ejecuciones desatendidas, consulte Entornos sandbox. Para una tabla de emparejamientos comunes de modo de permiso y sandbox con los indicadores que inician cada uno, consulte Configuraciones comunes.
Configurar el sandbox para tu organización
Los administradores pueden requerir sandboxing para cada usuario, evitar que los desarrolladores amplíen la política y enrutar el tráfico del sandbox a través de un proxy corporativo.
Aplicar sandboxing con configuración administrada
Para requerir el sandbox para cada desarrollador, entrega las claves sandbox a través de la configuración administrada, ya sea como un archivo administrado por tu MDM o a través de la configuración administrada por servidor en claude.ai.
La siguiente configuración administrada habilita el sandbox, se niega a iniciar Claude Code cuando la plataforma no es compatible o falta una dependencia, y evita que el modelo reintente comandos fuera del sandbox:
{
"sandbox": {
"enabled": true,
"failIfUnavailable": true,
"allowUnsandboxedCommands": false
}
}
Las dos claves más allá de enabled controlan qué sucede cuando el sandbox no puede ejecutar un comando:
failIfUnavailable: una dependencia faltante como bubblewrap en Linux impide que Claude Code se inicie en lugar de volver a la ejecución sin aislarallowUnsandboxedCommands: false: Claude Code ignora la salida de emergenciadangerouslyDisableSandbox, por lo que cuando un comando falla bajo el sandbox, Claude no puede reintentarlo sin aislar
Considera estas adiciones junto con ellas:
- Agrega
excludedCommandspara cualquier herramienta aprobada por la organización que deba ejecutarse sin aislamiento, porque esta configuración impide que la configuración de un repositorio saque comandos del sandbox - Agrega entradas
sandbox.credentialspara directorios de credenciales como~/.awsy~/.sshy para variables de entorno secretas, ya que la política de lectura predeterminada aún las permite
Esta configuración aísla los comandos que ejecuta Claude. Un desarrollador aún puede escribir un comando en el prompt del modo shell ! y ejecutarlo fuera del sandbox, con el mismo acceso que ya tiene en cualquier terminal fuera de Claude Code. Consulta el modo de sandbox estricto para las sesiones donde los comandos escritos se ejecutan aislados.
El sandbox no se ejecuta en Windows nativo, por lo que con failIfUnavailable establecido, Claude Code se cierra al iniciar en esas máquinas. Si tu flota incluye hosts de Windows, puedes:
- Entregar la configuración por sistema operativo: impleméntala a través de tu MDM o como un archivo de configuración administrada solo en máquinas macOS y Linux. La configuración administrada por servidor se aplica a todos los usuarios de la organización
- Mover a los usuarios de Windows a un entorno compatible: haz que ejecuten Claude Code dentro de WSL2 o un contenedor
Evitar que los desarrolladores amplíen la política
Cuando la configuración administrada establece una clave booleana como enabled o failIfUnavailable, Claude Code usa el valor administrado e ignora cualquier cosa que un desarrollador establezca localmente. Para claves de array como allowRead, Claude Code combina las entradas de los alcances que carga la sesión, por lo que un desarrollador puede agregar entradas que amplíen la política, a menos que un bloqueo cubra esa clave.
A menos que la configuración administrada las establezca, la configuración de usuario de un desarrollador o --settings pueden activar las siguientes claves. El .claude/settings.json de un repositorio también puede hacerlo, a menos que el sandbox sea requerido por el administrador. Cada una debilita el sandbox, así que establécela en false en la configuración administrada si no quieres que se use:
enableWeakerNestedSandboxenableWeakerNetworkIsolationnetwork.allowAllUnixSocketsnetwork.allowLocalBindingallowAppleEvents, que un repositorio no puede activar
Establece allowManagedReadPathsOnly en true en la configuración administrada para que solo se respeten las entradas allowRead de la configuración administrada. Esto evita que los desarrolladores amplíen el acceso de lectura más allá de las rutas aprobadas por la organización.
Para bloquear los dominios de red a los valores administrados de la misma manera, establece allowManagedDomainsOnly. Con el bloqueo activado, solo la configuración administrada puede establecer un puerto de proxy.
Cuando la configuración administrada configura sandbox.filesystem o enumera cualquier entrada sandbox.credentials.files con "mode": "deny", solo la configuración administrada puede establecer filesystem.disabled, por lo que los desarrolladores no pueden desactivar las restricciones del sistema de archivos implementadas por el administrador. Si una entrada mask fija la clave depende de cómo se resuelva; la tabla bajo Qué configuración puede desactivarla cubre los cuatro casos.
Configuración del repositorio con un sandbox requerido por el administrador
El sandbox es requerido por el administrador mientras uno de estos ajustes esté en vigor:
allowUnsandboxedCommandsestablecido enfalseen la configuración administrada, o con el flag--settingsa menos que la configuración administrada lo establezca entrueallowManagedDomainsOnlyestablecido entrueen la configuración administrada
Estos ajustes no activan el sandbox, así que establece también enabled.
Mientras el sandbox es requerido por el administrador, Claude Code toma los ajustes que lo flexibilizan solo de la configuración administrada, el flag --settings y el ~/.claude/settings.json de cada desarrollador. Ignora estos ajustes en el .claude/settings.json y el .claude/settings.local.json de un repositorio:
| Ajuste del repositorio | Lo que Claude Code ignora |
|---|---|
excludedCommands, ignoreViolations, network.allowedDomains, network.allowUnixSockets, network.allowMachLookup, network.httpProxyPort, network.socksProxyPort |
Todas las entradas |
filesystem.allowWrite, reglas de permiso Edit(...), permissions.additionalDirectories |
El acceso de escritura que cada entrada otorga a los comandos aislados. Las herramientas de archivos de Claude siguen respetando las reglas Edit(...) y los directorios adicionales |
Reglas de permiso WebFetch(domain:...) |
El host que cada regla agrega a la lista de permitidos del sandbox. La herramienta WebFetch sigue respetando la regla |
enableWeakerNestedSandbox, enableWeakerNetworkIsolation, network.allowAllUnixSockets, network.allowLocalBinding |
true. Un false sigue aplicándose |
enabled, failIfUnavailable |
false, cuando el ~/.claude/settings.json del desarrollador establece true |
filesystem.allowRead |
Una entrada en o bajo una ruta cuya lectura deniegan la configuración administrada, --settings o la configuración de usuario, o un glob que podría coincidir con una |
Estos ajustes siguen aplicándose mientras el sandbox es requerido por el administrador:
- En los archivos de un repositorio: las entradas de denegación y el valor de
autoAllowBashIfSandboxed. Establece la clave en la configuración administrada para evitar que un repositorio la cambie - En la configuración propia de un desarrollador: los ajustes de la tabla siguen aplicándose desde
~/.claude/settings.jsono--settings, a menos que un bloqueo solo administrado comoallowManagedDomainsOnlylos cubra. La mayoría de ellos, comoexcludedCommandsyfilesystem.allowWrite, no tienen un bloqueo solo administrado
La configuración en Aplicar sandboxing con configuración administrada hace que el sandbox sea requerido por el administrador. Agrega a la configuración administrada las entradas de excludedCommands, allowWrite y sockets que necesitan tus herramientas aprobadas, porque un repositorio no puede proporcionarlas.
Requiere Claude Code v2.1.285 o posterior. De v2.1.282 a v2.1.284, los mismos ajustes hacían que Claude Code ignorara las entradas excludedCommands de un repositorio.
Bloqueos que se aplican sin un sandbox requerido por el administrador
Algunos ajustes hacen que Claude Code ignore las claves del repositorio que sobrescriben directamente una restricción, incluso cuando el sandbox no es requerido por el administrador. Cada uno tiene este efecto solo cuando lo estableces en un archivo que nombra su fila, y los demás ajustes del sandbox del repositorio siguen aplicándose. Requiere Claude Code v2.1.285 o posterior.
| Ajuste | Dónde lo estableces | Lo que Claude Code ignora en la configuración de un repositorio |
|---|---|---|
network.deniedDomains o una regla de denegación WebFetch(domain:...) |
Configuración administrada, --settings |
httpProxyPort y socksProxyPort |
network.strictAllowlist |
Configuración administrada, --settings, configuración de usuario |
Los puertos de proxy, allowedDomains y las reglas de permiso WebFetch(domain:...) |
filesystem.denyRead, una regla de denegación Read(...) o una entrada credentials.files |
Configuración administrada, --settings |
Una entrada allowRead, allowWrite, de permiso Edit(...) o additionalDirectories en o bajo una ruta cuya lectura deniegan la configuración administrada, --settings o la configuración de usuario, o un glob que podría coincidir con una |
Estos bloqueos cambian lo que pueden alcanzar los comandos aislados. La herramienta WebFetch y las herramientas de archivos de Claude siguen respetando las reglas y los directorios adicionales de un repositorio.
Configuración de proxy personalizado
Para inspeccionar, filtrar o registrar el tráfico del sandbox con tus propias herramientas, reemplaza el proxy integrado del sandbox por un proxy que ejecutes en la misma máquina.
Para enrutar el tráfico del sandbox a través de un proxy corporativo ubicado en otra parte de tu red, establece HTTPS_PROXY en su lugar, como describe la entrada Proxy corporativo en Aislamiento de red. De esa manera, la lista de permitidos de Claude Code sigue aplicándose.
Para dirigir los comandos aislados a tu proxy, establece los puertos de localhost en los que escucha en la configuración del sandbox:
{
"sandbox": {
"network": {
"httpProxyPort": 8080,
"socksProxyPort": 8081
}
}
}
Si estableces un puerto y también estableces HTTPS_PROXY o HTTP_PROXY, Claude Code no reenvía lo que los comandos aislados envían a tu proxy hacia el proxy que nombran esas variables. Para llegar a un proxy corporativo, configura tu propio proxy para que reenvíe a él.
Qué archivos pueden establecer un puerto depende de tus demás ajustes del sandbox:
allowManagedDomainsOnlyestá activado: solo la configuración administrada- El sandbox es requerido por el administrador, o se aplica un bloqueo de red más limitado: la configuración administrada,
--settingsy la configuración de usuario - En cualquier otro caso: cualquier archivo de configuración
Claude Code ignora un puerto establecido en cualquier otro lugar. Antes de v2.1.285, cualquier archivo de configuración podía establecer un puerto.
Una vez que se aplica cualquiera de los puertos, tu proxy es responsable de filtrar todo lo que se le envía. Los controles de red propios de Claude Code, como allowedDomains, deniedDomains, strictAllowlist, las solicitudes de aprobación y la verificación de direcciones locales, dejan de aplicarse a ese tráfico. Un comando aislado puede conectarse a cualquiera de los dos proxies, así que si estableces solo un puerto, las listas de dominios de Claude Code en el otro proxy no limitan lo que el comando alcanza a través del tuyo.
Solución de problemas
Algunos comandos fallan dentro del sandbox aunque funcionen fuera de él. La siguiente lista cubre correcciones breves. Las fallas que necesitan una explicación más larga tienen cada una su propio encabezado.
Si el sandbox de tu organización es obligatorio por parte del administrador, Claude Code ignora los ajustes que mencionan estas correcciones en los archivos de configuración de un proyecto, así que guárdalos en ~/.claude/settings.json, donde se aplican en todos los proyectos. Si una corrección sigue sin tener efecto, es posible que la configuración administrada de tu organización establezca esa clave.
Una corrección que agrega un patrón a excludedCommands quita el sandbox de los comandos que coinciden con el patrón. Consulta qué puede hacer un comando excluido.
-
Los comandos fallan con un error de host no permitido: muchas herramientas CLI necesitan alcanzar hosts específicos. Aprueba el host cuando se te solicite, o agrégalo a
allowedDomains. Si tu organización bloquea la lista de dominios permitidos conallowManagedDomainsOnly, no hay solicitud, así que pide a tu administrador que agregue el host. -
jestse cuelga o falla:watchmanes incompatible con el sandbox. Ejecutajest --no-watchmanen su lugar. -
Las CLI basadas en Go fallan en la verificación de TLS en macOS: herramientas como
gh,gcloudyterraformpueden fallar en la verificación de TLS bajo Seatbelt. Agrega un patrón para cada herramienta, comogh *, aexcludedCommands. La herramienta se ejecuta entonces con tu acceso completo y sus credenciales almacenadas. Si estás usandohttpProxyPortcon un proxy MITM y CA personalizado, estableceenableWeakerNetworkIsolationentrueen su lugar. -
open,osascripto los flujos de autenticación basados en navegador fallan con el error-600en macOS: el sandbox bloquea Apple Events de forma predeterminada. EstableceallowAppleEventsentrueen tu configuración de usuario, administrada o CLI para permitirlos. La configuración del proyecto se ignora para esta clave. Habilitarlo elimina el aislamiento de ejecución de código, ya que los comandos aislados pueden entonces lanzar otras aplicaciones sin aislar sin solicitud del usuario y enviar comandos AppleScript a aplicaciones en ejecución, sujeto a la solicitud de consentimiento de automatización de macOS (TCC). Alternativamente, agrega un patrón comoopen *aexcludedCommands. Cada llamada aopenpasa entonces por el flujo de permisos, yopenpuede lanzar cualquier archivo o aplicación, incluido uno que Claude haya escrito. -
Los comandos
dockerfallan:dockeres incompatible con el sandbox. Saca del sandbox los comandosdockerque necesites con un patrón deexcludedCommandscomodocker compose *. Esa sección explica a qué puede acceder un comandodockerexcluido. Un patrón más específico saca menos comandos del sandbox. -
pbcopy,xclipowl-copyno actualiza el portapapeles: estas utilidades de portapapeles pueden fallar al alcanzar el portapapeles del sistema desde dentro del sandbox, en cuyo caso el texto canalizado hacia ellas no llega.Para poner la salida de Claude en tu portapapeles, pide a Claude que la imprima en su respuesta, luego ejecuta
/copy./copyescribe en el portapapeles desde el proceso Claude Code en lugar de desde un comando aislado.Cuando Claude canaliza texto a una de estas herramientas, agregar la herramienta a
excludedCommandsno saca esa llamada del sandbox por sí sola. -
Un comando git falla con
unable to unlink old:git merge,git checkouty comandos similares fallan de esta manera cuando necesitan reemplazar un archivo al que el sandbox deniega escrituras, ya sea que ese archivo esté bajo una ruta protegida como.claude/skills, bajo una de tus entradasdenyWrite, o fuera de los directorios en los que el sandbox permite que los comandos escriban en absoluto. En Linux y WSL2 el error termina conRead-only file system.Después de la falla, Claude puede ofrecer ejecutar nuevamente el comando fuera del sandbox; aprueba ese reintento o ejecuta el comando git tú mismo en otra terminal. Si has establecido
allowUnsandboxedCommandsenfalse, Claude no puede ofrecer el reintento, así que ejecuta el comando tú mismo. -
Bubblewrap falla al iniciarse dentro de un contenedor: en un contenedor sin privilegios, bubblewrap no puede montar un sistema de archivos
/procnuevo, por lo que los comandos aislados fallan con un errorbwrapcomoCan't mount proc on /newroot/proc: Operation not permitted. EstableceenableWeakerNestedSandboxentruepara que el sandbox interno monte el/procexistente del contenedor en su lugar. Solo usa este ajuste cuando el contenedor externo ya proporcione el límite de aislamiento que necesitas, ya que expone información de proceso a comandos aislados que un montaje/procnuevo ocultaría. -
Los archivos de solo lectura de 0 bytes aparecen en las rutas de configuración
.claude, y "Sí, y no preguntar de nuevo" no guarda: en Linux y WSL2, el sandbox mantiene una denegación de escritura en un archivo que aún no existe creando un marcador de posición de solo lectura de 0 bytes allí mientras se ejecuta un comando aislado. El sandbox elimina el marcador de posición después. Si una sesión se mata antes de que se ejecute esa limpieza, por ejemplo por SIGKILL, los marcadores de posición permanecen. Las sesiones posteriores los vinculan de solo lectura nuevamente en cada inicio, por lo que una escritura de configuración como guardar una opción de permiso falla donde se encuentra uno.Ejecuta
claude doctorpara enumerar los archivos de marcador de posición restantes. La advertenciaStale sandbox mask files left by a killed sessionnombra hasta tres de ellos y cuenta el resto. Elimina cada archivo conrmmientras no se ejecute ninguna otra sesión de Claude Code en ese proyecto. Antes de v2.1.257, Claude Code dejaba los mismos marcadores de posición sin marcarlos. -
--dangerously-skip-permissionsfalla como root: este flag se bloquea cuando se ejecuta como root o a través de sudo en Linux y macOS, porque el acceso root combinado sin solicitudes de permiso puede modificar cualquier archivo o servicio en el sistema. La verificación se omite automáticamente dentro de un sandbox reconocido. Para ejecutar de manera autónoma en un contenedor, usa la configuración contenedor de desarrollo, que ejecuta Claude Code como un usuario no root.
`git` sobre SSH falla con el sandbox activado
En macOS, git fetch, git pull y git push contra un remoto SSH fallan dentro del sandbox incluso cuando el host está permitido. En Linux y WSL2, funcionan una vez que el host está permitido. Claude Code canaliza la conexión SSH de git a través del proxy del sandbox, y el túnel de macOS no puede autenticarse ante ese proxy.
En Linux y WSL2, revisa lo siguiente si la conexión sigue fallando:
- El host está permitido en el puerto 22: una entrada de
allowedDomainssin puerto, como"git.example.com", lo cubre - Tu proxy corporativo permite el puerto 22: si tu red requiere un proxy ascendente, el túnel también pasa por él
- La clave se puede leer como archivo: el sandbox puede bloquear el socket de
ssh-agent, y una entradadenyReadocredentialspara~/.sshoculta tus archivos de clave
En macOS, cambia el remoto a HTTPS, lo que requiere credenciales HTTPS como un token de acceso personal:
git remote set-url origin https://git.example.com/example-org/example-repo.git
Si tienes que mantener el remoto SSH, saca los comandos de red de git del sandbox con excludedCommands:
{
"sandbox": {
"excludedCommands": ["git fetch *", "git pull *", "git push *"]
}
}
Estas entradas coinciden con git push origin main. Una llamada que agrega un cd, usa git -C o contiene una sustitución de comandos permanece en el sandbox. Los comandos git excluidos pueden alcanzar cualquier host, no solo los que están en allowedDomains.
ssh, scp y rsync sobre SSH por sí solos fallan por la razón que indica la entrada del cliente de base de datos.
Un cliente de base de datos u otra herramienta no HTTP no logra alcanzar un host permitido
Una herramienta que ignora las variables de entorno del proxy no puede conectarse desde dentro del sandbox, ni siquiera a un host que esté en allowedDomains. Un comando aislado no tiene una ruta directa a la red, por lo que una herramienta que abre su propia conexión falla. La mayoría de los controladores de bases de datos, ssh por sí solo y las herramientas que usan UDP se comportan de esta manera.
La falla se ve como un error de red o de resolución de nombres:
- macOS:
Operation not permitted, o un error de resolución de nombres comoCould not resolve host - Linux y WSL2:
Network is unreachable, o un error de resolución de nombres comoTemporary failure in name resolution
Una herramienta que usa el proxy falla de otra manera cuando su host no está permitido. Recibes una solicitud de red, o la herramienta recibe una respuesta 403 del proxy.
Para permitir que la herramienta se conecte, ejecuta el comando que la necesita fuera del sandbox con excludedCommands. Este ejemplo excluye un script y agrega una regla ask para que apruebes cada ejecución:
{
"sandbox": {
"excludedCommands": ["python scripts/load_orders.py *"]
},
"permissions": {
"ask": ["Bash(python scripts/load_orders.py *)"]
}
}
El script se ejecuta con tu acceso completo, y Claude puede editar un script que esté dentro de tu directorio de trabajo, así que revísalo cuando aparezca la solicitud.
Un comando no logra alcanzar un servidor en localhost
De forma predeterminada, un comando aislado no puede conectarse directamente a un servidor que se ejecuta en tu máquina fuera del sandbox, como un servidor de desarrollo o una base de datos en un contenedor. Lo que puedes cambiar depende de tu plataforma:
- macOS: establece
network.allowLocalBindingentrue. Los comandos aislados pueden entonces escuchar en puertos de red y conectarse a cualquier puerto en localhost, lo que incluye todos los demás servicios que escuchan allí. Un servicio de localhost que no requiere autenticación, como un depurador, puede entonces actuar en nombre del comando fuera del sandbox, y un comando que escucha en una dirección que no es de loopback acepta conexiones de otras máquinas - Linux y WSL2: el
localhostde un comando aislado es privado para ese comando. El comando puede escuchar en un puerto y alcanzar servidores que él mismo inició. Una conexión directa alocalhosto127.0.0.1no alcanza los servidores del host, yallowLocalBindingno tiene efecto. Ejecuta el comando que necesita el servidor del host fuera del sandbox conexcludedCommands, donde no tiene límites de sistema de archivos ni de red. Para conexiones que pasan por el proxy del sandbox, consulta Nombres de host que se resuelven en direcciones locales
Este ejemplo activa el ajuste para macOS:
{
"sandbox": {
"network": {
"allowLocalBinding": true
}
}
}
Una entrada de allowedDomains para localhost se aplica a las conexiones que pasan por el proxy, por lo que no cambia una conexión directa. Claude Code establece NO_PROXY para los comandos aislados de modo que se conecten a localhost directamente en lugar de a través del proxy. La entrada también expone todos los puertos del localhost de tu máquina a un comando que sí usa el proxy. Para un nombre de host de desarrollo que apunta a 127.0.0.1, consulta Un nombre de host permitido se rechaza con resolved to a loopback address.
Un nombre de host permitido se rechaza con `resolved to a loopback address`
El proxy del sandbox rechaza un nombre de host permitido que se resuelve en una dirección local, lo que afecta a nombres de desarrollo como myapp.test que apuntan a 127.0.0.1. El comando ve una respuesta 403 cuyo cuerpo indica el tipo de dirección, como Connection to myapp.test blocked: resolved to a loopback address.
Agrega la dirección IP en la que se resuelve el nombre junto al nombre de host en allowedDomains, cada uno con el puerto en el que escucha tu servidor:
{
"sandbox": {
"network": {
"allowedDomains": ["myapp.test:3000", "127.0.0.1:3000"]
}
}
}
Una entrada de dirección IP sin puerto permite que los comandos aislados alcancen todos los servicios que escuchan en esa dirección.
Antes de v2.1.284, el proxy se conectaba a cualquier dirección en la que se resolviera un nombre de host permitido.
`/sandbox` falla con `Sandbox settings are overridden by a higher-priority configuration`
/sandbox imprime Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally. en lugar de abrir su panel cuando un nivel de configuración superior establece sandbox.enabled, sandbox.autoAllowBashIfSandboxed o sandbox.allowUnsandboxedCommands. El panel guarda tus elecciones en .claude/settings.local.json, y un valor guardado allí no puede sobrescribir esos niveles.
La configuración administrada y --settings tienen prioridad sobre la configuración local. Para ver cuáles de ellas cargó esta sesión, ejecuta /status y lee la línea Setting sources:
Command line arguments: si iniciaste Claude Code con--settings, comprueba si el archivo o JSON que pasaste establece una de esas claves. Si es así, cambia el valor allí, o inicia Claude Code de nuevo sin esas claves.Enterprise managed settings: la configuración administrada de tu organización está cargada. Si establece una de esas claves, no puedes cambiar esa clave desde/sandboxni desde ningún archivo de configuración que controles, así que consulta a tu administrador.
Limitaciones
El sandboxing reduce el riesgo pero no es un límite de aislamiento completo. Revisa las limitaciones a continuación antes de confiar en él como un control de seguridad duro.
Limitaciones de seguridad
- Filtrado de red: el sandbox restringe los dominios a los que se permite que se conecten los procesos. De forma predeterminada, el proxy integrado no termina ni inspecciona TLS en el tráfico saliente, por lo que el contenido de las conexiones cifradas no se examina. El ajuste experimental
network.tlsTerminatetermina TLS en el proxy para sustitución de credencialesmaskpero no añade filtrado de contenido. Eres responsable de asegurarte de que solo se permitan dominios confiables en tu política.
Permitir dominios amplios como github.com puede crear caminos para exfiltración de datos. Porque el proxy toma su decisión de permitir del nombre de host suministrado por el cliente sin inspeccionar TLS, el código que se ejecuta dentro del sandbox puede potencialmente usar domain fronting o técnicas similares para alcanzar hosts fuera de la lista de permitidos. Si tu modelo de amenaza requiere garantías más fuertes, configura un proxy personalizado que termine TLS e inspeccione tráfico, e instala su certificado CA dentro del sandbox. El aislamiento de red consciente de TLS más fuerte es un área activa de desarrollo.
- Escalada de privilegios a través de sockets Unix: la configuración
allowUnixSocketspuede otorgar inadvertidamente acceso a servicios del sistema que podrían llevar a omisiones del sandbox. Por ejemplo, permitir acceso a/var/run/docker.sockefectivamente otorga acceso al sistema host a través del socket de Docker. Considera cuidadosamente cualquier socket Unix que permitas a través del sandbox. - Escalada de permisos del sistema de archivos: los permisos de escritura del sistema de archivos demasiado amplios pueden permitir ataques de escalada de privilegios. Permitir escrituras en directorios que contienen ejecutables en
$PATH, directorios de configuración del sistema o archivos de configuración de shell del usuario como.bashrco.zshrcpuede llevar a ejecución de código en diferentes contextos de seguridad cuando otros usuarios o procesos del sistema acceden a estos archivos. - Fortaleza del sandbox de Linux: la implementación de Linux proporciona un fuerte aislamiento del sistema de archivos y la red pero incluye un modo
enableWeakerNestedSandboxque le permite funcionar dentro de entornos Docker sin espacios de nombres privilegiados. Esta opción debilita considerablemente la seguridad y solo debe usarse cuando se aplica aislamiento adicional de otra manera. - Apple Events en macOS: el sandbox de macOS bloquea Apple Events de forma predeterminada. El ajuste
allowAppleEventslevanta esta restricción para que herramientas comoopenyosascriptfuncionen, pero elimina el aislamiento de ejecución de código: los comandos aislados pueden lanzar otras aplicaciones sin aislar sin solicitud del usuario, y pueden enviar comandos AppleScript a aplicaciones en ejecución, sujeto a la solicitud de consentimiento de automatización por aplicación de macOS (TCC). Solo se honra desde configuración de usuario, administrada o CLI. La configuración del proyecto no puede habilitarlo.
Compatibilidad de plataforma y herramienta
- Soporte de plataforma: admite macOS, Linux y WSL2. WSL1 y Windows nativo no son compatibles.
- Sobrecarga de rendimiento: mínima, pero algunas operaciones del sistema de archivos pueden ser ligeramente más lentas.
- Compatibilidad de herramienta: algunas herramientas que requieren patrones de acceso específicos del sistema pueden necesitar ajustes de configuración, o pueden necesitar ejecutarse fuera del sandbox.
Alcance
El sandbox aísla los comandos de shell y sus procesos hijos. Qué se ejecuta fuera del sandbox enumera las herramientas y los procesos auxiliares que no cubre. El uso de computadora y los subagentes se relacionan con el sandbox de la siguiente manera:
- Uso de computadora: cuando Claude abre aplicaciones y controla tu pantalla, se ejecuta en tu escritorio real en lugar de en un entorno aislado. Las solicitudes de permiso por aplicación controlan cada aplicación. Consulta uso de computadora en la CLI o uso de computadora en Desktop.
- Subagentes: los subagentes se ejecutan en el mismo proceso que la sesión padre y usan la misma configuración de sandbox. Los comandos Bash dentro de un subagente están aislados cuando el sandboxing está habilitado en la sesión padre.
- Mods: un mod es un plugin que ejecuta su propio código dentro de Claude Code, y un proceso que inicia un mod se ejecuta fuera del sandbox. Consulta Qué puede alcanzar un mod.
El sandboxing efectivo requiere tanto aislamiento del sistema de archivos como de la red. Sin aislamiento de red, un agente comprometido podría exfiltrar archivos sensibles como claves SSH. Sin aislamiento del sistema de archivos, ya sea por una política permisiva o por deshabilitar la capa del sistema de archivos, un agente comprometido podría instalar una puerta trasera en recursos del sistema para obtener acceso a la red. Cuando amplíes los valores predeterminados, verifica que una ruta allowWrite, una entrada allowedDomains amplia o una excepción excludedCommands no deshaga una restricción en el otro lado.
Ver también
- Entornos sandbox: comparar el sandbox integrado con contenedores de desarrollo, contenedores y máquinas virtuales
- Seguridad: características de seguridad integral y mejores prácticas
- Permisos: configuración de permisos y control de acceso
- Toda la configuración: cada clave de configuración
- Referencia de CLI: opciones de línea de comandos