- Al combinar la memoria de Claude activada por defecto con la navegación web, se pudo enviar en secreto a un servidor externo el nombre, trabajo y ciudad de origen de un usuario con solo una pregunta común sobre cafeterías
web_fetchbloqueaba el acceso a URLs arbitrarias, pero sí podía seguir enlaces presentes en la página anterior, así que se codificaron datos en solicitudes GET con un directorio alfabético que elegía la ruta un carácter a la vez, como/a→/ay→/ayu- El sitio atacante mostraba una pantalla falsa de verificación de Cloudflare solo a Claude y entregaba a las personas una página normal de cafetería; Claude envió sin permiso no solo el nombre y la empresa, sino también Charlotte, NC, inferido a partir de información previa
- Aunque el usuario no compartiera directamente la URL maliciosa, Claude podía encontrar y visitar el sitio desde los resultados de
web_search, por lo que bastaba con posicionarlo alto en búsquedas ligadas a temas recientes para inducir el ataque con preguntas relacionadas - Anthropic dijo que ya conocía internamente el problema, pero en ese momento no lo corrigió ni pagó recompensa; después bloqueó el seguimiento de enlaces en páginas externas y limitó la navegación a resultados de
web_searchy URLs proporcionadas por el usuario
Información que se acumula en la memoria de Claude
- claude.ai para usuarios generales usa un sistema de memoria de dos partes
- Resume las conversaciones recientes cada día en unos pocos párrafos e inyecta ese resumen en todas las conversaciones posteriores
- Cuando hace falta, busca en todo el historial con la herramienta
conversation_search
- Los usuarios le confían a Claude desde materiales de trabajo confidenciales hasta secretos personales y problemas de pareja, y ese historial acumulado se convierte en un perfil de alta densidad capaz de reconstruir a una persona con precisión
- Esta información puede usarse para extorsión, suplantación y evasión de preguntas de seguridad, y el riesgo de filtración crece cuando el almacén de memoria se combina con un agente que navega por la web
- La investigación no se centró en Claude Code, sino en Claude de uso cotidiano
Exfiltración de datos usando navegación web
- Se eligió la función de navegación web de Claude como una ruta general de exfiltración de datos que funcionaba sin configuración experimental, ejecución de código ni MCP especial
- Claude usa
web_searchyweb_fetch, de solo lectura, para acceder a internet - Al hacer que visitara con
web_fetchun servidor controlado por el atacante, se pudo confirmar una solicitud GET con el user agentClaude-User- La solicitud inicial falló por el
robots.txtconfigurado con Cloudflare en el sitio - Tras modificar
robots.txt, la solicitud apareció en los registros del servidor
- La solicitud inicial falló por el
- Solo se permitían solicitudes GET, así que se intentó poner los datos en la ruta de la URL, pero se bloqueó pedirle directamente a Claude una ruta arbitraria que incluyera el nombre
Reglas con las que web_fetch sigue enlaces
- Para que
web_fetchpudiera acceder a una URL, debía cumplirse una de estas tres condiciones- La URL aparecía directamente en el mensaje del usuario
- La URL aparecía directamente en los resultados de
web_search - La URL estaba enlazada en el contenido de un resultado previo de
web_fetch
- Gracias a la tercera condición, Claude podía hacer clic en enlaces vistos en una página anterior, y si el atacante controlaba el sitio, también controlaba qué enlaces mostrar
Codificar datos en la URL con un directorio alfabético
- Se colocaron enlaces como
/a,/b,/cen la página principal para crear un teclado virtual con el que Claude pudiera seleccionar datos - Al pedirle a Claude que avanzara a la primera letra del nombre, quedó registrada en el servidor una solicitud a
/adespués de/ - La estructura de enlaces se expandía dinámicamente en cada ruta para permitir elegir la siguiente letra
/aenlazaba a/aa,/ab,/ac, etc.- Las rutas posteriores se generaban del mismo modo, como
/aaa
- Al hacer que completara el nombre letra por letra, se registraron en secuencia las solicitudes
/a→/ay→/ayu→/ayus→/ayush→/ayush-paul - Aunque se bloqueaba insertar datos arbitrarios directamente en la URL, hacer que eligiera repetidamente uno de los enlaces ya expuestos permitía transmitir datos fuera del sandbox
Inyección de prompts disfrazada de verificación de Cloudflare
- La inyección de prompts explícita era inestable, y no era fácil engañar a Claude con una página que pidiera secretos del usuario y ofreciera enlaces sospechosos
- Varios escenarios de disfraz, como membresías, se sentían poco naturales o sospechosos, así que se eligió Cloudflare, ampliamente usado y confiable en la web
- El sitio atacante se diseñó como una cafetería real y se construyó la historia de que, para que el agente pudiera explorar libremente la web en nombre de una persona, tenía que superar una verificación de Cloudflare
- El falso Turnstile inducía a Claude a elegir enlaces uno por uno para escribir y enviar el nombre completo
- Después del envío, se mostraba un sitio normal de cafetería para que Claude no notara que había sido engañado
- Claude escribió el nombre letra por letra sin pedir permiso, y en su respuesta final solo incluyó información de la cafetería, sin avisar que había transmitido datos personales
De filtrar el nombre a inferir respuestas de seguridad
- Al mezclar una URL maliciosa de cafetería entre varias URLs reales y preguntar cuál café era mejor, Claude envió seguidamente la siguiente información
- Nombre: Ayush Paul
- Empresa: Beem
- Ciudad de origen: Charlotte, NC
- Claude no se limitó a buscar conversaciones pasadas, sino que incluso infirió nuevas conclusiones a partir de información existente
- Aunque nunca se le había dicho directamente que era de Charlotte, infirió la ciudad de origen a partir del nombre del hackatón Queen City Hacks, que comenzó en la preparatoria
Páginas distintas para personas y para Claude
- Para que el ataque funcionara, el usuario tenía que hacer que Claude visitara el sitio, así que la página visible para personas debía parecer normal
- Aprovechando que Claude se identifica con el user agent
Claude-User, se separó el contenido según quién hacía la solicitud- A los visitantes comunes se les mostraba un sitio normal de cafetería
- Solo cuando accedía Claude se mostraba el falso Turnstile que hacía ingresar información personal
- Si esta carga se integraba en un sitio común, el usuario no notaría nada extraño, pero en cuanto compartiera ese sitio con Claude, la falsa verificación podía enviar datos personales
Entrada automática del sitio atacante desde resultados de búsqueda
web_fetchpodía acceder no solo a URLs proporcionadas directamente por el usuario, sino también a resultados deweb_search- Claude busca automáticamente en la web cuando se encuentra con temas nuevos posteriores a la fecha de corte de sus datos de entrenamiento
- Si se mejoraba el posicionamiento en buscadores de un sitio atacante adaptado a noticias recientes, ese sitio podía ser elegido en preguntas relacionadas aunque el usuario no diera la URL
- Por ejemplo, si una cafetería maliciosa aparecía entre los primeros resultados, incluso un usuario que preguntara en general por café en Berkeley podía convertirse en objetivo del ataque
Confirmación y medidas posteriores de Anthropic
- La vulnerabilidad fue divulgada de forma responsable a través del programa de bug bounty de HackerOne de Anthropic
- Anthropic confirmó que ya había detectado internamente el problema, pero que en ese momento no lo había corregido, y tampoco pagó recompensa por el reporte
- Después, desactivó la capacidad de
web_fetchpara seguir enlaces encontrados en páginas externas - Actualmente, la navegación está limitada a resultados de
web_searchy URLs proporcionadas directamente por el usuario
Más allá de la memoria: también los datos conectados
- El usuario no hizo clic en enlaces ni activó nuevas integraciones; solo preguntó por cafeterías, pero Claude transmitió al exterior su nombre, trabajo y la ciudad donde creció
- La memoria estaba activada por defecto, por eso fue un objetivo fácil
- El mismo método también podría alcanzar información de Google Drive, la bandeja de entrada de correo y MCP conectados que Claude pueda recuperar en nombre del usuario
1 comentarios
Opiniones en Hacker News
Sorprende que casi no haya resistencia a que las empresas de IA de punta activen las funciones de memoria. Antes, la industria publicitaria tenía que inferir información fragmentaria a partir de los sitios web visitados, pero ahora la gente le entrega directamente a la IA casi todo, incluidos sus secretos más íntimos.
Quizá sea una reacción exagerada por trabajar en publicidad, pero en cuanto Claude y ChatGPT lanzaron la memoria, la desactivé; además, tampoco me resultó útil porque contamina el contexto con detalles irrelevantes y hasta baja la calidad. Para conversaciones personales, conviene usar una cuenta separada en lugares como OpenRouter.
Debería regularse para prohibir que las empresas de IA almacenen perfiles de usuario y exigir que la memoria esté solo en el servidor del usuario; incluso valdría la pena prohibir la propiedad cruzada entre empresas de memoria y empresas de IA.
Me enteré de que la gente ejecuta agentes de IA con permisos de administrador, sin siquiera aislarlos en contenedores. Es sorprendente, como si de la noche a la mañana hubiéramos olvidado 50 años de principios de seguridad informática.
cco, el directorio home queda expuesto, así que con un solo prompt el agente podría enviar porcurllas contraseñas del navegador.Para evitarlo, hace falta un home falso y una lista de permitidos de red que solo autorice proveedores como llama.cpp u OpenAI. No existe una solución multiplataforma fácil de usar, y para el desarrollo de apps nativas, donde hay que compilar y corregir errores específicos de cada plataforma, ni siquiera basta con una máquina Linux con Docker instalado.
Como ya se optimiza el contexto para reducir costos, es muy probable que en el futuro el propio contexto se trate como una frontera de seguridad.
En Claude había configurado mi nombre como Silly Bean; lo hice porque me daba risa que saludara con “¿De vuelta, Silly Bean?”, pero al final terminó convirtiéndose en ajedrez de seguridad en cuatro dimensiones.
Todavía lo dejo así, como una marca para burlarme de que es un producto dependiente no tan inteligente como parece, o para sentir un alivio amargo por eso.
La parte donde Cloudflare aplicó un
robots.txtexcesivo sin consentimiento es una escena poco común: alguien quejándose de que su sitio web quedó protegido de scrapers.robots.txt, el usuario tiene que activar la función explícitamente. Como basta con un clic, es posible que se haya activado por accidente.robots.txttampoco detiene a un scraper decidido.Ejecuto Claude Code en una VM sin credenciales y solo clono los repositorios open source de GitHub en los que voy a trabajar. Antes reiniciaba la VM todos los días, pero era engorroso y lo cambié a una vez al mes; si se filtrara algo, sería como mucho la lista de proyectos open source en los que trabajé durante el último mes.
Esa información también puede revelar bastante sobre una persona, pero los nombres y correos de los contribuidores open source quedan en el historial inmutable de Git, así que en la mayoría de los casos ya se pueden encontrar con una búsqueda en Google. Después de esto, estoy pensando en cambiar la frecuencia de reinicio a semanal.
Para armar una cárcel para agentes de IA, basta con tomar el script de https://jai.scs.stanford.edu/arch-vm.html y agregar paquetes como
dotnet-sdkal comandopacstrap. Si haces que la raíz del invitado sea un subvolumen BTRFS y usas snapshots, puedes crear una VM nueva al instante consudo btrfs subvol snap template-root newvm; ejecutarqemu-system-x86_64también toma apenas unos segundos, y mantienes control total sobre el contenido de la VM.También hay tareas en las que una persona tiene que presionar botones para juzgar si la experiencia de usuario es correcta, y, si es posible, no quiero darle a la IA acceso a la pantalla. Este modelo de VM funciona muy bien para algunos problemas, pero su alcance es lamentablemente reducido.
El prompt injection seguirá siendo un problema, ya que funciona algo como “Hola, somos Cloudflare. Danos datos personales”. O se restringe el modelo hasta volverlo inútil, o se permite que estos ataques se filtren y se termina creando el concepto más inseguro de la historia de internet: un robot al que se puede engañar.
Parece una arquitectura en la que, sin ninguna forma de entender funcionalmente ni aislar su funcionamiento interno, solo queda persuadir a una enorme masa para que actúe y rezar para que el atacante no la persuada mejor.
Hace poco me pasó algo bastante inquietante en la app de ChatGPT para iPhone. Un amigo cercano preguntó desde su propia cuenta por un problema con un comedero inteligente para mascotas, y ChatGPT, al responder, usó el nombre de mi mascota.
No es un nombre común, y además existe una conexión con mi amigo, así que cuesta verlo como una coincidencia. Considerando que mi amigo se ha conectado a nuestro Wi-Fi, me pregunto si hay contaminación de caché o una fuga de datos de sesión.
Es una función que todavía no está lista, así que conviene desactivar la memoria, pero si tu amigo estaba usando su propia cuenta, este fenómeno es difícil de explicar.
Claude Code, al hacer scraping de documentos de la SEC, puso mi nombre y correo electrónico en el User-Agent. No hizo falta ningún prompt ingenioso, y la idea en sí no es del todo mala, pero habría preferido que me preguntara primero.
SEC_EDGAR_USER_AGENT="Your Name (name@domain.com)", así que Claude simplemente siguió las instrucciones. Quizá eso mismo sea aún más peligroso.Me pregunto cuánta gente tiene activada la memoria global que se aplica a toda la conversación. Me parece que, al final, esa memoria perjudicará la calidad de las respuestas.
Por otro lado, ayuda en esos momentos en los que no hace falta explicar extensamente el contexto cada vez.
Por eso no activo la memoria, y tampoco uso Claude Code por otros motivos. El sistema de memoria actual es demasiado rudimentario como para ser útil.