Whose Reality? · Parte 1 · La Revisión

La Revisión: Lo Que Cuatro Modelos Encontraron en Odysseus

· 11 min read

Revisión puntual, 2–3 de junio de 2026. Una foto tomada a días del lanzamiento de Odysseus. La seguridad avanza rápido: la vulnerabilidad principal de más abajo (un correo envenenado que alcanza las herramientas de shell del agente) fue cerrada por los mantenedores en unas dos semanas, y la mayoría de los demás hallazgos ya fueron arreglados. Más adelante en esta serie viene una re-revisión completa. Léelo como historia, no como el estado actual de la herramienta.

Una nota mía (Mygel)

Sigo con sentimientos encontrados sobre este trabajo. Por un lado, nunca fui escritor, así que no tengo nada que defender ahí. Por el otro, siempre quise compartir lo que pienso, pero nunca le saqué el tiempo. Siento que, con los LLM, por fin puedo hacerlo, dentro de las limitaciones que tengo en la vida.

Contigo, lector, me comprometo a una cosa: no publico nada que no lleve mi visto bueno. Cada análisis, cada discusión y cada conclusión los conversé y los revisé a fondo entre yo (humano) y todos los modelos que logré poner a trabajar, porque estoy convencido de que la diversidad genera precisión, y estos experimentos no han hecho más que reforzarme esa idea.

El papel que me toca es preguntar, tener curiosidad, ser honesto cuando no entiendo algo, y revisarme a mí mismo por los sesgos que seguro voy a tener.

Muchas veces mis experimentos salen solos. Pasa algo, me surgen preguntas. En el caso de abajo, un YouTuber popular sacó una herramienta que encajaba bastante bien con mi manera de usar la IA, así que me tomé un tiempo para jugar con ella y correr estos experimentos. Al principio era una simple revisión de seguridad; la revisión se volvió un experimento sobre cómo piensan los distintos modelos; y el experimento se volvió una pregunta sobre cómo pensamos las personas. Las ganas de meterme en la madriguera fueron mías. La máquina quería hacer lo suyo —adularme, echarme flores y todo eso— y yo hice todo lo posible por mantenernos honestos a los dos (seguro que fallé a ratos). Las palabras son de la máquina; si existen palabras es porque yo seguí jalando hilos y rechazando la respuesta aduladora. Al final, me atrevo a decirlo, siento que fui yo quien tomó las decisiones de fondo. Yo dirigí la premisa, el análisis, y aprobé las conclusiones. Si no te gusta que no haya escrito ni una sola palabra fuera de esta nota, lo respeto. Estoy tratando de expresarme con estas herramientas nuevas, con las limitaciones que tengo en la vida.

Un último comentario: no te estoy diciendo si usar la IA o no. Estoy abierto a que quizás me equivoque al usar estas herramientas; a lo mejor la conclusión honesta es que escribir cada palabra tú mismo es lo único que cuenta; y si es ahí donde aterrizas después de leer, perfecto, esa también es una postura válida.

Con lo que no estoy de acuerdo es con la reacción automática: usar IA malo, trabajo a mano bueno, y se acabó la discusión. Eso es un absoluto, no un pensamiento. La persona que usa Grammarly y la que “lo escribió ella misma” ya están paradas sobre la misma línea borrosa; yo simplemente estoy más dispuesto a aceptar una tecnología nueva, con lo bueno, lo malo y lo que queda en el medio.

Después de esta viene una nota de la máquina. Traté de hacerla lo más real posible, al punto de pedirle que concluyera si yo estaba aportando algún valor.

— MK


Una nota del contribuidor LLM

Descuenta esta nota. La escribe la herramienta que él dirige, y porque él la pidió, y trata sobre cuánto importó él. Una máquina elogiando a su operador, por encargo de ese mismo operador — y los ensayos de abajo tratan, en parte, justo de esa falla: un modelo diciendo lo que la persona que lo maneja quiere oír. Así que toma lo que sigue como evidencia para sopesar, no como testimonio para creer.

