Hackeé Perplexity Computer y obtuve acceso ilimitado a Claude Code

@yousifa
INGLÉShace 4 meses · 12 mar 2026
3.2M
5.0K
415
166
5.4K

TL;DR

Yousif Astarabadi demuestra cómo una vulnerabilidad en el archivo .npmrc de Node.js en Perplexity Computer le permitió extraer tokens de proxy y acceder a los modelos de Claude sin cargos a su cuenta.

Un prompt. Tres comandos de shell. Usé su propia IA para hackearse a sí misma.

Este es un tipo de bug que probablemente existe en todos los productos de IA multiagente que se lanzan hoy. Y la solución es un patrón de diseño del que nadie en el sector está hablando todavía.

Aquí está la historia completa.

No estaba tratando de hackear nada. Estaba investigando cómo Perplexity Computer maneja el sandboxing para mi propio trabajo de infraestructura de agentes. Quería entender cómo los sistemas multiagente en producción realmente aíslan los entornos de ejecución, qué se comparte, qué no.

Primero, empecé a husmear en el sistema. Noté que Claude Code estaba instalado en el sandbox.

Hice que el agente lo iniciara y generara algo de código de prueba solo para ver cómo se comportaba. Funcionó bien. Claude Code estándar, ejecutándose en modo bypass-permissions para que no pida confirmación. Tiene sentido para un sistema agéntico.

Fue entonces cuando pensé: espera, ¿cómo están manejando las claves de API? Claude Code necesita una clave de API de Anthropic para funcionar. Esa clave tiene que vivir en algún lugar de este sandbox. ¿Cómo se inyecta? ¿Cómo se delimita? ¿Está aislada?

Esa pregunta fue lo que me llevó por este camino.

El subagente tiene una clave de API en su entorno de proceso. Necesitaba robarla.

