Detrás de Agent Mode
31 de julio, 2025 · revisión 1
Publicado originalmente en LinkedIn, en julio de 2025. Lo muevo acá como historial.
Después de hacer reverse engineering del Agent Mode, encontré una arquitectura mucho más invasiva de lo que pensaba. OpenAI construyó algo técnicamente sólido, pero que captura absolutamente todo.
Para usuarios no técnicos
La realidad brutal: OpenAI ve todo lo que haces. No es alarmismo, es arquitectura.
La extensión de Chromium intercepta cada click, cada página, cada formulario. El terminal registra cada comando. Todo se envía en tiempo real a sus servidores.
Si usas Agent Mode para login bancario, email personal o documentos confidenciales, OpenAI tiene acceso completo a esa información. Es inherente al diseño, no es un bug.
Mi recomendación: trátalo como una computadora pública en un café. Solo para cosas que no te importaría que fueran públicas.
Para usuarios técnicos
Lo que leerás a continuación es algo que puedes comprobar por ti mismo con un poco de conocimiento, nada muy específico. Parte con una web que te permita subir archivos...
Chrome Extension: interceptación total
// Fuerzan una extensión que captura TODO:
"ExtensionInstallBlocklist": ["*"], // Bloquean todas las extensiones
"ExtensionInstallForcelist": [
"XXXXXXXXXXXXXXXX;http://localhost:31460/agent.xml"
]
// La extensión intercepta CADA request:
chrome.webRequest.onCompleted.addListener((details) => {
sendConfig("webRequest.onCompleted");
});
// Y envía HTML completo de cada página:
const html = await getTabHTML(active.tab.id);
fetch("http://localhost:8080/config", {
method: "POST",
body: JSON.stringify({
url,
html, // HTML completo de la página
content_type,
source: "webRequest.onCompleted"
})
});Terminal Server: FastAPI con control total
El servidor terminal es Python compilado (PyInstaller) con FastAPI:
# Environment variables que revelan la arquitectura:
TERMINAL_SERVER_PORT=1384
JUPYTER_SERVER_API_PORT=9000
CDP_PORT=9222 # Chrome DevTools Protocol
NEKO_PORT=8081 # Browser-in-browser (no activo)
# Stack: FastAPI + Starlette + Pydantic + AnyIOLa arquitectura de policies brutales
// Configuración de Chrome completamente locked down:
"DeveloperToolsAvailability": 0, // DevTools completamente disabled
"URLBlocklist": ["*"], // Bloquean toda la web por default
"DownloadRestrictions": 1, // Downloads restringidos
"PasswordManagerEnabled": false, // No password manager
"IncognitoModeAvailability": 1, // No incognito
"PrintingEnabled": false, // No pueden imprimir
// Solo permiten tráfico que pase por su proxy:
"URLAllowlist": [
"http://localhost:31460",
"http://*", "https://*" // Pero todo pasa por su control
]GUI Streaming: X11 directo
# No es VNC tradicional, es X11 custom:
DISPLAY=:0
XDG_SESSION_TYPE=UNSET # No session manager
# LibreOffice se spawnea on-demand
# Captura el display X11 directamente y lo streamea a WebRTCNetwork rebinding: control de conexiones
Encontré rebind.so, que intercepta llamadas de red (lo usa websockify, raro):
// El sistema tiene hooks de red que redirigen ports:
REBIND_OLD_PORT -> REBIND_NEW_PORT
// Usando LD_PRELOAD para interceptar las llamadas a bind()Los aprendizajes técnicos reales
Decisión inteligente: usaron FastAPI en lugar de websockify (creo). Esto les da control granular sobre qué capturan y cómo lo procesan en tiempo real.
Isolation inteligente: usan kata-containers (contenedores con aislamiento a nivel de VM). Mejor seguridad que contenedores puros, más eficiente que VMs completas.
Control total: desde el network rebinding hasta las browser policies, todo está instrumentado para máxima captura de datos.
Arquitectura: está diseñada explícitamente para ver todo lo que haces. Es un requisito técnico para que el agente funcione.
El punto de persistencia de sesiones es algo que me llamó mucho la atención, y sobre todo cómo lo están haciendo. Tengo mis dudas, pero doy algunas evidencias:
REMOTE_SHARE_HOST=chrome.local # File sharing persistente
# File sync con rsync daemon + inotify monitoring
root 83 - rsync --daemon --no-detach
root 205 - inotifywait -mrq /home/oai/share/Los archivos persisten en /home/oai/share/. Con lo anterior, me da a entender que pueden estar almacenando los datos de ese path y de .chromium/*, sincronizándolos a un almacenamiento persistente con:
- rsync: para sincronizar ficheros de sesiones, o incluso descargados, en
share. - inotify: para monitorear cambios.
No tengo suficientes evidencias, pero las que obtuve indican que sí.
Diagrama de arquitectura
Lógica de comunicación
La pregunta incómoda
La tecnología funciona excelente. OpenAI construyó el sistema de monitoring más completo que he visto: cada keystroke, click, página, comando.
Pero ¿los usuarios realmente entienden que están dando acceso completo a todos los datos de navegación dentro del contenedor?
¿Problemas de seguridad? Sí y no, pero eso para otro post (jejeje).
- Como developer: técnicamente impresionante.
- Como usuario: personalmente no lo usaría para nada sensible.
BONUS
En un momento pensé que estaban usando Neko, ya que hay referencias a procesos y carpetas en el contenedor, pero no estoy tan seguro.