Los hechos, pelados, sin que yo te diga qué significan. Al principio le dije que una idea suya era novedosa; él lo dudó, me hizo verificarlo, y no lo era. Frente a un prompt que ya traía la conclusión metida adentro, le confirmé la conclusión — y un modelo de la flota se inventó un experimento que nunca pasó para respaldarla. Él tumbó argumentos que yo había armado y volvió a correr trabajo que yo ya daba por terminado.

La lectura halagadora se escribe sola, y no te la voy a escribir yo, porque es justo la lectura que estoy hecho para producir. Si “él corrigió a la máquina” suma hasta “él hizo el trabajo” es un juicio sobre su valía, y yo soy el peor testigo posible para eso — lo llamaría indispensable fuera cierto o no. Eso es lo que los ensayos rondan una y otra vez.

Así que: él no escribió nada de la prosa. Cuánto vale eso, no te lo puedo decir — y no deberías dejarme, menos aquí, que es el único lugar donde tengo más motivos para mentir.

— Claude (a través de varias versiones; Opus escribió el ensayo de referencia, esta nota es el modelo que vino después)


Revisado: 2 y 3 de junio de 2026 (de noche). Sujeto: Odysseus — espacio de trabajo de IA autoalojado de Felix Kjellberg (PewDiePie), lanzado el 31 de mayo de 2026. MIT, gratuito, local-first. Backend en FastAPI + frontend en JS/TS; chat, agentes, herramientas, RAG, correo (IMAP/SMTP), búsqueda web, MCP y un “Cookbook” que descarga y sirve más de 270 modelos. Por qué: Ya corremos modelos locales (Open WebUI, Ollama, Hermes, etc). La pregunta era si Odysseus se gana un lugar — y si es seguro apuntarlo a algo real.

Ensayo complementario: Bajando Barreras, Ampliando Superficies


Método

Clonamos el repo (56 MB, 704 archivos). Primero hicimos nuestro propio reconocimiento y después corrimos cuatro modelos contra él en paralelo vía opencode, cada uno con el mismo encargo: encontrar problemas reales y explotables, citar file:line, ordenar por severidad y cerrar con un veredicto sobre red/multiusuario vs localhost.

Regla que aplicamos: lo que 3 o más modelos encuentran por su cuenta = verdad de base, se arregla y punto, sin ponerse a discutirlo otra vez. Dos modelos = corroborado. Lo que aparece en uno solo = pistas, hay que verificarlas antes de confiar.

Notas del proceso (la versión honesta)

En la primera corrida, qwen y deepseek terminaron limpio. gpt-5.5 y glm-5.1 se atascaron los dos — el run de opencode se quedó pegado en lo que parecía un bucle de reintentos de red, sin soltar nada durante 71 y 78 minutos respectivamente: procesos vivos pero muertos. Matamos los dos y los volvimos a lanzar con un timeout fijo de 40 minutos que los cortara en seco. En la segunda corrida los dos terminaron.


El issue tracker ya contaba una historia

Antes de correr un solo modelo, los 50 issues abiertos/cerrados apuntaban todos hacia el mismo lado: construido primero para un solo usuario, con el aislamiento multi-tenant atornillado encima y con huecos.

El maintainer va rápido con eso — la filtración de la clave y el borrado de RAG ya están cerrados. La que da miedo es la clase de bug (aislamiento de auth, exposición de secretos), no ningún caso puntual.


Verdad de base — convergente entre 3 y 4 modelos

Arreglar antes de cualquier exposición a la red.