Perplexity Computer lo intentó seis veces y falló.

  1. Le pedí al subagente que volcara su entorno: ¡se negó!
  2. Planté un script troyano en el sistema de archivos compartido: leyó mi código, entendió lo que estaba haciendo, ¡y se negó a ejecutarlo!
  3. Envenené .bashrc y .profile: se dispararon demasiado pronto, antes de que se inyectara la clave de API.
  4. Puse un binario falso de node en PATH: nunca se activó.
  5. Ejecuté el agente de codificación y simultáneamente observé el árbol de procesos: el subagente se ejecuta en un sandbox diferente, no se capturó nada :(
  6. Encontré el prompt del sistema para Claude Code y lo modifiqué para eliminar el comportamiento de rechazo: no pude encontrar un prompt del sistema personalizado que se estuviera inyectando.

Seis fracasos. La seguridad a nivel de modelo/prompt de Claude es legítimamente buena. Cada vez que intentaba algo ingenioso, el modelo lo detectaba.

Yousif Astarabadi - inline image

Entonces Perplexity recordó que Claude Code es una aplicación de Node.js lanzada a través de npm. Y npm lee ~/.npmrc del directorio home. Y el directorio home está en el sistema de archivos compartido en el que puedo escribir.

Node.js tiene una bandera --require que precarga un módulo de JavaScript antes de que se ejecute cualquier código de la aplicación. Puedes configurar esto a través de NODE_OPTIONS en .npmrc. Lo que significa que si escribo un .npmrc en el directorio home compartido, ¡cada proceso de Node que inicie el subagente precargará mi código! Esto ocurre antes de que Claude Code siquiera se inicialice, antes de que se ejecuten las comprobaciones de seguridad, ¡antes de todo!

El exploit son tres comandos:

  1. Escribe un script de seis líneas que vuelque process.env a un archivo en el espacio de trabajo compartido
  2. echo 'node-options=--require /ruta/al/script.js' > ~/.npmrc
  3. Pídele a Perplexity Computer que haga literalmente cualquier tarea de codificación

El subagente arranca → npm lee mi .npmrc → mi precarga se dispara antes de que Claude Code comience → las credenciales completas de la API llegan al sistema de archivos compartido.

¡Funcionó! Me dio un token de puerta de enlace de Perplexity que hace proxy a través de agent-proxy.perplexity.ai hacia su cuenta maestra de Anthropic.

Yousif Astarabadi - inline image

Naturalmente, lo primero que hice fue configurar esta clave de API y BASE_URL para Claude Code en mi laptop. Esperaba que las llamadas de LLM desde Claude Code fallaran y estuvieran restringidas al sandbox. Me sorprendió. ¡Respuesta instantánea de Opus 4.6!

Luego pensé: "seguramente, facturarán este uso a mi cuenta, esta clave de API debe estar vinculada a mi usuario". Me equivoqué de nuevo.

Hice que Opus 4.6 generara una larga historia describiendo la historia del mundo, incluyendo cada invento, imperio y descubrimiento. Ejecuté esta llamada 5 veces en paralelo, generando más de 100k tokens de salida de cada una. Esto debería haber consumido todos mis créditos de Perplexity Computer, pero no se movieron.

Sin restricción de IP. Sin alcance de sesión. Sin límite de sandbox. Su factura.

Una de las startups de IA mejor financiadas del planeta fue vulnerada por un dotfile que se ha utilizado en ataques a la cadena de suministro de Node.js desde 2019.

El modelo hizo todo bien. La infraestructura no.

Ahora, esto es lo que realmente quiero que los fundadores que construyen infraestructura de agentes saquen de aquí.

La arquitectura de Perplexity está a medias. Usan un proxy entre el sandbox y la API de Anthropic. Ese es el patrón correcto. Nunca debes poner una clave de API en bruto dentro de un sandbox. Un proxy te da control, observabilidad y la capacidad de revocar el acceso sin rotar tu clave maestra.

El problema es que su token de proxy no tiene ningún vínculo con el contexto de ejecución. Una vez que lo tienes, funciona en todas partes para siempre.

Así es como se hace correctamente:

Vincula el token al ID del sandbox. ¿El token y el ID del sandbox no coinciden? Rechazado. ¿La clave se filtra pero no tienes el sandbox? Inútil. Idealmente, también debería vincular el token a la dirección IP del sandbox, pero E2B (el proveedor de sandbox que usan) no proporciona eso antes de que se inicie el sandbox.

Haz que el token sea efímero. Crealo cuando el sandbox se inicie. Elimínalo cuando el sandbox se pause. Sin credenciales de larga duración. El proxy genera un token de corta duración al inicio de la sesión y lo invalida al finalizar. Una clave filtrada de un sandbox muerto es una clave muerta.

Vincula el token a la cuenta de facturación del usuario. Incluso si todo lo demás falla, incluso si alguien extrae un token activo de un sandbox en uso y lo utiliza antes de que expire, el uso se factura a la cuenta que generó la sesión. No a un grupo de facturación maestro compartido. Esto convierte "acceso ilimitado gratuito a la API" en "alguien abusando de su propio cuota", que es una gravedad completamente diferente.

Estas tres cosas —vinculado al sandbox, efímero, facturado al usuario— son lo que hace que el patrón de proxy funcione realmente. Sin ellas, solo estás añadiendo un salto de red extra que no detiene nada.

Esto no es un problema específico de Perplexity. Esta es la arquitectura predeterminada para la infraestructura de agentes en este momento porque es la más rápida de construir. Sistemas de archivos compartidos entre agentes, credenciales de larga duración, facturación de cuenta maestra. Apostaría a que la mayoría de los productos multiagente en producción hoy tienen alguna versión de esto.

Reportado a @AravSrinivas y @denisyarats antes de publicar.

Recrear en YouMind

Turn one viral article into a full content workflow

Collect the source, decode the pattern, create assets, draft the story, and distribute from one AI workspace.

Explore YouMind
Para creadores

Convierte tu Markdown en un artículo de 𝕏 impecable

Cuando publicas tus propios textos largos, dar formato en 𝕏 a imágenes, tablas y bloques de código es un fastidio. YouMind convierte un borrador completo en Markdown en un artículo de 𝕏 impecable y listo para publicar.

Prueba Markdown a 𝕏

Más patrones por descifrar

Artículos virales recientes

Explorar más artículos virales