Es 1 de abril, pero este post no es una broma.
Estuve siguiendo la cobertura de la "filtración" de Claude Code todo el día — VentureBeat, Fortune, Gizmodo, The Register, Hacker News. ¡512.000 líneas! ¡Feature flags! ¡System prompts! Un rewrite limpio en Rust (para esquivar el DMCA) alcanzó 100K estrellas en GitHub en apenas un día — un récord mundial. 110K ahora y subiendo.
Están todos equivocados. Ese código ya era público. En npm. En texto plano. Desde hace años. Abre unpkg.com/@anthropic-ai/claude-code/cli.js ahora mismo — ese es el CLI completo de Claude Code, a un clic, legible en tu navegador. Sin necesidad de filtraciones.
Lo que se "filtró" fue un archivo source map que añadía comentarios internos de desarrolladores sobre un código que nunca estuvo protegido, más la estructura de directorios y archivos fuente.
Lo que realmente pasó
Un archivo .map de source map — destinado a depuración interna — fue incluido por error en la versión 2.1.88 del paquete @anthropic-ai/claude-code en npm. El investigador de seguridad Chaofan Shou lo detectó, publicó en X, e internet hizo el resto.
Anthropic confirmó el error: "Fue un problema de empaquetado en el release causado por un error humano, no una brecha de seguridad." El paquete fue retirado, pero para entonces ya había sido replicado en todas partes.
¿La parte graciosa? Es la segunda vez. Una filtración de source map casi idéntica ocurrió en febrero de 2025. Mismo producto, mismo error, trece meses después.
Lo que pasó en 24 horas
Lo que pasó después fue genuinamente impresionante. En un solo día:
-
Volcados de código aparecieron en GitHub — como nirholas/claude-code, que fue eliminado por DMCA de Anthropic en horas, pero no antes de ser forkeado cientos de veces.
-
Claw Code — un rewrite completo en Rust de la arquitectura de Claude Code — alcanzó 50.000 estrellas en GitHub en 2 horas, convirtiéndose en el repositorio más rápido de la historia en llegar a esa marca. Ahora se desarrolla activamente como framework open-source de agentes de IA para programación.
-
ccleaks.com apareció de la nada — un sitio completo que catalogaba cada funcionalidad no lanzada, comando oculto y flag de compilación encontrado en el código fuente. Con tarjetas compartibles para descubrimientos como "BUDDY" (una mascota compañera de IA), "ULTRAPLAN" (modo de planificación remota de 30 minutos), y otras 44 feature flags:
- Decenas de artículos de análisis en DEV Community, YouTube y blogs de tecnología diseccionando cada detalle.
Todo esto. En un solo día. El software se vuelve una locura en la era de la IA.
Pero el código ya estaba ahí
Esto es lo que la mayoría de la cobertura pasó por alto: Claude Code se distribuye como un único archivo JavaScript empaquetado — cli.js — a través de npm. Son 13MB, 16.824 líneas de JavaScript. Y ha estado ahí, públicamente accesible, desde que se lanzó el producto.
Analizamos este archivo en AfterPack como parte de un caso de estudio de desofuscación. Lo que encontramos: está minificado, no ofuscado.
Esta es la diferencia. La minificación — lo que todo bundler (esbuild, Webpack, Rollup) hace por defecto — acorta nombres de variables y elimina espacios en blanco. Hace el código más pequeño para distribuirlo. Nunca fue diseñada para ocultar nada.
La ofuscación encripta cadenas de texto, aplana el flujo de control, inyecta código muerto y añade mecanismos anti-manipulación. Está diseñada para hacer la ingeniería inversa computacionalmente costosa.
Claude Code tiene lo primero. Nada de lo segundo.
| Technique | Present? |
|---|---|
| Variable name mangling | Yes (standard minification) |
| Whitespace removal | Yes (standard minification) |
| String encryption/encoding | No |
| Control flow flattening | No |
| Dead code injection | No |
| Self-defending / anti-tamper | No |
| String array rotation | No |
| Property name mangling | No |
Las más de 148.000 cadenas de texto literales están en texto plano. Cada system prompt, cada descripción de herramienta, cada instrucción de comportamiento — ahí mismo en el JavaScript, legible con un editor de texto. Sin necesidad de source maps.
Le pedimos a Claude que se desofusque a sí mismo
Aquí es donde se pone interesante. No necesitamos source maps para extraer los internos de Claude Code. Le pedimos a Claude — el propio modelo de Anthropic — que analizara y desofuscara el archivo minificado cli.js.
Funcionó. Extremadamente bien.
Usando un script simple de extracción basado en AST, parseamos el archivo completo de 13MB en 1,47 segundos y extrajimos 147.992 cadenas de texto. Después de categorizarlas:
- 1.017 system prompts e instrucciones
- 431 descripciones de herramientas
- 837 nombres únicos de eventos de telemetría (todos con prefijo
tengu_— el nombre en clave interno de Claude Code) - 504 variables de entorno que controlan el comportamiento del producto
- 3.196 mensajes de error
- Endpoints hardcodeados, URLs de OAuth, una API key de DataDog, el catálogo completo de modelos
Cada cadena de texto. Extraída en menos de 2 segundos. Sin desencriptación. Sin desofuscación. Solo parsing.
Y no somos los únicos que lo descubrieron. Geoffrey Huntley publicó una "transpilación de sala limpia" completa de Claude Code meses antes de esta filtración — usando LLMs para convertir el JavaScript minificado en TypeScript legible y estructurado. Su conclusión clave: "Los LLMs son sorprendentemente buenos en desofuscación, transpilación y conversiones de estructura a estructura."
Los source maps no revelaron el código. El código ya estaba revelado. Los source maps solo añadieron comentarios y una estructura de archivos fuente encima.
Lo que realmente aportaron los source maps
Para ser justos — los source maps sí sacaron a la luz información genuinamente sensible que no era fácilmente extraíble del bundle minificado:
Comentarios internos del código. Notas de desarrolladores, TODOs, justificaciones de decisiones. El tipo de cosas que escribes esperando que solo tus compañeros de equipo las lean.
La estructura exacta de archivos. El árbol completo del proyecto con 1.884 archivos, nombres originales, límites de módulos y relaciones de dependencias.
Feature flags con nombres en clave. Nombres como tengu_amber_flint, tengu_cobalt_frost y tengu_miraculo_the_bard — nombres internos de experimentos que revelan la estrategia de producto y la estructura de tests A/B.
Modo encubierto. Una funcionalidad que elimina nombres en clave internos y referencias cuando Claude Code se usa en repositorios que no son de Anthropic — para que el modelo nunca diga accidentalmente "Tengu" o "Capybara" en público.
KAIROS. Un modo daemon autónomo no lanzado — agentes trabajadores en segundo plano con ciclos cron y suscripciones a webhooks de GitHub.
Mecanismos anti-destilación. Claude Code envía anti_distillation: ['fake_tools'] en las peticiones a la API, inyectando definiciones de herramientas señuelo en los prompts para envenenar los datos de entrenamiento si alguien graba el tráfico de la API para entrenar un modelo competidor.
Esto es sensible. Los comentarios internos son una exposición real. Pero la lógica real del código fuente — los prompts, las herramientas, la arquitectura, los endpoints — todo eso ya estaba en cli.js. Siempre lo estuvo.
Esto pasa más de lo que crees
Algo que podría sorprenderte: esto no es un problema específico de Anthropic. Es una práctica aceptada en toda la industria.
Ejecutamos el Security Scanner de AfterPack en el propio sitio web de GitHub — una de las organizaciones de ingeniería más sofisticadas del mundo. Esto es lo que encontramos:
Direcciones de email. Nombres de variables de entorno. URLs internas. Todo en JavaScript de producción y source maps, públicamente accesible. Mira los resultados completos del escaneo por ti mismo.
Y el propio sitio web de Anthropic — claude.ai — tiene el mismo problema. Su JavaScript de producción en s-cdn.anthropic.com/s.js expone direcciones de email de empleados:
Nadie habla de esto. No hay ningún titular de VentureBeat sobre GitHub enviando direcciones de email en sus bundles de JS. Ningún hilo en Hacker News sobre URLs internas expuestas en los scripts del CDN de Anthropic. Pero es exactamente la misma clase de problema — JavaScript de producción exponiendo información que nunca debió ser pública.
Puedes comprobar tu propio sitio ahora mismo: afterpack.dev/security-scanner, o desde la terminal:
| npx afterpack audit https://tu-sitio.com |
Por qué la IA cambia la ecuación
Esta es la realidad que la filtración de Claude Code ilustra — aunque no sea la narrativa que la mayoría adoptó:
La minificación nunca fue seguridad. Es una optimización de tamaño. El renombrado de variables que ralentiza a los lectores humanos es trivial para los LLMs. La IA lee código minificado como tú lees código formateado.
Los system prompts son los nuevos secretos comerciales. Las empresas invierten meses diseñando prompts que dan forma a sus productos. Los prompts de Claude Code de Anthropic — las secciones "# Doing tasks", "# Executing actions with care", "# Tone and style" — representan un trabajo serio de prompt engineering. Todo enviado en JavaScript en texto claro.
Los nombres de telemetría revelan hojas de ruta del producto. Los 837 eventos tengu_* que extrajimos te dicen exactamente qué está construyendo, probando y midiendo Anthropic. Nombres de eventos como tengu_desktop_upsell_shown y tengu_review_overage_dialog_shown exponen la estrategia de monetización.
Las variables de entorno exponen lo que aún no estás listo para lanzar. 504 nombres descriptivos de variables de entorno — CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS, CLAUDE_CODE_DISABLE_AUTO_MEMORY, MAX_THINKING_TOKENS — revelan funcionalidades tempranas y endpoints experimentales que aún no están preparados para producción. Para los atacantes, eso es una hoja de ruta hacia la superficie menos probada y más vulnerable. Para los competidores, es toda tu pipeline de funcionalidades. Y para tus usuarios, es una lista de controles que nunca debieron conocer.
Y esto no es solo sobre Anthropic. Cada aplicación JavaScript — frontends de React, aplicaciones de escritorio con Electron, apps móviles con React Native, CLIs de Node.js — distribuye código que la IA ahora puede leer, analizar, reconstruir y copiar. Pasarelas de pago con feature flags. Productos SaaS con lógica de precios. Flujos de autenticación con endpoints hardcodeados.
Estamos preparando un estudio completo sobre qué tan bien los modelos de IA hacen ingeniería inversa de ofuscadores de JavaScript populares — no solo código minificado, sino código que fue intencionalmente protegido. Claude Code (impulsado por Opus) es actualmente el modelo más fuerte para razonamiento y tareas de código, y lo hace alarmantemente bien. Síguenos para no perdértelo:
El problema con la "protección" actual
Aquí está la trampa. El artículo que acabas de leer demuestra que la minificación no es protección. Pero esto es lo que la mayoría no se da cuenta: la ofuscación tradicional tampoco lo es — ya no.
Todos los ofuscadores de JavaScript existentes fueron creados antes de que existieran Opus 4.6. Sus técnicas — encriptación de cadenas, aplanamiento de flujo de control, inyección de código muerto — son transformaciones secuenciales y reversibles. Cada paso tiene un inverso. Los modelos de IA entrenados con millones de ejemplos de código pueden identificar y deshacer estos patrones, a menudo en segundos.
Sube los ajustes lo suficiente y sí, puedes ralentizar el análisis — pero a costa de inflar el código 10 veces y una degradación seria del rendimiento. En ese punto, has hecho tu aplicación inutilizable para protegerla de ser legible.
Este es el vacío que AfterPack llena.
Por qué estoy construyendo AfterPack
AfterPack aborda esto de manera diferente. En lugar de apilar transformaciones reversibles unas sobre otras, AfterPack utiliza transformaciones no lineales e irreversibles — más parecidas a cómo funciona una función hash que a un ofuscador tradicional. La salida es funcionalmente equivalente a la entrada, pero la transformación destruye el significado semántico de una forma que no se puede revertir — ni siquiera por AfterPack mismo. No hay función inversa. No hay clave secreta que desbloquee el original.
La idea central: no solo hacer el código más difícil de leer. Destruir la información que un atacante necesita para reconstruirlo — de la misma manera que una función hash destruye su entrada. Más de 40 transformaciones aplicadas en orden pseudo-aleatorio hacen que la complejidad de reversión no sea lineal — es combinatoria. Y varias de esas transformaciones destruyen información de forma genuina: incluso si identificas lo que se aplicó, la información original es irrecuperable.
Y sí — puedes seguir depurando tu propio código. AfterPack genera source maps encriptados que mapean el código ofuscado de vuelta a tu fuente original. La protección es unidireccional para los atacantes, no para ti.
Construido en Rust para velocidad — lo suficientemente rápido para ejecutarse en cada build, cada commit, incluso en el edge con Cloudflare Workers. Con un tier gratuito lo suficientemente generoso como para que no haya excusa para no usarlo.
El estado actual — donde una empresa de IA valorada en más de $60B distribuye su código del lado del cliente más sensible con nada más que minificación del bundler — no va a durar. Estoy construyendo AfterPack porque creo que la protección debería ser un paso predeterminado en cada pipeline de build, no una ocurrencia tardía. Si te da curiosidad, prueba el escáner en tu propio sitio — puede que te sorprenda lo que está expuesto.
