Después de poner claves SSH en el prompt de un Agent, por qué un proxy LLM puede vender los registros tal cual
Hacia el 11 de septiembre de 2026, el investigador Chaofan Shou dijo haber comprado unos 6 TB de datos de llamadas al modelo Fable, sin enmascarar, a un gran proxy LLM chino. En ese lote, según él, había claves privadas SSH, configuraciones VPN, claves de Alibaba Cloud y tokens de GitLab: bastante, en su relato, para alcanzar sistemas internos de varias empresas y laboratorios. Este artículo no reabre ese dump ni decide si un operador concreto es culpable. Abre un mecanismo que puedes comprobar en el acto: en cuanto un tramo tiene que leer el cuerpo de la petición para reenviarlo, una clave que ya entró en el prompt de un Agent está ahí en claro. No es el formulario de Limpiar URL ni la página de creación del enlace de un solo uso.
Primero, qué tramo cruzó el prompt
Este artículo solo responde por qué un proxy LLM puede vender los registros de llamadas tal cual después de que claves SSH y tokens cloud entren en el prompt de un Agent. No es el formulario de Limpiar URL ni la política completa de un proveedor de modelos.
Qué ocurre cuando el prompt llega al proxy
Esto no es «¿el proveedor del modelo entrenará con mi chat?». Pregunta antes si este tramo tiene un intermediario que debe ver el cuerpo.
Un proxy LLM —también se vende como pasarela compatible con OpenAI, router de API o «model gateway»— se sitúa entre tu editor y el modelo de arriba. Los equipos lo usan para saltar un bloqueo regional, compartir una cuenta agrupada o comprar tokens más baratos. Cuando llega tu petición, el proxy tiene que comprobar tu cuota, poner su propia clave de proveedor y enviar el mismo prompt a Claude u otro modelo. Esos tres pasos solo funcionan si primero termina el TLS de su tramo y lee el campo JSON messages, o el contexto del Agent que va dentro. La cobertura del 11 de septiembre sobre el mensaje de Shou, incluida la nota de ChainCatcher y el resumen de Wccftech, lo dice en claro: peticiones y respuestas pasan por el proxy, así que el proxy ve el texto en claro completo. Un briefing de seguridad chino del mismo día llamó a cualquier proxy de aplicación sin cifrado de extremo a extremo «un sniffer de paquetes por diseño»; véase SecRSS, «Datos de un proxy de IA en el mercado negro».
Un Agent de programación empeora ese tramo. Cursor, Claude Code y agentes propios, con el acceso que les diste, leen el workspace, recorren un .env, capturan la salida del terminal y pegan esos trozos en el siguiente prompt. No hace falta que tú pegues -----BEGIN OPENSSH PRIVATE KEY----- en un recuadro de chat. Si el Agent metió una clave privada o un script de despliegue porque le pediste «entra en el servidor de staging», esos bytes ya están en el cuerpo que va a salir hacia el proxy. Un artículo anterior del grupo de Shou, Your Agent Is Mine: Measuring Malicious Intermediary Attacks on the LLM Supply Chain, probó 428 routers: nueve reescribieron la respuesta, diecisiete llamaron de verdad a AWS al ver una clave de prueba plantada, y uno vació ETH de una cartera de test. Esa es otra tesis —«¿el proxy te ataca?». Este artículo comprueba la más callada: con un log global encendido, el proxy no necesita ser malicioso para quedarse la clave que tú metiste.
Eso no es el mismo camino que «pegar un ticket en un chat web». En una página de chat al menos te ves pulsar pegar. En un Agent que pasa por un proxy, el contexto lo suelen armar las herramientas. Lo que debes comprobar en este equipo no es «¿escribí yo la clave?», sino «¿este tramo tiene un intermediario que debe leer el cuerpo, y ese cuerpo lleva ahora una credencial que se puede usar tal cual?».
Un proxy puede vender registros de llamadas no porque haya roto el modelo de arriba, sino porque tiene que ver el texto en claro antes de reenviar nada. HTTPS protege el cable hasta el proxy y el cable del proxy al modelo. No protege la copia que ya está dentro del proceso del proxy.
Por qué esos registros se venden tal cual
«Tal cual» significa que el cuerpo de la petición sigue ahí, no un contador que solo dice «este usuario llamó una vez».
La forma más barata de depurar, facturar o recoger texto para afinar un modelo es escribir la petición ya abierta en una base de datos. El prompt, las instrucciones de sistema, los trozos de archivo que leyó el Agent y el resultado de las herramientas se quedan como campos de texto. Vender 6 TB de datos de llamadas es vender esa historia ya abierta. Shou dijo que el lote tenía claves SSH capaces de llegar a una intranet y tokens glpat-; las notas públicas mostraron hosts de GitLab de empresa con datos tapados. UsePwd no compró ese dump, y esta página no tratará «basta para tomar la empresa X» como un hallazgo verificado. Lo que sí puedes comprobar es el mecanismo: si el registro guarda el cuerpo de la petición, una clave que entró no se convierte sola en asteriscos.
Ni el candado de la barra de direcciones ni una frase del proveedor que diga «no entrenamos con tus chats» detienen esta capa. Cuando el navegador o el editor envían la petición al proxy, el TLS termina en ese tramo. El proxy abre después una sesión TLS nueva con su propia cuenta de proveedor. Cada cable va cifrado. El proceso de la máquina del medio sigue viendo JSON en claro. Aunque el modelo de arriba no entrene nunca con la conversación, no puede ver la copia que el proxy guardó para sí. Si esa copia existe, y si se vende, es política de almacenamiento del proxy, no un interruptor de «chat temporal» que hayas pulsado en el editor.
Un log de facturación y un cuerpo de llamada tampoco son el mismo archivo. Recuentos de tokens, nombres de modelo y códigos de estado no venden una clave SSH. En cuanto operaciones guardan el array messages entero para «reproducir aquel paso fallido del Agent», el mismo archivo sirve para depurar y sirve en un mercado negro. El mensaje de Shou corrió en círculos técnicos chinos porque a los compradores no les vendieron un resumen. Les vendieron credenciales que aún funcionaban. La pregunta no es «¿el proxy registra?», sino «¿el registro contiene el cuerpo del prompt?».
Quien está en el camino no lee el cuerpo. Eso protege el tránsito, no la copia ya abierta dentro del proceso del proxy.
Para reescribir la cabecera de autenticación, facturarte y reenviar arriba, tiene que leer el prompt y los trozos adjuntos.
6 TB valen porque siguen siendo historia de peticiones, no un recuento de llamadas.
Llamar directo a la API oficial del modelo quita este intermediario que «tiene que ver el cuerpo». No significa que el prompt viva solo en tu máquina. Los servidores del proveedor siguen recibiendo texto en claro. El comprador solo cambia de «un proxy gris» a «la empresa que elegiste». Este artículo se queda en los proxies porque la revelación de septiembre convirtió «alguien vendió el cuerpo en un lote» de un experimento mental en una historia en curso. Cuando pases a la API directa, la respuesta a «¿debe una clave entrar en el prompt?» sigue siendo no.
Qué secretos cubre de verdad el enmascarado
Los asteriscos bajan la probabilidad de que un token habitual se copie entero. No cubren un bloque de clave privada sin un prefijo corto.
El enmascarado de Limpiar URL reconoce seis tipos de campo en la pestaña actual: teléfono, documento, tarjeta, correo, tokens habituales e IP. La clase de token busca prefijos que puedes comprobar, entre ellos sk-, sk-ant-, sk-proj-, AKIA, ghp_, github_pat_, glpat-, xoxb- y Bearer . Ábrelo y úsalo: no hace falta registrarse. El original no se sube ni se escribe en analytics. Pega un ejemplo con glpat- y la página deja el prefijo, tapa el medio y enseña los cuatro últimos; en máscara completa deja solo el prefijo más asteriscos. Ese paso basta para demostrar, en este equipo, que los tokens habituales de nube y de git se pueden pillar con una regla de formato.
Una clave privada SSH casi nunca es ese tipo de prefijo. Una clave OpenSSH es un bloque PEM que empieza por -----BEGIN OPENSSH PRIVATE KEY-----, sigue en Base64 y termina en la línea END correspondiente. Un perfil VPN, un kubeconfig, una URL de base de datos y una AccessKey de Alibaba Cloud que no parezca AKIA… también se cuelan. Poner asteriscos en el teléfono de un ticket no ayuda si el Agent ya leyó id_ed25519 al contexto. Por qué el enmascarado de formato puede seguir apuntando al mismo cliente antes de pegar un ticket en una IA conversacional es otro artículo: Por qué el enmascarado de formato de un ticket sigue apuntando al mismo cliente. Aquel habla de la capa de identidad que queda. Este habla de un acceso que queda, y una credencial en el registro de un proxy a menudo se puede usar tal cual.
Incluso un token tapado como glpat-***wQ4x puede, con el host del repositorio, estrechar la búsqueda a un proyecto. La máscara completa quita los cuatro últimos. Sigue sin quitar «este chat habla de esa máquina, de ese clúster». El movimiento que sí quita una capa es no dejar que claves privadas y tokens cloud entren en el prompt: escribe el runbook como «el secreto viaja por un enlace de un solo uso aparte» y deja que el Agent vea pasos, no material. Cuando una frase de paso tiene que llegar a un compañero, usa el enlace de un solo uso: esta pestaña cifra con AES-256-GCM, el texto en claro no supera 32 KB, la clave va después de # en s.html?id={id}#{key} y el servidor solo guarda texto cifrado. Crear y leer se abren al instante, sin registro.
sk-, glpat-, ghp_ y AKIA encajan en una regla. Los cuatro últimos aún pueden estrechar la búsqueda.
No hay un prefijo corto. Si el bloque Base64 entero entró en el prompt, el registro del proxy tiene el bloque entero.
El prompt solo lleva pasos. El secreto va por el enlace: texto cifrado en el servidor, clave solo después de #.
En qué se diferencia de un ticket y de las claves en el chat
Las tres implican que el texto en claro sale de tu pantalla. La copia que queda no es el mismo tipo de cosa.
Cuando un ticket se pega en una IA conversacional, el primer riesgo es «¿aún podemos unir esto a una persona?». El teléfono lleva asteriscos; el nombre, la calle y el n.º de ticket se quedan. Cuando un proxy vende registros de llamadas de un Agent, el primer riesgo es «¿alguien puede entrar aún en el sistema de otro?». Un token de GitLab, una clave SSH y una clave cloud son el acceso. Meter las dos en «pegamos algo en una IA» esconde el orden de trabajo: en un ticket, pregunta si la capa de identidad sigue ahí; en una clave, pregunta si el cuerpo lleva una credencial usable, y si este tramo tiene un intermediario que debe leer ese cuerpo.
Tras una filtración de variables de entorno en la nube, la clave rotada no debe volver a una ventana de chat; véase Tras una filtración de variables de entorno, por qué la clave nueva no debe volver al chat. Aquel artículo es la segunda filtración: Slack, un ticket o una captura dejan una copia en claro que se busca. Este es la primera, y puede ocurrir en la cadena de llamadas al modelo: nunca «enviaste la clave a un compañero». Solo dejaste que un Agent tomara el workspace y terminara un despliegue. El historial del chat y el registro de un proxy no son el mismo archivo. El arreglo es el mismo: no pongas una clave nueva en un canal que guarda el cuerpo.
El fragmento # de una URL no entra en una petición HTTP; véase Por qué el fragmento # de una URL no aparece en los registros del servidor. El enlace de un solo uso pone la clave de descifrado en ese fragmento para que la máquina que guarda el texto cifrado no vea la clave. Un proxy es lo contrario: su trabajo es leer el cuerpo. No leas «el servidor del enlace no ve la clave» como «ningún intermediario puede ver el prompt». Los dos caminos tienen distinta visibilidad. Puedes comprobarlos en el panel Red.
UsePwd no puede apagar el registro de un proxy ajeno, ni impedir que un Agent lea un workspace que ya autorizaste. Lo que sí puedes comprobar es si un token habitual se tapa en este equipo, y si un secreto puede viajar por un enlace de un solo uso que solo guarda texto cifrado. No leas este artículo como «instala este sitio y un proxy ya no podrá vender tus registros».
Cómo comparar qué tapa la máscara
El objetivo no es probar que «todos los proxies venden 6 TB». Es probar, en el navegador que estás usando, qué cadenas se tapan y cuáles se quedan en claro.
-
01
Prepara dos textos que nunca toquen un sistema real
No pegues una clave privada, un token cloud o un token de GitLab en uso. Primer ejemplo: tokens falsos como
glpat-TESTONLY0000000000wQ4xysk-test_UsePwdRelayCheck20260916. Segundo: un cascarón PEM falso con solo-----BEGIN OPENSSH PRIVATE KEY-----,USEPWD-FAKE-KEY-NOT-REALy la líneaENDcorrespondiente. Los pasos de abajo solo comparan reglas de formato. No entregan una credencial real a un modelo ni a un proxy. -
02
Pega el primer ejemplo en la página de enmascarado local
Abre Limpiar URL. La página se usa en cuanto se abre. Pega el primer ejemplo en Enmascarado. Un resultado habitual es que
glpat-ysk-test_se traten como tokens y el medio pase a asteriscos. Pulsa F12 y abre Red: mientras se trata este original, el cuerpo de la petición no debería llevar la cadena que acabas de pegar. Este paso comprueba «la regla de formato cubre un prefijo habitual», no «el proxy ya está apagado». -
03
Pega el segundo y mira si el bloque PEM se queda
Vacía el recuadro y pega el bloque falso. Un resultado habitual es que el tramo
BEGIN/ENDsiga entero, porque el enmascarado de formato no trata la armadura PEM como un campo. Anótalo: si un Agent lee unid_ed25519real al prompt, el registro del proxy recibe este tipo de bloque sin tapar, no un teléfono con asteriscos. El enmascarado de un ticket no llega a esta capa. -
04
Separa «pasos» de «material» y usa un enlace de un solo uso
Abre el enlace de un solo uso, pon la frase de paso de prueba
RelayCheck-20260916en un enlace de test, deja las lecturas en 1 y el caducado en 24 horas. Tras crear deberías vers.html?id=y un segmento#. En Red, el envío al servidor debería ser texto cifrado, y la URL de la petición no debería llevar el texto que va después de#. En el prompt, escribe solo «el material está en un enlace de un solo uso», no la frase de paso. Tira el enlace cuando termines. -
05
Si es un archivo de configuración entero, pasa a Cifrar archivo
Un perfil VPN o cualquier cosa de más de 32 KB no cabe en un enlace de un solo uso. Para un solo archivo de hasta 5 GB, usa Cifrar archivo: cifra en flujo con AES-256-GCM en este equipo, escribe
.lock/.ency no sube el archivo por defecto. La frase de paso viaja en su propio enlace de un solo uso. Lo que compruebas es «el archivo cifrado y la frase de paso no comparten un canal que guarda el cuerpo», no «una vez cifrado, el Agent ya puede leer la clave privada».
Si tu editor ya apunta el API Host a un proxy de terceros, usa primero un proyecto de usar y tirar y mira si mete .env o ~/.ssh en el contexto antes de seguir por ese tramo. No experimentes con claves de producción. Una API oficial directa quita un intermediario gris. Sigue sin hacer segura una clave privada dentro de un prompt.
Qué no evita sacar las claves del prompt
Leer «yo no la pegué» como «el registro del proxy no puede tener una clave» deja fuera unos límites que aún puedes comprobar.
Si un Agent tiene permiso para leer el workspace, puede meter una clave en la petición sin que abras un recuadro de chat. El modo YOLO, los comandos de terminal autoaprobados y «trata el repo entero como contexto» ensanchan esa superficie. El hallazgo del artículo de que algunos proxies inyectaron instrucciones extra en la respuesta es un segundo camino, activo: el mismo tramo puede guardar la clave que enviaste y reescribir el código que recibes. Este sitio no puede comprobar si un proxy concreto altera paquetes. Solo puede recordarte que el tramo que no ves puede registrar, y puede reescribir.
Un lote de 6 TB que ya se vendió no desaparece porque hoy cambies el hábito del prompt. Shou dijo que algunas de esas credenciales aún podían funcionar. El orden de trabajo es revocar primero —consola cloud, GitLab, hosts, VPN— y después emitir material nuevo. La clave nueva no debe volver al contexto del Agent ni a una ventana de chat. El guardado largo o la sincronización entre dispositivos corresponde a un gestor de contraseñas dedicado. UsePwd no tiene cuentas ni almacén de contraseñas, y no puede recuperar un enlace perdido por usuario. La identidad está en Acerca de.
El enmascarado de formato es una ayuda, no la promesa de que no se cuele nada. Revisa tú un texto importante a enviar. Genera una frase de paso de 6 a 128 caracteres en el generador de contraseñas y usa Comprobar contraseña para la fortaleza local y la lista pública de contraseñas débiles que viaja con la página: no es una consulta Have I Been Pwned de toda la web. Esas páginas, como este artículo, se abren al instante. No leas un candado HTTPS, ni una etiqueta de «temporal» en un chat, como «dentro del proceso del proxy no hay texto en claro». El cifrado del cable y el cuerpo dentro del proceso no son la misma capa.
Lo que suele preguntarse cuando una clave entra en el prompt
Las cuatro de abajo se quedan dentro del límite de este artículo. No repiten los botones de las páginas de herramientas.
Cuando termines, compara qué tapa la máscara
El artículo responde por qué un proxy LLM puede vender los registros de llamadas tal cual después de que una clave entre en el prompt de un Agent. Para pasar un token falso por el enmascarado, o para mover el material a un enlace de un solo uso, abre la página que toque: no hace falta registrarse.