C Claude Code Internals
EN | ES

Seguridad Bash

El sistema de seguridad Bash opera con 5 capas independientes de defensa en profundidad. Aunque una capa sea eludida, las demás continúan bloqueando ataques — desde validadores de inyección y restricciones de rutas hasta aislamiento en sandbox y limpieza de variables de entorno.

5 capas de defensa 22+ validadores de seguridad 12 principios de diseño 3 plataformas sandbox
! Defensa en profundidad — no es una única verificación
Cada capa opera de forma independiente. La capa de validadores captura inyección, la de permisos aplica reglas allow/deny, la de rutas previene traversal, la del sistema de archivos bloquea archivos protegidos, y el sandbox restringe la superficie a nivel de OS. Las 5 se ejecutan en cada comando.

Arquitectura — 5 Capas

1
Validadores de Seguridad — 22+ verificaciones: inyección, metacaracteres, ataques de misparsing
2
Sistema de Permisos — Reglas allow/deny, detección de solo lectura, coincidencia por prefijo
3
Validación de Rutas — Extracción de rutas por comando, prevención de traversal
4
Permisos de Sistema de Archivos — Archivos/dirs protegidos, resolución de symlinks, normalización de mayúsculas
5
Sandbox — seatbelt (macOS) / bubblewrap (Linux), restricción de sistema de archivos + red

Pipeline de Ejecución de Comandos

1. El modelo emite tool_use: Bash({ command: "..." })
2. checkPermissions() → bashToolHasPermission() (Capas 1–4)
3. Si permitido → call() → runShellCommand() → exec()
4. exec() resuelve el proveedor de shell ($SHELL: zsh / bash / sh)
5. Opcionalmente envolver con SandboxManager.wrapWithSandbox()
6. spawn() proceso hijo (detached: true, entorno personalizado)
7. Salida en archivo: O_APPEND (atómico) + O_NOFOLLOW (protección symlink)
8. Capturar stdout/stderr, aplicar truncado, devolver resultado

Variables de entorno inyectadas

SHELLRuta del binario del shell
GIT_EDITOR'true' — previene editores git interactivos
CLAUDECODE'1' — señaliza a CLIs que están dentro de Claude Code
CLAUDE_CODE_SESSION_IDID de sesión (solo usuarios internos)

Sistema de timeouts

Reporte de progreso empieza después de 2.000ms
Presupuesto de auto-background: 15.000ms
sleep está en DISALLOWED_AUTO_BACKGROUND_COMMANDS — nunca se manda al fondo

Validadores de Seguridad (22+)

Validadores tempranos (cortocircuito en allow)

# Validador Qué captura
1validateEmptyComandos vacíos → allow
2validateIncompleteCommandsFragmentos que empiezan con tabs, flags, operadores
3validateSafeCommandSubstitutionPatrones seguros heredoc-in-substitution
4validateGitCommitgit commit con mensajes simples entre comillas

Validadores principales — ataques de misparsing

