Claude auditó su Código Fuente, aquí están los hallazgos resumidos
Basado en un análisis profundo de la base de código de 2,200 archivos a través de las cuatro dimensiones:
🔴 Vulnerabilidades de Seguridad
1. Inyección de Comandos de Windows (windowsPaths.ts)
La función checkPathExists() construye un comando de shell interpolando directamente una cadena de ruta controlada por el usuario:
execSync_DEPRECATED(`dir "${path}"`, { stdio: 'pipe' })
Una ruta que contiene " o metacaracteres de shell (por ejemplo, C:\foo" & evil) podría romper el contexto entre comillas dobles y ejecutar comandos arbitrarios. Baja explotabilidad en la práctica (función de utilidad interna) pero sigue siendo inseguro.
2. Sin guardia SSRF de IP privada/localhost en WebFetchTool
isValidUrl() verifica que el nombre de host tenga al menos dos partes separadas por puntos — pero no bloquea localhost, 127.0.0.1, 192.168.*, 169.254.*, u otras direcciones RFC-1918/locales de enlace. La verificación de la lista de bloqueo de dominios (checkDomainBlocklist) delega a api.anthropic.com/api/web/domain_info, lo que significa que el SSRF a hosts internos/privados depende totalmente de que esa API externa los rechace correctamente. Un error de red devuelve check_failed que puede ser manejado suavemente. No existe una verificación local de IP en profundidad.
3. JWT decodificado sin verificación de firma (jwtUtils.ts)
decodeJwtPayload() elimina explícitamente el prefijo sk-ant-si- y decodifica la carga útil del JWT sin verificar la firma. Utilizado para programar la renovación de tokens (lectura de caducidad). Si un atacante puede sustituir un token elaborado, podría manipular el tiempo de renovación. Impacto bajo dado que los tokens son recibidos de infraestructura confiable de Anthropic, pero la ausencia de verificación es digna de mención.
🟠 Manejo de clave API / secreto
4. Token de ingreso de sesión almacenado en memoria a través de múltiples ubicaciones
Los valores de session_ingress_token se pasan como cadenas de texto plano y se almacenan en sessionIngressTokens (un Map) en bridgeMain.ts. Los tokens aparecen en los registros de depuración con redacción de prefijo (token.slice(0, 15)…) — pero la redacción de registros es manual y se aplica de manera inconsistente. Cualquier cambio futuro en el registro podría exponer inadvertidamente los tokens completos.
5. CLAUDE_CODE_CLIENT_KEY y CLAUDE_CODE_CLIENT_KEY_PASSPHRASE en el entorno
Estas variables de entorno sensibles existen como opciones de configuración documentadas. Si aparecen en listados de procesos, /proc/self/environ, o son capturadas por herramientas, están expuestas. Hay una verificación de seguridad validateProcEnvironAccess en BashTool que bloquea las lecturas de /proc/*/environ — bien — pero esto solo se aplica a los comandos bash emitidos por Claude, no a la inspección de procesos arbitrarios.
6. Sin limpieza explícita de secretos
Los secretos decodificados de decodeWorkSecret() y los tokens almacenados en el puente nunca se limpian/nulifican explícitamente después de su uso. En JavaScript, esto es en gran medida una preocupación de GC de V8, pero los secretos pueden permanecer en la memoria heap y aparecer en volcado de fallos.
🟡 Privacidad de datos / telemetría
7. La opción de no participar en la telemetría no es por defecto
Las analíticas están activadas por defecto y requieren la configuración explícita de la variable de entorno (DISABLE_TELEMETRY=1 o CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1). Los eventos se dirigen a Datadog y al registro de eventos 1P de Anthropic. El tipo de marcador AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS es un tipo nunca — lo que significa que no puede impedir que los metadatos de cadena se registren; se aplica por convención y revisión de código, no por el sistema de tipos.
8. Compartir transcripciones sobre retroalimentación
submitTranscriptShare.ts envía el historial completo de la conversación (mensajes normalizados + transcripción JSONL sin procesar + transcripciones de subagentes) a Anthropic en la retroalimentación de encuestas, incluyendo una llamada a redactSensitiveInfo() cuyo alcance no está claro. Esto sucede en desencadenantes de retroalimentación negativa Y positiva. Los usuarios pueden no comprender completamente que el contenido de la transcripción se está subiendo.
9. Campos PII de PROTO van a registros 1P
El patrón de clave PROTO* dirige valores etiquetados con PII a una "columna privilegiada" en BigQuery con controles de acceso restringidos. El diseño es sólido pero depende completamente de que stripProtoFields() de sink.ts se llame antes de cada sink que no sea 1P. Una sola llamada perdida podría dirigir PII sin redactar a un backend de acceso general.
🔵 Calidad del código / Arquitectura
10. Uso pesado de API deprecadas
177 sitios de llamada hacen referencia a funciones con sufijo DEPRECATED (principalmente execSyncDEPRECATED, splitCommand_DEPRECATED). La principal sustitución (ruta AST de tree-sitter) está condicionada a la disponibilidad — la ruta regex deprecada sigue siendo la opción de respaldo para todas las verificaciones de seguridad. Esta complejidad de doble ruta es un riesgo de mantenimiento a largo plazo.
11. 663 Bloques catch {} vacíos
Existen una gran cantidad de patrones de tragar errores. Muchos son intencionales (operaciones de mejor esfuerzo como escrituras en caché), pero otros ocultan fallos significativos silenciosamente. Notable: el catch de checkDomainBlocklist devuelve check_failed con el error, lo que es bueno — pero muchos llamadores manejan check_failed con indulgencia.
12. 940 Llamadas void de fuego y olvido
El uso generalizado de asyncFunction() void significa que muchos fallos asíncronos se eliminan silenciosamente. Analíticas, escrituras de telemetría y algunas operaciones de sesión utilizan todo este patrón.
13. 142 Comentarios TODO/FIXME/HACK
Indica una deuda técnica significativa, aunque algunos están anotados como seguridad (el análisis de ataques bien documentado en bashSecurity.ts es en realidad algo positivo).
14. bashSecurity.ts es excelente pero frágil con regex
El código de validación de seguridad de shell es excepcionalmente detallado — cubriendo inyección IFS, espacios en blanco Unicode, diferenciales de retorno de carro, expansión de llaves, bypass específicos de Zsh, etc. Sin embargo, la ruta regex _DEPRECATED (utilizada cuando tree-sitter no está disponible) es inherentemente frágil. El equipo ha documentado más de 20 clases de bypass conocidas; es probable que haya casos extremos no descubiertos.
Tabla de resumen
Aquí hay una versión reescrita limpia sin ningún formato de tabla:
Resumen
Seguridad — 🔴 Alto: Vulnerabilidad de inyección en el directorio de Windows "${path}"
Seguridad — 🔴 Alto: Sin protección contra SSRF de localhost/IP privada
Seguridad — 🟠 Medio: JWT se decodifica sin verificar su firma
Secretos — 🟠 Medio: Tokens de ingreso expuestos en memoria/logs
Secretos — 🟠 Medio: Clave del cliente y frase de contraseña almacenadas a través de variables de entorno
Secretos — 🟡 Bajo: Sin limpieza de memoria para datos sensibles
Privacidad — 🟠 Medio: La telemetría no es opt-out por defecto
Privacidad — 🟠 Medio: Los comentarios pueden activar cargas implícitas de transcripciones
Privacidad — 🟡 Bajo: El manejo de PII depende de una única llamada a stripProtoFields
Calidad — 🟠 Medio: 177 sitios de llamada a funciones deprecadas
Calidad — 🟡 Bajo: 663 bloques catch vacíos
Calidad — 🟡 Bajo: 940 llamadas asíncronas de fuego y olvido
Calidad — 🟡 Bajo: 142 elementos TODO/FIXME
Calidad — 🟡 Bajo: Uso frágil de regex en rutas sensibles a la seguridad
https://t.co/jBiMoOzt8G