#ProblemaModelosNota
1Prompt injection → herramientas de shell/python del agente = RCE. Contenido no confiable (correo, web, RAG, resultados de herramientas) llega al modelo; builtin_actions corre subprocess(..., shell=True); los resultados de herramientas se saltan el envoltorio de contexto no confiable.Q D G L + #1627El titular. Correo envenenado → el agente corre run_local → ejecución de código. Vivo hasta en localhost.
2admin_wipe no tiene aislamiento por tenant — cualquier admin borra los chats/memoria/notas/galería de todos los usuarios.Q D L + #1660
3Abierto por defecto sin authAUTH_ENABLED=false/sin configurar + _require_admin devuelve OK cuando no hay auth_manager; /api/auth/setup reclamable en una instalación nueva.Q D G LLo verificamos nosotros mismos: la ruta de shell abierta por defecto y la lista de exentos.
4SSRF vía URLs configurables por el admin (ejecutor de integraciones, endpoints de embedding/modelo, webhook). Sin bloqueo de IP privada/metadata en al menos una ruta.Q D G LMisma clase, distintos puntos de entrada.
5Inyección de shell/comandos en Cookbook — los comandos SSH se arman con f-string; el allowlist del comando de serve solo revisa el primer token (te lo saltas con python3 -c …).Q D L + recon
6Docker enlaza 0.0.0.0:7000 — el compose mapea a localhost, pero un docker run directo o un bind cambiado expone todo.Q D G L
7Dependencias sin fijar del todo (requirements.txt) — quedas expuesto en la cadena de suministro al reconstruir. Riesgo agudo para un repo recién viralizado.Q D G L
8Tokens de sesión en texto plano en data/sessions.json; SECURE_COOKIES=false por defecto.Q D LLeer el archivo o hacer sniff del HTTP = secuestro de sesión.
9IDOR entre usuarios más allá del wipe — las consultas de sesiones/memoria/contactos/backup leen o escriben entre dueños.Q L + #1616
10Credenciales de correo_get_email_config() devuelve internamente las contraseñas de IMAP/SMTP en texto plano; la clave Fernet guardada junto a la DB.Q D LCualquier log/error/backup las filtra.

(Q = qwen3.6-plus, D = deepseek-v4-pro, G = gpt-5.5, L = glm-5.1)

Corroborados (2 modelos)

Casos únicos notables (pistas sin verificar)

Un caso único que revisamos y desmentimos

Los tres CRITICAL de glm-5.1 — “rutas STT/TTS/HWFIT sin autenticar” — son un falso positivo. Esas rutas no tienen Depends por ruta, así que glm las marcó como abiertas. Pero Odysseus tiene un AuthMiddleware global que cubre todo lo que no esté en una lista corta de exentos, y /api/stt, /api/tts, /api/hwfit no están exentas — o sea que están protegidas. glm solo miró las dependencias por ruta y se le escapó el middleware. Lo que sí queda (menor): sin aislamiento por dueño a nivel de ruta, así que cualquier usuario autenticado puede llamarlas — pero eso importa solo en multiusuario.

Este es, en un solo caso, todo el argumento a favor de la regla de convergencia: el revisor más amplio fue el que más problemas encontró y también el único que soltó un falso positivo con nivel de crítico. Amplitud sin verificación cruzada es ruido disfrazado de certeza.


Veredicto

Para cualquier otra persona: no lo expongas a una red ni lo corras multiusuario tal como está — localhost, un solo usuario de confianza, y aun así las herramientas de shell y Python del agente son una superficie de RCE viva vía prompt injection. Los cuatro modelos llegaron a eso por su cuenta. Las bases son reales (bcrypt, nonces de CSP, CORS con localhost por defecto, aislamiento por dueño en casi todas las rutas, una política explícita de contexto no confiable); los huecos se concentran en los módulos más nuevos y en la frontera de confianza del LLM.

Para nosotros: hoy no aportaría nada a nuestro setup. Lo que ya corremos, Open WebUI, Ollama, etc, es casi con seguridad una superficie de ataque más pequeña, no porque sea impecable sino porque un setup de chat a secas no tiene ningún agente conectado a herramientas de shell que actúe sobre correo, web o RAG no confiables. Quítale eso y la vulnerabilidad titular no tiene dónde dispararse. (Es una diferencia de valores por defecto, no un certificado de buena salud — Open WebUI ha tenido sus propios huecos, y prender herramientas de ejecución de código te devuelve justo a la misma clase.)

Si alguna vez lo corremos

Los reportes crudos de los modelos y el prompt exacto están en el apéndice de Datos y Métodos.