# Validador Qué captura
5validateJqCommandsystem(), -f/--from-file
6validateObfuscatedFlagsCaracteres entre comillas en nombres de flags
7validateShellMetacharacters;, |, & en argumentos
8validateDangerousVariablesVariables en contextos de redirección/pipe
9validateCommentQuoteDesync# causando desincronización en seguimiento de comillas
10validateQuotedNewlineSaltos de línea dentro de comillas que dividen comandos
11validateCarriageReturnDiferencial de tokenización CR shell-quote / bash
12validateNewlinesSaltos de línea separando comandos (no misparsing)
13validateIFSInjectionUso de variable $IFS
14validateProcEnvironAccessAcceso a /proc/*/environ
15validateDangerousPatternsBackticks, $(), $${}, $[], expansiones Zsh
16validateRedirectionsRedirecciones de entrada < y salida > (no misparsing)
17validateBackslashEscapedWhitespaceBypasses con barra invertida-espacio
18validateBackslashEscapedOperators\;, \| etc.
19validateUnicodeWhitespaceCaracteres de espacio no ASCII
20validateMidWordHash# adyacente a comillas
21validateBraceExpansionPatrones de expansión de llaves {a,b}
22validateZshDangerousCommandszmodload, emulate, sysopen, etc. (20 cmds)
23validateMalformedTokenInjectionDelimitadores desbalanceados + separadores (bypass eval en HackerOne)

Misparsing vs no-misparsing

Validadores de misparsing

Sus resultados ask activan isBashSecurityCheckForMisparsing: true, causando bloqueo temprano en el flujo de permisos. Capturan ataques que explotan diferencias entre cómo el parser de seguridad y bash real tokenizan comandos.

Validadores no-misparsing

validateNewlines y validateRedirections — sus resultados se difieren para que los validadores de misparsing se ejecuten primero.

Extracción de comillas — 3 vistas

Vista Qué hace
withDoubleQuotesContenido entre comillas simples eliminado, dobles preservadas
fullyUnquotedTodo el contenido entre comillas eliminado
unquotedKeepQuoteCharsContenido eliminado pero delimitadores de comillas preservados

Eliminación de redirecciones seguras

stripSafeRedirections() elimina patrones conocidos como seguros:

2>&1 (stderr a stdout)
>/dev/null o 2>/dev/null
</dev/null (stdin vacío)

Cada patrón requiere límite final (?=\s|$) para prevenir ataques de prefijo (ej. >/dev/nullo escribiría en el archivo nullo).

Flujo de Permisos y Comandos de Solo Lectura

bashToolHasPermission() — pipeline de 8 pasos

1.
checkPermissionMode() — acceptEdits → auto-allow mkdir, touch, rm, etc.
2.
checkReadOnlyConstraints() — Parsear comando → si es solo lectura → allow
3.
bashCommandIsSafeAsync() — Ejecutar 22+ validadores → cualquier "ask" → bloquear con razón
4.
checkPathConstraints() — Extraer rutas → validar dentro de directorios permitidos
5.
checkSedConstraints() — Manejo especial para sed -i ediciones in-place
6.
Coincidencia de reglas — Verificar reglas allow (prefijo), verificar reglas deny
7.
Sandbox auto-allow — Si sandboxed + autoAllowBashIfSandboxed → allow
8.
Clasificador ML (feature-gated) — Solo ANT: modelo clasificador bash → allow/deny

Manejo de comandos compuestos

Comandos con &&, ||, ;, | se dividen mediante splitCommand_DEPRECATED(). Límite de 50 subcomandos previene agotamiento de CPU. Si algún subcomando falla → todo el comando es bloqueado.

Lista de comandos de solo lectura

Operaciones de archivo: ls, cat, head, tail, wc, file, stat, du, df, find, tree, realpath, md5sum, sha256sum, xxd
Procesamiento de texto: grep, rg, awk, sed (sin -i), sort, uniq, cut, tr, diff, comm, jq, yq, xq, column
Git (lectura): git status, git log, git diff, git show, git branch, git tag, git blame, git shortlog
Desarrollo: node -e, python -c, tsc --noEmit, eslint, prettier --check, cargo check, go vet
Sistema: echo, printf, date, env, which, type, uname, hostname, whoami, id, pwd, test

Validación de flags por comando

fd -x / -X — excluido: --exec / --exec-batch ejecutan código
fd -l — excluido: ejecuta subprocess ls internamente (riesgo de secuestro de PATH)
jq — bloquea system(), -f, --from-file
sed -i — edición in-place: NO es solo lectura, requiere permiso explícito

Validación de Rutas y Protección del Sistema de Archivos

Extractores de rutas por comando (30+ comandos)

Comandos Estrategia de extracción
cd, ls, cat, head, tailArgs posicionales tras eliminar flags
rm, rmdir, mkdir, touchTodos los argumentos que no son flags
mv, cpArgumentos de origen y destino
findPrimer argumento (raíz de búsqueda)
grep, rgArgs de archivo después del patrón
sedArchivo objetivo de -i
gitExtracción específica por subcomando
jqArgumento de archivo de entrada

Manejo de POSIX -- fin de opciones

filterOutFlags() maneja correctamente --: después de él, TODOS los argumentos se tratan como rutas, previniendo:

rm -- -/../.claude/settings.local.json
# "-/../.claude/..." es una RUTA, capturada como traversal

Archivos y directorios protegidos

Archivos protegidos (edición automática bloqueada)

.gitconfig, .gitmodules, .bashrc, .bash_profile, .zshrc, .zprofile, .profile, .ripgreprc, .mcp.json, .claude.json

Directorios protegidos

.git, .vscode, .idea, .claude

Config de Claude (protección extra)

.claude/settings.json, .claude/settings.local.json, .claude/commands/, .claude/agents/, .claude/skills/

Verificaciones de seguridad de rutas

Verificación Qué captura
NTFS ADS: después de posición 2 (flujos de datos alternativos)
Nombres cortos 8.3Patrones ~\d (nombres cortos Windows)
Prefijos de ruta larga\\?\, \\.\ (rutas extendidas Windows)
Nombres de dispositivo DOSCON, PRN, AUX, NUL, etc.
Tres puntos... en componentes de ruta
Resolución de symlinksSe verifican tanto la ruta original COMO el destino resuelto
Normalización de mayúsculasnormalizeCaseForComparison() en minúsculas en todas partes

Sandbox y Seguridad de Entorno

Plataformas sandbox

Plataforma Tecnología Estado
macOSseatbelt (sandbox-exec)Integrado
Linuxbubblewrap (bwrap)Requiere instalación
WSL2bubblewrapRequiere instalación
Windows nativoNo soportado

Flujo de decisión del sandbox

1. ¿Sandboxing habilitado? → No → sin sandbox
2. dangerouslyDisableSandbox: true + areUnsandboxedCommandsAllowed() → sin sandbox
3. ¿Comando en lista excludedCommands? → sin sandbox
4. Aplicar SandboxManager.wrapWithSandbox()

excludedCommands NO es un límite de seguridad — la seguridad viene del sistema de permisos.

Defensa contra repositorios git bare

El sandbox bloquea escrituras en archivos estructurales de git en CWD: HEAD, objects/, refs/, hooks/, config. Post-ejecución, scrubBareGitRepoFiles() elimina cualquier archivo plantado. Previene que atacantes coloquen git hooks maliciosos.

Limpieza del entorno de subprocesos

Activado cuando CLAUDE_CODE_SUBPROCESS_ENV_SCRUB está configurado (contexto GitHub Actions):

Categoría Variables eliminadas
AnthropicANTHROPIC_API_KEY, CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_AUTH_TOKEN
AWSAWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN, AWS_BEARER_TOKEN_BEDROCK
GCP/AzureVariables de credenciales GCP/Azure
GitHub ActionsACTIONS_ID_TOKEN_REQUEST_TOKEN, tokens de runtime
OTELHeaders que pueden contener tokens de autenticación
INPUT_*Todas las variantes con prefijo INPUT_ de lo anterior

Variables que NUNCA se pueden eliminar

Categoría Variables Riesgo
EjecuciónPATH, LD_PRELOAD, LD_LIBRARY_PATH, DYLD_*Secuestro de binarios/librerías
Carga de módulosPYTHONPATH, NODE_PATH, CLASSPATH, RUBYLIBInyección de código via imports
Ejecución de códigoGOFLAGS, RUSTFLAGS, NODE_OPTIONSCódigo arbitrario via flags
SistemaHOME, TMPDIR, SHELL, BASH_ENVModificación de comportamiento

Patrones Peligrosos, PowerShell y Avisos Destructivos

Patrones de comandos peligrosos

Multi-plataforma (ejecución de código)

python, python3, node, deno, tsx, ruby, perl, php, lua, npx, bunx, npm run, yarn run, bash, sh, ssh

Adiciones Unix

zsh, fish, eval, exec, env, xargs, sudo

Específicos de Zsh (20 builtins)

zmodload, emulate, sysopen, syswrite, ztcp, zsocket, zf_rm, zf_mkdir, zf_rmdir, zf_ln, zf_mv, zf_chmod…

Avisos de comandos destructivos

Git: git reset --hard, git push --force, git clean -f, git checkout ., git stash drop/clear, git branch -D, git commit --amend
Sistema de archivos: rm -rf, rm -r, rm -f
Base de datos: DROP TABLE/DATABASE, TRUNCATE TABLE, DELETE FROM
Infraestructura: kubectl delete, terraform destroy

Son avisos informativos en el diálogo de permisos — no son bloqueos de seguridad.

Seguridad PowerShell (sistema paralelo)

Espejo del sistema Bash con adaptaciones específicas de plataforma: CmdletPathConfig por cmdlet, coincidencia case-insensitive, GIT_SAFETY_WRITE_CMDLETS, detección de extractores de archivos.

Patrones peligrosos PowerShell

pwsh, powershell, cmd, wsl, iex, invoke-expression, start-process, saps, start-job, sajb, register-objectevent

Categorías bloqueadas en modo auto PowerShell (4)

1
Descarga y Ejecución: iex (iwr ...) — equivalente a curl | bash
2
Destrucción Irreversible: Remove-Item -Recurse -Force — equivalente a rm -rf
3
Persistencia: Modificar $PROFILE, Register-ScheduledTask, claves Run del registro
4
Elevación: Start-Process -Verb RunAs, -ExecutionPolicy Bypass, deshabilitar AMSI/Defender

12 Principios de Diseño de Seguridad

1. Defensa en Profundidad

Múltiples capas independientes bloquean ataques. Eludir una capa no compromete las demás.

2. Valores Seguros por Defecto

Parámetros desconocidos, fallos de parseo y comandos complejos → ask. El sistema nunca asume seguridad.

3. Consciencia del Misparsing

Los validadores tienen en cuenta diferencias entre la tokenización del parser de seguridad y bash real.

4. Rutas Case-Insensitive

normalizeCaseForComparison() aplicado en todas partes para prevenir bypasses en macOS/Windows.

5. Resolución de Symlinks

Tanto la ruta original COMO el destino resuelto se verifican para todas las decisiones de seguridad.

6. Sin Confianza en Controles de Usuario

excludedCommands explícitamente NO es un límite de seguridad — la seguridad viene del sistema de permisos.

7. Limpieza de Entorno

API keys y tokens CI eliminados de entornos de subprocesos en contextos GitHub Actions.

8. Defensa contra Git Bare

Sandbox bloquea escrituras en archivos estructurales de git. Limpieza post-ejecución elimina archivos plantados.

9. Nonces por Proceso

La raíz de skills usa randomBytes(16) para prevenir ataques de pre-creación en directorios /tmp compartidos.

10. División de Comandos Compuestos

Operadores &&, ||, ;, | parseados — cada subcomando validado de forma independiente. Límite de 50 previene agotamiento CPU.

11. Seguimiento de Contexto de Comillas

3 vistas de cada comando permiten detectar con precisión metacaracteres ocultos en contextos entre comillas.

12. Aserciones de Límites

La eliminación segura de redirecciones requiere límites finales (?=\s|$) para prevenir ataques de prefijo.

i Manejo de salida
Los resultados de herramientas con más de 30.000 caracteres se persisten en archivo; 64 MB es el tamaño máximo persistido. El EndTruncatingAccumulator conserva el inicio y el final de la salida, truncando el medio con [... truncated ...]. Las salidas grandes incluyen una vista previa con un puntero al archivo completo para la herramienta Read.